diff --git a/README.md b/README.md
index 04fbb5c..661c6ac 100644
--- a/README.md
+++ b/README.md
@@ -244,9 +244,13 @@ Dear ImGui by default uses a stb_strutype library to render a fonts atlas. It's
* Read [javadoc](https://javadoc.io/doc/io.imgui.java/binding) and sources comments to get more info.
## How to Build
-To build native libraries you should install `mingw-w64` and `ant`. Modify [GenerateLibs](https://github.com/SpaiR/imgui-java/blob/master/buildSrc/src/main/groovy/imgui/generate/GenerateLibs.groovy)
-to build specific binaries you need. After you've configured everything, run `gradlew :imgui-binding:generateLibs`.
-That will build native libraries and place them in `imgui-binding/build/libsNative` folder.
+To build native libraries you need:
+ - Unix-like system (MacOS to build natives for Mac)
+ - Installed dependencies: `mingw-w64`, `ant`, `freetype2`
+
+After you've configured everything, run `gradlew :imgui-binding:generateLibs -Denvs=${envShortcut} -Dlocal`.
+`envShortcut` could be `win32`, `win64`, `linux32`, `linux64` or `mac64`.
+`-Dlocal` is optional and means that natives will be built under the `./imgui-binding/build/` folder. Otherwise `/tmp/imgui` folder will be used.
## Credits
Binding partly based on the work of [xpenatan](https://github.com/xpenatan) and his version [jDear-imgui](https://github.com/xpenatan/jDear-imgui).
diff --git a/buildSrc/scripts/build-natives-linux64-local.sh b/buildSrc/scripts/build-natives-linux64-local.sh
new file mode 100644
index 0000000..27d2286
--- /dev/null
+++ b/buildSrc/scripts/build-natives-linux64-local.sh
@@ -0,0 +1,7 @@
+#!/bin/bash
+
+BASEDIR=$(dirname "$0")
+cd $BASEDIR/../../imgui-binding || exit
+
+../gradlew clean generateLibs -Denvs=linux64 -Dlocal
+rm -frd libsNative
diff --git a/buildSrc/scripts/build-natives-mac64.sh b/buildSrc/scripts/build-natives-mac64.sh
new file mode 100644
index 0000000..e6f7888
--- /dev/null
+++ b/buildSrc/scripts/build-natives-mac64.sh
@@ -0,0 +1,7 @@
+#!/bin/bash
+
+BASEDIR=$(dirname "$0")
+cd $BASEDIR/../../imgui-binding || exit
+
+rm -frd /tmp/imgui
+../gradlew clean generateLibs -Denvs=mac64
diff --git a/buildSrc/scripts/build-natives-win_linux.sh b/buildSrc/scripts/build-natives-win_linux.sh
new file mode 100644
index 0000000..dcc63fd
--- /dev/null
+++ b/buildSrc/scripts/build-natives-win_linux.sh
@@ -0,0 +1,7 @@
+#!/bin/bash
+
+BASEDIR=$(dirname "$0")
+cd $BASEDIR/../../imgui-binding || exit
+
+rm -frd /tmp/imgui
+../gradlew clean generateLibs -Denvs=win32,win64,linux32,linux64
diff --git a/buildSrc/scripts/copy-natives-mac64.sh b/buildSrc/scripts/copy-natives-mac64.sh
new file mode 100644
index 0000000..63d6cbb
--- /dev/null
+++ b/buildSrc/scripts/copy-natives-mac64.sh
@@ -0,0 +1,6 @@
+#!/bin/bash
+
+BASEDIR=$(dirname "$0")
+cd $BASEDIR/../.. || exit
+
+cp /tmp/imgui/libsNative/macosx64/libimgui-java64.dylib ./bin
diff --git a/buildSrc/scripts/copy-natives-win_linux.sh b/buildSrc/scripts/copy-natives-win_linux.sh
new file mode 100644
index 0000000..58807a8
--- /dev/null
+++ b/buildSrc/scripts/copy-natives-win_linux.sh
@@ -0,0 +1,9 @@
+#!/bin/bash
+
+BASEDIR=$(dirname "$0")
+cd $BASEDIR/../.. || exit
+
+cp /tmp/imgui/libsNative/windows32/imgui-java.dll ./bin
+cp /tmp/imgui/libsNative/windows64/imgui-java64.dll ./bin
+cp /tmp/imgui/libsNative/linux32/libimgui-java.so ./bin
+cp /tmp/imgui/libsNative/linux64/libimgui-java64.so ./bin
diff --git a/buildSrc/src/main/groovy/imgui/generate/GenerateLibs.groovy b/buildSrc/src/main/groovy/imgui/generate/GenerateLibs.groovy
index 9229aa5..c7e90bc 100644
--- a/buildSrc/src/main/groovy/imgui/generate/GenerateLibs.groovy
+++ b/buildSrc/src/main/groovy/imgui/generate/GenerateLibs.groovy
@@ -8,12 +8,21 @@ import org.gradle.api.tasks.TaskAction
@CompileStatic
class GenerateLibs extends DefaultTask {
- String description = 'Generates native libraries using classes under ":imgui-binding" and Dear-ImGui itself from "imgui" submodule.'
+ String description = 'Generates native libraries using classes under ":imgui-binding" and Dear ImGui itself from "imgui" submodule.'
+
+ private final String[] buildEnvs = System.getProperty('envs')?.split(',')
+ private final boolean forWin32 = buildEnvs?.contains('win32')
+ private final boolean forWin64 = buildEnvs?.contains('win64')
+ private final boolean forLinux32 = buildEnvs?.contains('linux32')
+ private final boolean forLinux64 = buildEnvs?.contains('linux64')
+ private final boolean forMac64 = buildEnvs?.contains('mac64')
+
+ private final boolean isLocal = System.properties.containsKey("local")
private final String sourceDir = project.file('src/main/java')
private final String classpath = project.file('build/classes/java/main')
- private final String jniDir = project.buildDir.path + '/jni'
- private final String tmpFolder = project.buildDir.path + '/tmp'
+ private final String jniDir = (isLocal ? project.buildDir.path : '/tmp/imgui') + '/jni'
+ private final String tmpFolder = (isLocal ? project.buildDir.path : '/tmp/imgui') + '/tmp'
private final String libsFolder = 'libsNative'
@TaskAction
@@ -31,41 +40,60 @@ class GenerateLibs extends DefaultTask {
// Generate platform dependant ant configs and header files
def buildConfig = new BuildConfig('imgui-java', tmpFolder, libsFolder, jniDir)
+ def buildTargets = [] as BuildTarget[]
- def win32 = BuildTarget.newDefaultTarget(BuildTarget.TargetOs.Windows, false)
- def win64 = BuildTarget.newDefaultTarget(BuildTarget.TargetOs.Windows, true)
+ if (forWin32) {
+ def win32 = BuildTarget.newDefaultTarget(BuildTarget.TargetOs.Windows, false)
+ win32.cppFlags += ' -fstack-protector -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/harfbuzz -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include'
+ win32.libraries += '-lfreetype -lbz2 -lssp'
+ buildTargets += win32
+ }
+ if (forWin64) {
+ def win64 = BuildTarget.newDefaultTarget(BuildTarget.TargetOs.Windows, true)
+ win64.cppFlags += ' -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/harfbuzz -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include'
+ win64.libraries += '-lfreetype -lbz2 -lssp'
+ buildTargets += win64
+ }
- def linux32 = BuildTarget.newDefaultTarget(BuildTarget.TargetOs.Linux, false)
- def linux64 = BuildTarget.newDefaultTarget(BuildTarget.TargetOs.Linux, true)
+ if (forLinux32) {
+ def linux32 = BuildTarget.newDefaultTarget(BuildTarget.TargetOs.Linux, false)
+ linux32.cppFlags += ' -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/harfbuzz -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include'
+ linux32.linkerFlags += ' -lfreetype'
+ buildTargets += linux32
+ }
+ if (forLinux64) {
+ def linux64 = BuildTarget.newDefaultTarget(BuildTarget.TargetOs.Linux, true)
+ linux64.cppFlags += ' -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/harfbuzz -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include'
+ linux64.linkerFlags += ' -lfreetype'
+ buildTargets += linux64
+ }
- def mac64 = BuildTarget.newDefaultTarget(BuildTarget.TargetOs.MacOsX, true)
- mac64.cppFlags += " -stdlib=libc++"
- mac64.cppFlags = mac64.cppFlags.replaceAll("10.5", "10.9")
- mac64.linkerFlags = mac64.linkerFlags.replaceAll("10.5", "10.9")
+ if (forMac64) {
+ def mac64 = BuildTarget.newDefaultTarget(BuildTarget.TargetOs.MacOsX, true)
+ mac64.cppFlags += ' -stdlib=libc++'
+ mac64.cppFlags = mac64.cppFlags.replaceAll('10.5', '10.9')
+ mac64.linkerFlags = mac64.linkerFlags.replaceAll('10.5', '10.9')
+ mac64.cppFlags += ' -I/usr/local/include/freetype2 -I/usr/local/include/libpng16 -I/usr/local/include/harfbuzz -I/usr/local/include/glib-2.0 -I/usr/local/lib/glib-2.0/include'
+ mac64.linkerFlags += ' -lfreetype'
+ buildTargets += mac64
+ }
- // Freetype Deps Config
- win32.cppFlags += " -fstack-protector -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/harfbuzz -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include"
- win32.libraries += "-lfreetype -lbz2 -lssp"
- win64.cppFlags += " -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/harfbuzz -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include"
- win64.libraries += "-lfreetype -lbz2 -lssp"
- linux32.cppFlags += " -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/harfbuzz -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include"
- linux32.linkerFlags += " -lfreetype"
- linux64.cppFlags += " -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/harfbuzz -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include"
- linux64.linkerFlags += " -lfreetype"
- mac64.cppFlags += " -I/usr/local/include/freetype2 -I/usr/local/include/libpng16 -I/usr/local/include/harfbuzz -I/usr/local/include/glib-2.0 -I/usr/local/lib/glib-2.0/include"
- mac64.linkerFlags += " -lfreetype"
- // End
-
- new AntScriptGenerator().generate(buildConfig, win32, win64, linux32, linux64, mac64)
+ new AntScriptGenerator().generate(buildConfig, buildTargets)
// Generate native libraries
// Comment/uncomment lines with OS you need.
- BuildExecutor.executeAnt(jniDir + '/build-windows32.xml', '-v', '-Dhas-compiler=true', '-Drelease=true', 'clean', 'postcompile')
- BuildExecutor.executeAnt(jniDir + '/build-windows64.xml', '-v', '-Dhas-compiler=true', '-Drelease=true', 'clean', 'postcompile')
- BuildExecutor.executeAnt(jniDir + '/build-linux32.xml', '-v', '-Dhas-compiler=true', '-Drelease=true', 'clean', 'postcompile')
- BuildExecutor.executeAnt(jniDir + '/build-linux64.xml', '-v', '-Dhas-compiler=true', '-Drelease=true', 'clean', 'postcompile')
- BuildExecutor.executeAnt(jniDir + '/build-macosx64.xml', '-v', '-Dhas-compiler=true', '-Drelease=true', 'clean', 'postcompile')
+ if (forWin32)
+ BuildExecutor.executeAnt(jniDir + '/build-windows32.xml', '-v', '-Dhas-compiler=true', '-Drelease=true', 'clean', 'postcompile')
+ if (forWin64)
+ BuildExecutor.executeAnt(jniDir + '/build-windows64.xml', '-v', '-Dhas-compiler=true', '-Drelease=true', 'clean', 'postcompile')
+ if (forLinux32)
+ BuildExecutor.executeAnt(jniDir + '/build-linux32.xml', '-v', '-Dhas-compiler=true', '-Drelease=true', 'clean', 'postcompile')
+ if (forLinux64)
+ BuildExecutor.executeAnt(jniDir + '/build-linux64.xml', '-v', '-Dhas-compiler=true', '-Drelease=true', 'clean', 'postcompile')
+ if (forMac64)
+ BuildExecutor.executeAnt(jniDir + '/build-macosx64.xml', '-v', '-Dhas-compiler=true', '-Drelease=true', 'clean', 'postcompile')
+
BuildExecutor.executeAnt(jniDir + '/build.xml', '-v', 'pack-natives')
}
}