diff --git a/Dockerfile b/Dockerfile index 7a5c969..d03e2d4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,9 @@ -FROM alpine:latest +FROM ubuntu:bionic + +RUN apt-get update && apt-get install --no-install-recommends -y curl openjdk-11-jdk-headless cmake make gcc gcc-multilib-i686-linux-gnu gcc-multilib-arm-linux-gnueabihf gcc-aarch64-linux-gnu clang lld mingw-w64 lsb-release + +RUN curl -sL https://deb.nodesource.com/setup_14.x | bash - && apt-get install --no-install-recommends -y nodejs + +RUN apt-get clean -RUN apk add --no-cache curl openjdk8 npm cmake make clang binutils mingw-w64-gcc RUN npm install -g typescript typedoc \ No newline at end of file diff --git a/build.gradle b/build.gradle index 5fd4d02..fbf26a5 100644 --- a/build.gradle +++ b/build.gradle @@ -10,20 +10,25 @@ class JNIPlatform { String[] cmakeArgs String libExtension - JNIPlatform(String name, String[] cmakeArgs, String libExtension) { + JNIPlatform(String name, String libExtension, File rootDir) { this.name = name - this.cmakeArgs = cmakeArgs + this.cmakeArgs = ["-DCMAKE_TOOLCHAIN_FILE=${rootDir.absolutePath}/cmake/${name}-toolchain.cmake"] as String[] this.libExtension = libExtension } } JNIPlatform[] jniPlatforms = [ - new JNIPlatform("linux-x86_64", [] as String[], ".so"), - new JNIPlatform("linux-i686", ["-DCMAKE_TOOLCHAIN_FILE=${rootDir.absolutePath}/cmake/linux_i686_toolchain.cmake"] as String[], ".so"), - new JNIPlatform("windows-x86_64", ["-DCMAKE_TOOLCHAIN_FILE=${rootDir.absolutePath}/cmake/windows_x86_64_toolchain.cmake"] as String[], ".dll"), - new JNIPlatform("windows-i686", ["-DCMAKE_TOOLCHAIN_FILE=${rootDir.absolutePath}/cmake/windows_i686_toolchain.cmake"] as String[], ".dll") + new JNIPlatform("linux-x86_64", ".so", rootDir), + new JNIPlatform("linux-x86", ".so", rootDir), + new JNIPlatform("linux-armhf", ".so", rootDir), + new JNIPlatform("linux-arm64", ".so", rootDir), + new JNIPlatform("windows-x86_64", ".dll", rootDir), + new JNIPlatform("windows-x86", ".dll", rootDir) ] +task cleanJNI {} +task compileJNI {} + for (JNIPlatform platform : jniPlatforms) { def buildDir = new File(cDir, "build-${platform.name}") if (!buildDir.exists()) { @@ -45,15 +50,18 @@ for (JNIPlatform platform : jniPlatforms) { dependsOn tasks.getByName("cmake-${platform.name}") } - processResources.dependsOn tasks.getByName("compileJNI-${platform.name}") + compileJNI.dependsOn tasks.getByName("compileJNI-${platform.name}") tasks.create(name: "cleanJNI-${platform.name}", type: Delete) { delete buildDir.absolutePath } - clean.dependsOn tasks.getByName("cleanJNI-${platform.name}") + cleanJNI.dependsOn tasks.getByName("cleanJNI-${platform.name}") } +clean.dependsOn cleanJNI +processResources.dependsOn compileJNI + compileJava { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 diff --git a/cmake/linux-arm64-toolchain.cmake b/cmake/linux-arm64-toolchain.cmake new file mode 100644 index 0000000..aa35106 --- /dev/null +++ b/cmake/linux-arm64-toolchain.cmake @@ -0,0 +1,12 @@ +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_PROCESSOR aarch64) + +set(BUILD_TARGET "aarch64-linux-gnu") + +set(CMAKE_SYSROOT "/usr/${BUILD_TARGET}") + +set(CMAKE_C_COMPILER clang) + +add_compile_options(-target ${BUILD_TARGET}) + +add_link_options(-fuse-ld=lld -target ${BUILD_TARGET}) \ No newline at end of file diff --git a/cmake/linux-armhf-toolchain.cmake b/cmake/linux-armhf-toolchain.cmake new file mode 100644 index 0000000..9eec105 --- /dev/null +++ b/cmake/linux-armhf-toolchain.cmake @@ -0,0 +1,12 @@ +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_PROCESSOR arm) + +set(BUILD_TARGET "arm-linux-gnueabihf") + +set(CMAKE_SYSROOT "/usr/${BUILD_TARGET}") + +set(CMAKE_C_COMPILER clang) + +add_compile_options(-target ${BUILD_TARGET}) + +add_link_options(-fuse-ld=lld -target ${BUILD_TARGET}) \ No newline at end of file diff --git a/cmake/linux-x86-toolchain.cmake b/cmake/linux-x86-toolchain.cmake new file mode 100644 index 0000000..5417d52 --- /dev/null +++ b/cmake/linux-x86-toolchain.cmake @@ -0,0 +1,12 @@ +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_PROCESSOR i686) + +set(BUILD_TARGET "i686-linux-gnu") + +set(CMAKE_SYSROOT "/usr/${BUILD_TARGET}") + +set(CMAKE_C_COMPILER clang) + +add_compile_options(-target ${BUILD_TARGET}) + +add_link_options(-fuse-ld=lld -target ${BUILD_TARGET}) \ No newline at end of file diff --git a/cmake/linux-x86_64-toolchain.cmake b/cmake/linux-x86_64-toolchain.cmake new file mode 100644 index 0000000..68a75c4 --- /dev/null +++ b/cmake/linux-x86_64-toolchain.cmake @@ -0,0 +1,10 @@ +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_PROCESSOR x86_64) + +if(NOT CMAKE_SYSTEM_PROCESSOR STREQUAL CMAKE_HOST_SYSTEM_PROCESSOR) + message(FATAL_ERROR "Host System is not x86_64") +endif() + +set(CMAKE_C_COMPILER clang) + +add_link_options(-fuse-ld=lld) \ No newline at end of file diff --git a/cmake/linux_i686_toolchain.cmake b/cmake/linux_i686_toolchain.cmake deleted file mode 100644 index ed2b173..0000000 --- a/cmake/linux_i686_toolchain.cmake +++ /dev/null @@ -1,7 +0,0 @@ -set(CMAKE_SYSTEM_NAME Linux) -set(CMAKE_SYSTEM_PROCESSOR i686) - -set(CMAKE_C_FLAGS "-m32 -march=i686") -set(CMAKE_CXX_FLAGS "-m32 -march=i686") - -set(CMAKE_EXE_LINKER_FLAGS "-m32 -march=i686") \ No newline at end of file diff --git a/cmake/windows_i686_toolchain.cmake b/cmake/windows-x86-toolchain.cmake similarity index 100% rename from cmake/windows_i686_toolchain.cmake rename to cmake/windows-x86-toolchain.cmake diff --git a/cmake/windows_x86_64_toolchain.cmake b/cmake/windows-x86_64-toolchain.cmake similarity index 100% rename from cmake/windows_x86_64_toolchain.cmake rename to cmake/windows-x86_64-toolchain.cmake diff --git a/src/main/c/CMakeLists.txt b/src/main/c/CMakeLists.txt index 8ba7257..2ad3f45 100644 --- a/src/main/c/CMakeLists.txt +++ b/src/main/c/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.10) project(scriptcraft C) -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Werror -Wno-int-to-pointer-cast -Wno-pointer-to-int-cast") +add_compile_options(-Wall -Werror -Wno-implicit-int-float-conversion -Wno-int-to-pointer-cast -Wno-pointer-to-int-cast -Wno-sign-compare -Wno-missing-field-initializers -Wundef -Wuninitialized -Wunused -Wno-unused-parameter -Wwrite-strings -Wchar-subscripts -funsigned-char) add_library( scriptcraft diff --git a/src/main/c/com_thebrokenrail_scriptcraft_quickjs_QuickJS.c b/src/main/c/com_thebrokenrail_scriptcraft_quickjs_QuickJS.c index 171977f..13f9dea 100644 --- a/src/main/c/com_thebrokenrail_scriptcraft_quickjs_QuickJS.c +++ b/src/main/c/com_thebrokenrail_scriptcraft_quickjs_QuickJS.c @@ -11,13 +11,13 @@ static JavaVM *jvm; -static void *get_pointer(JNIEnv *env, jobject obj, char *name) { +static void *get_pointer(JNIEnv *env, jobject obj, const char *name) { jclass clazz = (*env)->FindClass(env, "com/thebrokenrail/scriptcraft/quickjs/QuickJS"); jfieldID field = (*env)->GetFieldID(env, clazz, name, "J"); return (void *) (long) (*env)->GetLongField(env, obj, field); } -static void set_pointer(JNIEnv *env, jobject obj, char *name, void *value) { +static void set_pointer(JNIEnv *env, jobject obj, const char *name, void *value) { jclass clazz = (*env)->FindClass(env, "com/thebrokenrail/scriptcraft/quickjs/QuickJS"); jfieldID field = (*env)->GetFieldID(env, clazz, name, "J"); (*env)->SetLongField(env, obj, field, (jlong) (long) value); @@ -163,7 +163,7 @@ static JSModuleDef *js_module_loader(JSContext *ctx, const char *module_name, vo return m; } -static void throw_exception(JNIEnv *env, char *message) { +static void throw_exception(JNIEnv *env, const char *message) { jclass exception_clazz = (*env)->FindClass(env, "com/thebrokenrail/scriptcraft/quickjs/JSException"); (*env)->ThrowNew(env, exception_clazz, message); } diff --git a/src/main/c/console.c b/src/main/c/console.c index 38cc85c..c032257 100644 --- a/src/main/c/console.c +++ b/src/main/c/console.c @@ -10,9 +10,9 @@ static JSValue js_print_internal(JSContext *ctx, JSValueConst this_val, int argc int i; char *out; if (prepend_throw) { - out = "Throw: "; + out = (char *) "Throw: "; } else { - out = ""; + out = (char *) ""; } const char *str; @@ -53,7 +53,7 @@ static JSValue js_assert(JSContext *ctx, JSValueConst this_val, int argc, JSValu } if (!bool_val) { - char *out = "Assertion failed"; + char *out = (char *) "Assertion failed"; for (i = 1; i < argc; i++) { if (i != 1) { asprintf(&out, "%s ", out); diff --git a/src/main/java/com/thebrokenrail/scriptcraft/util/OSUtil.java b/src/main/java/com/thebrokenrail/scriptcraft/util/OSUtil.java index 6cc08b9..e3d625d 100644 --- a/src/main/java/com/thebrokenrail/scriptcraft/util/OSUtil.java +++ b/src/main/java/com/thebrokenrail/scriptcraft/util/OSUtil.java @@ -21,14 +21,26 @@ public class OSUtil { String arch; switch (raw) { case "x86": + case "i386": case "i686": { - arch = "i686"; + arch = "x86"; break; } case "amd64": { arch = "x86_64"; break; } + case "arm": { + arch = "armhf"; + break; + } + case "aarch64_be": + case "armv8b": + case "armv8l": + case "aarch64": { + arch = "arm64"; + break; + } default: { arch = "other"; break;