Skip to content

Compiling

GKenn edited this page Jul 23, 2021 · 15 revisions

Prerequisites

  • note -

    • Maven 3.3.9 or later is required for successful builds with current jssc branch
    • Cmake 3.0 or later is required for successful builds with current jssc branch
  • JDK7+

  • C++

    • Linux: gcc, clang or equivalent
    • macOS: XCode with Command Line Utilities
    • Windows: Microsoft Visual C++ or mingw-w64
  • Maven, CMake

    • Linux: `sudo apt install maven cmake g++'
  • the following packages are required for non native/cross compiling -
    'mingw-w64 g++-mingw-w64-i686 g++-arm-linux-gnueabihf g++-aarch64-linux-gnu g++-powerpc64le-linux-gnu'

    • macOS: brew install maven cmake
    • Windows:
      • Manually install Maven from https://maven.apache.org/, adding mvn.bat directory to your %PATH%
      • Manually install CMake from https://cmake.org/download/, adding cmake.exe directory to your %PATH%
      • Please note that if using Visual Studio 2019 (Full IDE) or Build Tools for Visual Studio 2019 (Command Line Only) you will need to add the 'MSVC v142 - VS 2019 C++ ARM64 build tool under 'Individual Components' from the Installer Master menu for ARM64 binary compilation in Windows - preferably the latest version (currently compiled with v14.28-16.8 as of wiki update)
      • Please also note that you will need the Visual Studio to be initialized using vcvarsall in _ notation:

    VsDevCmd x86_64

    "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat" x64

    VsDevCmd x86

    "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat" x64_x86

    VsDevCmd aarch64

    "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat" x64_arm64

Steps

mvn             # compile for current system
mvn -P x86_64   # cross-compile using multi-lib for 64-bit x86/amd64 Linux/Unix 
mvn -P ppc64    # cross-compile using multi-lib for PowerPC Linux/Unix
mvn -P armhf    # cross-compile using multi-lib for arm 32 bit hard floating point Linux/Unix
mvn -P aarch64  # cross-compile using multi-lib for arm64 based on current host os (Linux/Unix,
  ```

* **Important:** Call `mvn clean` between different compiler profiles.
* **Note:** For other cross-compilation profiles or platforms search for `CMAKE_TOOLCHAIN_FILE` in `pom.xml`.  Each has a respective CMake toolchain file.
* Prefer to skip maven? The project is configured to allow calling `cmake -DCMAKE_TOOLCHAIN_FILE=<...>` directly but the `javah` generated header file must be present.

### Package
Without recompiling native libraries
```bash
mvn -P package,jar-with-dependencies

Advanced

machine-dependent artefact

The build will output two .jar files in the target/ directory. One archive, which is build by the maven-jar-plugin, has a classifier which maches the machine's classifier (unless you are doing a cross-compile). This one will contain a freshly compiled library, like libjssc.so for Linux or a jssc.dll if you are on Windows. They go into a directory /natives/os_bitness.

»Uber-jar« artefact

The other .jar artifact which is generated by the build doesn't use the library compiled by cmake. It uses the checked-in libraries form the directory src/main/resources-precompiled/natives/. This jar is the artefact we are going to publish to maven central. It will contain a broader varieties of OSes and architectures in just one .jar file, but the libraries checked in into this git repository need to stay updated.

Creating just the »uber-jar« artefact

If you do not need a freshly compiled library, you can just execute mvn package -P package to skip the cmake compilation and the unit tests.

Clone this wiki locally