diff --git a/.tool-versions b/.tool-versions index 3d015548..390fc5f3 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1 +1 @@ -java temurin-18.0.2+101 +java temurin-21.0.0+35.0.LTS diff --git a/Tinsel.lua b/Tinsel.lua new file mode 100644 index 00000000..19e44659 --- /dev/null +++ b/Tinsel.lua @@ -0,0 +1,281 @@ +local toolchain = path(ENV.JAVA_HOME) + +local src_java = path("src/java") +local src_tmpl = path("src/templates") +local src_native = path("src/native") +local libs = path("libs") + +local common_srcs = table.freeze({ + -- common + "org/lwjgl/PointerWrapper.java", + "org/lwjgl/PointerWrapperAbstract.java", + "org/lwjgl/PointerBuffer.java", + -- opencl + "org/lwjgl/opencl/CLPlatform.java", + "org/lwjgl/opencl/CLDevice.java", + "org/lwjgl/opencl/CLContext.java", + "org/lwjgl/opencl/CLCommandQueue.java", + "org/lwjgl/opencl/CLMem.java", + "org/lwjgl/opencl/CLBuildProgramCallback.java", + "org/lwjgl/opencl/CLCompileProgramCallback.java", + "org/lwjgl/opencl/CLContextCallback.java", + "org/lwjgl/opencl/CLEventCallback.java", + "org/lwjgl/opencl/CLLinkProgramCallback.java", + "org/lwjgl/opencl/CLMemObjectDestructorCallback.java", + "org/lwjgl/opencl/CLPrintfCallback.java", + "org/lwjgl/opencl/CLProgramCallback.java", + "org/lwjgl/opencl/CLNativeKernel.java", + "org/lwjgl/opencl/CLFunctionAddress.java", + -- opengl + "org/lwjgl/opengl/GLSync.java", + "org/lwjgl/opengl/AMDDebugOutputCallback.java", + "org/lwjgl/opengl/ARBDebugOutputCallback.java", + "org/lwjgl/opengl/KHRDebugCallback.java", + -- opengles + "org/lwjgl/opengles/EGLImageOES.java", + "org/lwjgl/opengles/KHRDebugCallback.java", +}) +common_srcs = map(common_srcs, function(p) return rootedpath(src_java, src_java .. p) end) + +local sp = src_java.value + +local compile_generators = task("compile_generators", function(env) + local java = require("!java") + java = java.withToolchain(toolchain) + + local srcs_gen = walk_rootedpath{path = src_java .. "org/lwjgl/util/generator"} + + -- compile common classes required by the generators + local out_common = java.compileJar(env:derive(), { + implicit = true, + srcs = common_srcs, + class_path = files({libs .. "unfettered.jar"}), + extra_args = { + "--source-path", sp, + }, + }) + + -- compile the generators + local out_gen = java.compileJar(env:derive(), { + srcs = srcs_gen, + class_path = files({out_common.classes}), + extra_args = { + "--source-path", sp, + }, + -- TODO: need to track source path + --__source_path = files() + }) + + return {out_common.classes, out_gen.classes} +end) + +local generate = export(task("generate", function(env) + local java = require("!java") + java = java.withToolchain(toolchain) + + -- all generator sources + local srcs_openal = walk_rootedpath{path = src_tmpl .. "org/lwjgl/openal"} + local srcs_opengl = walk_rootedpath{path = src_tmpl .. "org/lwjgl/opengl"} + local srcs_opencl = walk_rootedpath{path = src_tmpl .. "org/lwjgl/opencl"} + local srcs_opengles = walk_rootedpath{path = src_tmpl .. "org/lwjgl/opengles"} + + local class_path = files(compile_generators()) + + local dest_props_java = {"genJavaPath"} + local dest_props_native = {"genNativePath"} + + local function with_dest_props(input, dest_props) + input = table.clone(input) + input.dest_props = dest_props + return input + end + + local function compile(input) + input.class_path = class_path + local env = env:derive() + return async(function() + local output = java.compile(env, input) + return map_rootedpath(output.root, output.files) + end) + --local output = java.compile(env, input) + --output = map_rootedpath(output.root, output.files) + --return async(function() return output end) + end + + local gen_openal = { + srcs = srcs_openal, + extra_args = { + "--source-path", sp, + + "-proc:only", + "-processor", + "org.lwjgl.util.generator.GeneratorProcessor", + + "-Atypemap=org.lwjgl.util.generator.openal.ALTypeMap", + "-Anovalidate=true", + }, + } + local gen_openal_java = {compile(with_dest_props(gen_openal, dest_props_java))} + local gen_openal_native = compile(with_dest_props(gen_openal, dest_props_native)) + + local gen_opengl = { + srcs = srcs_opengl, + extra_args = { + "--source-path", sp, + + "-proc:only", + "-processor", + "org.lwjgl.util.generator.GeneratorProcessor", + + "-Acontextspecific", + "-Atypemap=org.lwjgl.util.generator.opengl.GLTypeMap", + "-Anovalidate=true", + }, + } + local gen_opengl_java = { + compile(with_dest_props(gen_opengl, dest_props_java)), + compile(with_dest_props({ + srcs = srcs_opengl, + extra_args = { + "--source-path", sp, + + "-proc:only", + "-processor", + "org.lwjgl.util.generator.opengl.GLReferencesGeneratorProcessor", + + "-Acontextspecific", + } + }, dest_props_java)), + compile(with_dest_props({ + srcs = srcs_opengl, + extra_args = { + "--source-path", sp, + + "-proc:only", + "-processor", + "org.lwjgl.util.generator.opengl.GLGeneratorProcessor", + + "-Acontextspecific", + } + }, dest_props_java)), + } + local gen_opengl_native = compile(with_dest_props(gen_opengl, dest_props_native)) + + local gen_opencl = { + srcs = srcs_opencl, + extra_args = { + "--source-path", sp, + + "-proc:only", + "-processor", + "org.lwjgl.util.generator.GeneratorProcessor", + + "-Acontextspecific", + "-Atypemap=org.lwjgl.util.generator.opencl.CLTypeMap", + "-Anovalidate=true", + }, + } + local gen_opencl_java = { + compile(with_dest_props(gen_opencl, dest_props_java)), + compile(with_dest_props({ + srcs = srcs_opencl, + extra_args = { + "--source-path", sp, + + "-proc:only", + "-processor", + "org.lwjgl.util.generator.opencl.CLGeneratorProcessor", + + "-Acontextspecific", + } + }, dest_props_java)), + } + local gen_opencl_native = compile(with_dest_props(gen_opencl, dest_props_native)) + + local gen_opengles = { + srcs = srcs_opengles, + extra_args = { + "--source-path", sp, + + "-proc:only", + "-processor", + "org.lwjgl.util.generator.GeneratorProcessor", + + "-Atypemap=org.lwjgl.util.generator.opengl.GLESTypeMap", + "-Anovalidate=true", + }, + } + local gen_opengles_java = { + compile(with_dest_props(gen_opengles, dest_props_java)), + compile(with_dest_props({ + srcs = srcs_opengles, + extra_args = { + "--source-path", sp, + + "-proc:only", + "-processor", + "org.lwjgl.util.generator.opengl.GLESGeneratorProcessor", + } + }, dest_props_java)), + } + local gen_opengles_native = compile(with_dest_props(gen_opengles, dest_props_native)) + + local gen_java = table.concat(gen_openal_java, gen_opengl_java, gen_opencl_java, gen_opengles_java) + + local gen_native = { + gen_openal_native, + gen_opengl_native, + gen_opencl_native, + gen_opengles_native, + } + + local gen_java, gen_native = await(async(function() + return table.concat(await(gen_java)) + end), async(function() + return table.concat(await(gen_native)) + end)) + return { java = gen_java, native = gen_native } +end)) + +compile_java = export(task("compile_java", function(env) + local java = require("!java") + java = java.withToolchain(toolchain) + + local srcs_root = src_java .. "org/lwjgl" + local ignore_a = srcs_root.value .. "/util/generator" + local ignore_b = srcs_root.value .. "/util/test" + local ignore_c = srcs_root.value .. "/test" + local ignore_d = srcs_root.value .. "/util/mapped" + + local srcs = table.clone(walk_rootedpath{path = srcs_root}) + filter(srcs, function(path) + local p = path.path.value + return not p:startswith(ignore_a, ignore_b, ignore_c, ignore_d) + end) + push_all(srcs, generate().java) + table.freeze(srcs) + + return java.compileJar(env:derive(), { + srcs = srcs, + class_path = files({ + libs .. "unfettered.jar", + libs .. "jinput.jar", + libs .. "AppleJavaExtensions.jar", + }) + }) +end)) + +local build_symbol_list = task("build_symbol_list", function(env, srcs: {InputFile}) + env:memoize(srcs, function(srcs, output) + local args = map(srcs, function(src) return src.path.value end) + local output = exec_with_output("nm", "-j", "-g", table.unpack(args)) + check_status(output) + local pat = compile_regex("^_J(ava|NI|avaCritical)_.*$", {multi_line = true}); + + local buf = "" + pat.for_each_match(output.stdout, function(match) + buf ..= match .. "\n" + end) + intrinsic.io.write_file(output, buf) + end) +end) diff --git a/src/java/org/lwjgl/LWJGLUtil.java b/src/java/org/lwjgl/LWJGLUtil.java index 1e0e2cf1..b9fde3ba 100644 --- a/src/java/org/lwjgl/LWJGLUtil.java +++ b/src/java/org/lwjgl/LWJGLUtil.java @@ -40,7 +40,7 @@ import java.lang.reflect.Modifier; import java.nio.ByteBuffer; import java.util.*; -import dev.pfaff.unfettered.UnsafeUtil; +import dev.pfaff.unfettered.Unfettered; import static java.lang.invoke.MethodType.methodType; @@ -64,7 +64,7 @@ public class LWJGLUtil { private static final MethodHandle MH_findLibrary; static { - MethodHandles.Lookup l = UnsafeUtil.getTrustedLookup(); + MethodHandles.Lookup l = Unfettered.getTrustedLookup(); try { MH_findLibrary = l.findVirtual(ClassLoader.class, "findLibrary", methodType(String.class, String.class)); } catch (ReflectiveOperationException e) { diff --git a/src/java/org/lwjgl/util/WaveData.java b/src/java/org/lwjgl/util/WaveData.java index b4ab5f9b..c7b62ac2 100644 --- a/src/java/org/lwjgl/util/WaveData.java +++ b/src/java/org/lwjgl/util/WaveData.java @@ -49,7 +49,7 @@ import javax.sound.sampled.AudioSystem; import org.lwjgl.openal.AL10; -import dev.pfaff.unfettered.UnsafeUtil; +import dev.pfaff.unfettered.Unfettered; import static java.lang.invoke.MethodHandles.*; import static java.lang.invoke.MethodType.*; @@ -66,7 +66,7 @@ public class WaveData { private static final MethodHandle MH_getWaveInputStream; static { - MethodHandles.Lookup l = UnsafeUtil.getTrustedLookup(); + MethodHandles.Lookup l = Unfettered.getTrustedLookup(); try { Class C_WaveFileReader = Class.forName("com.sun.media.sound.WaveFileReader"); MethodHandle MH_WaveFileReader_constructor = l.findConstructor(C_WaveFileReader, methodType(void.class)); diff --git a/src/stubs/dev/pfaff/unfettered/UnsafeUtil.java b/src/stubs/dev/pfaff/unfettered/UnsafeUtil.java deleted file mode 100644 index 0906d9b6..00000000 --- a/src/stubs/dev/pfaff/unfettered/UnsafeUtil.java +++ /dev/null @@ -1,9 +0,0 @@ -package dev.pfaff.unfettered; - -import java.lang.invoke.MethodHandles; - -public final class UnsafeUtil { - public static MethodHandles.Lookup getTrustedLookup() { - throw new RuntimeException("This is a stub"); - } -}