From 98705cef49c8a161a8f5df10aa89237c82cac4ac Mon Sep 17 00:00:00 2001 From: Joe Lauer Date: Mon, 30 Oct 2023 16:17:52 -0400 Subject: [PATCH] Improved build script --- .blaze/blaze.java | 17 +++++++++++++---- native/jcat/Makefile | 8 -------- native/libhelloj/Makefile | 18 +++++++++++++++++- src/test/resources/jne/linux/x64/jcat | Bin 16440 -> 9152 bytes src/test/resources/jne/linux/x64/libhelloj.so | Bin 15424 -> 8360 bytes 5 files changed, 30 insertions(+), 13 deletions(-) diff --git a/.blaze/blaze.java b/.blaze/blaze.java index 3faaa46..1f2fca2 100644 --- a/.blaze/blaze.java +++ b/.blaze/blaze.java @@ -28,6 +28,7 @@ public void build_natives() throws Exception { final String targetStr = Contexts.config().value("target").orNull(); final NativeTarget nativeTarget = targetStr != null ? NativeTarget.fromJneTarget(targetStr) : NativeTarget.detect(); + log.info("Building natives for target {}", nativeTarget.toJneTarget()); log.info("Copying native code to (cleaned) {} directory...", targetDir); rm(targetDir).recursive().force().run(); mkdir(targetDir).parents().run(); @@ -46,11 +47,17 @@ public void build_natives() throws Exception { .verbose() .run(); } else { + String cmd = "make"; + // freebsd and openbsd, we need to use gmake + if (nativeTarget.getOperatingSystem() == OperatingSystem.FREEBSD || nativeTarget.getOperatingSystem() == OperatingSystem.OPENBSD) { + cmd = "gmake"; + } + log.info("Building jcat executable..."); - exec("make").workingDir(targetJcatDir).debug().run(); + exec(cmd).workingDir(targetJcatDir).debug().run(); log.info("Building helloj library..."); - exec("make").workingDir(targetLibHelloJDir).debug().run(); + exec(cmd).workingDir(targetLibHelloJDir).debug().run(); } cp(targetJcatDir.resolve(exename)).target(javaOutputDir).force().verbose().run(); @@ -258,14 +265,16 @@ public void cross_build_natives() throws Exception { new Buildx(crossTargets) .tags("build") .execute((target, project) -> { - String buildScript = "setup/build-native-lib-linux-action.sh"; + /*String buildScript = "setup/build-native-lib-linux-action.sh"; if (target.getOs().equals("macos")) { buildScript = "setup/build-native-lib-macos-action.sh"; } else if (target.getOs().equals("windows")) { buildScript = "setup/build-native-lib-windows-action.bat"; } - project.action(buildScript, target.getOs(), target.getArch()).run(); + project.action(buildScript, target.getOs(), target.getArch()).run();*/ + + project.action("java", "-jar", "blaze.jar", "build_natives", "--target", target.getOsArch()).run(); // we know that the only modified file will be in the artifact dir final String artifactRelPath = "src/test/resources/jne/" + target.getOs() + "/" + target.getArch() + "/"; diff --git a/native/jcat/Makefile b/native/jcat/Makefile index 97153dc..0d19a1a 100644 --- a/native/jcat/Makefile +++ b/native/jcat/Makefile @@ -1,11 +1,3 @@ -# -# To run this in your own shell -# CC=gcc make -# - -#CC = gcc -#CPP = g++ - all: $(CC) -Wall -pedantic -O2 -o jcat jcat.c diff --git a/native/libhelloj/Makefile b/native/libhelloj/Makefile index 22f0d72..0f32767 100644 --- a/native/libhelloj/Makefile +++ b/native/libhelloj/Makefile @@ -10,13 +10,29 @@ JAVA ?= java SHAREDFILEEXT ?= so UNAME_S := $(shell uname -s) EXTRA_CXXFLAGS := -z noexecstack +CXXFLAGS := +CFLAGS := +JAVA_INCLUDE := -I${JAVA_HOME}/include ifeq ($(UNAME_S),Darwin) + JAVA_INCLUDE := ${JAVA_INCLUDE} -I${JAVA_HOME}/include/darwin SHAREDFILEEXT = dylib EXTRA_CXXFLAGS = endif +ifeq ($(UNAME_S),Linux) + JAVA_INCLUDE := ${JAVA_INCLUDE} -I${JAVA_HOME}/include/linux +endif +ifeq ($(UNAME_S),FreeBSD) + JAVA_INCLUDE := ${JAVA_INCLUDE} -I${JAVA_HOME}/include/freebsd + CXX = clang++ +endif +ifeq ($(UNAME_S),OpenBSD) + JAVA_INCLUDE := ${JAVA_INCLUDE} -I${JAVA_HOME}/include/openbsd + EXTRA_CXXFLAGS = + CXX = clang++ +endif all: - $(CXX) -shared -fPIC -Wall -pedantic -O3 $(CXXFLAGS) $(EXTRA_CXXFLAGS) -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux -I${JAVA_HOME}/include/darwin -I${JAVA_HOME}/include/freebsd -I${JAVA_HOME}/include/openbsd -o libhelloj.$(SHAREDFILEEXT) -lc helloj_HelloLib.cpp + $(CXX) -shared -fPIC -Wall -pedantic -O3 $(CXXFLAGS) $(EXTRA_CXXFLAGS) $(JAVA_INCLUDE) -o libhelloj.$(SHAREDFILEEXT) -lc helloj_HelloLib.cpp jniheaders: $(JAVAC) -h . helloj/HelloLib.java diff --git a/src/test/resources/jne/linux/x64/jcat b/src/test/resources/jne/linux/x64/jcat index 668f16e93263d87cee7bcf8417ec9d81a8b38114..80b0b7546cd2fa1c72f4d28dd419a0a726decd4d 100755 GIT binary patch literal 9152 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 literal 16440 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 Vxn8zys^Ndzr)2ALl1{I^>+Dwh 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 Pe~S-0Do+{4P5=J}a%3u^ literal 15424 zcmeHOU2GiH6~5~v%>p4dDL)3&W+=848ZwwTX-(UZbsRhEV23twq|ib~v)-|H(eBP_ zb~dqjXkA5BORQA%fzV2Q=mVhi4fUl0@sJ3FT-1kDs#G3Y$$g-8rKmOZM=1}Po^$7X z>+xh)pgbTU-D~Z9_ndpabMHNKXYZ`%%=gD8$Gb8ag|bOKuGS@`a?+674-3`}tJ~;! zzv|Pro7bCesO7fADxm6#W$r^ai3~k(Kn4MXp4GZPEB2#Ocu~~AB=2+7w#$wUc0Ilk zSERpHLGZfBjCsSt8x|h$1+fQaW4C&YJkE>kpbc7Dt6IZP^Ol8|#(v=ebu37C;{C9A zGyQ#2cs(+pG@>6M`ui5~I4+;G;4~kX{yLq9_avS`oDS}neejw&a_pp{@LXcuCi-yU z`knM)ncENkt+($_z32A4a__&N`No9@fBW4ZkDj3>=IQgve%HsJ&7mGWeRYEEIu+(w zZ5qcr=ueVRh_ z5qiP&)M&-8dDCv8;>B(4Tb!AB*O@KX+)DX5GW_<5aPOmKzu^?zhUZkug}@CKoN}!k zo>oWQ)2>tUDi!}(C(kfhE;yyKBCAGNoY}qGZus_B)RD=FL!+loIYah7duT6>HbZ}1 z`p7Y4=^P=}#i462(W&WDKbLvo`owjyCWeD@{Xzd49OPmm^h)IAgR!2^FZYXbC86gv zf%0BLkG0NiD+#@PrGaA5M8HJAM8HJAM8HJAM8HJAMBp@uU3NtJ(b0me(Iq zD*wYvVOMk|fA;O{TY3)B{&z_o4g8Ld-8*xN?W2JUB+Yj3JWPc12QD-3{FXNu9=jIa zMXtWbb#iq}w9>tEksZAyNcKO~_WREpkD?xPhwPaT(5BzP94mQ}ctBZ|pPlN(Gi5ik)j5ik)j5ik)j5ik)j5ik)j5ik+>R3d=yP!WKHB?UXlc0}uYN;^xma^#bo6W1u9JmkEo@qk4%vI{!9Dw$S{!;v6gO}a3ZD07^+A+S z=_;>_E?ONqe)~)iHp1rYtUaUF)7qV|>dbIrdqX)+(Rb!5e!;Cc#n2BLj@z79Gk&#R z@j|a?54N}9WcRY;27$Zac(pKCP_uzs^_*g}T3sMYLehEf8%$H#@Agc+PL%QEBU59} z*s;T$hVRfz2+mkul=;KQmF`hFM<$;F)UlDNiBY8oL3SIH{XcoyelC@de{=5%bjtl#c4MI$x&^{8h_QrP%?~|$uGX~c zfnWE6a6#EERiRm~6!(;iN*k2iMoHPlg&H}FF%06C(_YXh`?U>%Lv4XqahafOem6nc z^-5^Z`BVwLc{=hrCL_P-hOV-`lAP62k*JVjYJ7TQ2I}P3t(Iq~Q$J+SG$ie(&}b-| z7Fdgzr2Ui~P=9~1)cJKru|(=@v#pAaUTgch$G}* z2%q0D(#6_{>He^OfG?9d*Kz)^KLh*49U$HRuT%VCE4BpIK@`OKhx$#b@EXN^A?{1? zeq7ofGH{u=-3dPKg9iDFfeP$mX$IkLA;8Nq%kGx T*9qJ4$M?mAkCINQp634_vQJ?s