<!--- Licensed to the Apache Software Foundation (ASF) under one -->
<!--- or more contributor license agreements.  See the NOTICE file -->
<!--- distributed with this work for additional information -->
<!--- regarding copyright ownership.  The ASF licenses this file -->
<!--- to you under the Apache License, Version 2.0 (the -->
<!--- "License"); you may not use this file except in compliance -->
<!--- with the License.  You may obtain a copy of the License at -->

<!---   http://www.apache.org/licenses/LICENSE-2.0 -->

<!--- Unless required by applicable law or agreed to in writing, -->
<!--- software distributed under the License is distributed on an -->
<!--- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -->
<!--- KIND, either express or implied.  See the License for the -->
<!--- specific language governing permissions and limitations -->
<!--- under the License. -->

# Development Tips

## Set up the Project
### Step 1. Obtain MXNet Library
The first step is to obtain the mxnet library. We recommend you build it from source. Also, you can download the library 
from 
#### Build from source
Refer to [Build From Source](https://mxnet.apache.org/get_started/build_from_source#building-mxnet)   
For MacOS users:
- Prepare  
```shell
# Install OS X Developer Tools
$ xcode-select --install

# Install Homebrew
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

# Install dependencies
$ brew install cmake ninja ccache opencv
```
- Clone 3rd party projects
```shell
# Clone 3rd dependency for mxnet. It's necessary
$ git submodule update --init --recursive
```
- Build MXNet  
```shell
# select and copy cmake configure files for macos
$ cp config/darwin.cmake config.cmake

# create build directory for prpject
$ mkdir build; cd build

# cmake
$ cmake  ..
$ cmake --build .
```
Libraries will be generated under the directory _build/_.

For Linux users:  
Docker might help you build libraries on different platforms. You can get help from [README for CI](../ci/README.md).  
For example, you can build mxnet on Ubuntu with  by the following command.  
```shell
$ python3 ci/build.py -p ubuntu_cpu
```
##### Download Pre-built library
You can find the mxnet library from installed packages for mxnet, like python module. However, mxnet 2.0 is not released
yet, that's why we recommend you build it from source.  
```shell
# download python module for mxnet (have to mention that mxnet 2.0 hasn't been released by now)
$ pip3 install  mxnet==1.7.0.post2
# find the location of the installed module
$ python
Python 3.6.8 |Anaconda, Inc.| (default, Dec 29 2018, 19:04:46)
>>> import mxnet
>>> mxnet
<module 'mxnet' from '/Users/xxx/anaconda3/lib/python3.6/site-packages/mxnet/__init__.py'>
>>> quit()
# you can locate the module under /Users/xxx/anaconda3/lib/python3.6/site-packages/mxnet/
$ ls /Users/xxx/anaconda3/lib/python3.6/site-packages/mxnet/ | grep libmxnet
libmxnet.dylib
```
The compiled library is the file with the name of _libmxnet.*_. For MacOS, you will receive the file with suffix 
_.dylib_; For Linux, the lib file have the suffix ".so"; For Windows, the suffix is "." 

### Step 2. Build MXNet Native Lib for Java
The project uses gradle to manage dependencies. You can build the project using gradle. We have to encapsulate the mxnet
library into a jar file so that we can load it into JVM.
```shell
$ cd java-package
# Build the project
$ ./gradlew build 
# Create gradle tasks to package mxnet library into jar
# The task name is in this form {$favor}-{$platform}Jar
# MacOS -> mkl-osxJar
# Linux -> mkl-linuxJar
# Windows -> mkl-winJar
$ ./gradlew :native:buildLocalLibraryJarDefault
# Build native lib for macos
$ ./gradlew mkl-osxJar
# Check the lib for osx
$ ls native/build/libs | grep osx
native-2.0.0-SNAPSHOT-osx-x86_64.jar
```
The jar file _native-2.0.0-SNAPSHOT-osx-x86_64.jar_ is the output lib file. 

### Step 3. Run Integration Test
When we execute the task for integration test, the built mxnet native lib will be added into classpath automatically. 
```shell
$ ./gradlew :integration:run

```