option("liba-java")
set_default(false)
set_showmenu(true)
set_category("liba")
set_description("Enable/Disable Java")
option_end()
rule("jar")
set_extensions(".java")
on_load(function(target)
import("lib.detect.find_tool")
local opt = { paths = { "$(env JAVA_HOME)/bin" }, check = function(...) end }
target:set("javac", assert(find_tool("javac", opt), "javac not found!").program)
local opt = { paths = { "$(env JAVA_HOME)/bin" }, check = function(...) end }
target:set("jar", assert(find_tool("jar", opt), "jar not found!").program)
target:set("kind", "static")
target:set("prefixname", "")
target:set("extension", ".jar")
end)
on_buildcmd_files(function(target, batchcmds, sourcebatch, opt)
local src = path.join(target:scriptdir(), "src")
local src = path.relative(src, os.projectdir())
local out = path.join(target:objectdir(), src)
local targetfile = target:targetfile()
sourcebatch.objectfiles = {}
sourcebatch.dependfiles = {}
for _, sourcefile in ipairs(sourcebatch.sourcefiles) do
local objectfile = target:objectfile(sourcefile):gsub("(.+)%.java.+$", "%1.class")
local dependfile = target:dependfile(objectfile)
table.insert(sourcebatch.objectfiles, objectfile)
table.insert(sourcebatch.dependfiles, dependfile)
end
batchcmds:show_progress(opt.progress, "${color.build.object}compiling.java %s", path.filename(targetfile))
batchcmds:mkdir(out)
batchcmds:vrunv(target:get("javac"), table.join("-classpath", src, "-d", out, sourcebatch.sourcefiles))
batchcmds:add_depfiles(sourcebatch.sourcefiles)
for _, objectfile in ipairs(sourcebatch.objectfiles) do
batchcmds:set_depmtime(os.mtime(objectfile))
batchcmds:set_depcache(sourcebatch.dependfiles[_])
end
end)
on_linkcmd(function(target, batchcmds, opt)
local src = path.join(target:scriptdir(), "src")
local src = path.relative(src, os.projectdir())
local cwd = path.join(target:objectdir(), src)
local targetfile = target:targetfile()
local objectfiles = {}
for _, objectfile in ipairs(target:objectfiles()) do
table.insert(objectfiles, path.relative(objectfile, cwd))
end
batchcmds:show_progress(opt.progress, "${color.build.target}archiving.java %s", path.filename(targetfile))
batchcmds:mkdir(target:targetdir())
batchcmds:vrunv(target:get("jar"), table.join("-cf", path.absolute(targetfile), objectfiles), { curdir = cwd })
batchcmds:add_depfiles(target:objectfiles())
batchcmds:set_depmtime(os.mtime(targetfile))
batchcmds:set_depcache(target:dependfile(targetfile))
end)
on_install(function(target)
local installdir = target:installdir()
if installdir then
print("installing %s to %s ..", target:name(), installdir)
installdir = path.join(installdir, "share", "java")
os.mkdir(installdir)
os.vcp(target:targetfile(), installdir)
end
end)
rule_end()
if has_config("liba-java") then
target("ajar")
add_rules("jar")
add_files("src/**.java")
on_load(function(target)
target:set("targetdir", path.join(target:targetdir(), "java"))
end)
set_basename("liba")
target_end()
target("ajni")
set_kind("shared")
add_files("src/**.c")
add_defines("A_EXPORTS")
add_includedirs("include")
on_load(function(target)
import("lib.detect.find_path")
target:add(
"includedirs",
find_path("jni.h", "$(env JAVA_HOME)/include"),
find_path("jni_md.h", "$(env JAVA_HOME)/include/*")
)
target:set("targetdir", path.join(target:targetdir(), "java"))
end)
on_install(function(target)
local installdir = target:installdir()
if installdir then
print("installing %s to %s ..", target:name(), installdir)
installdir = path.join(installdir, "lib", "jni")
os.mkdir(installdir)
os.vcp(target:targetfile(), installdir)
end
end)
if is_plat("windows", "mingw") then
set_filename("a.dll")
else
set_basename("a")
end
add_deps("a")
target_end()
end