Skip to content

Commit

Permalink
Add darwin-aarch64 to build
Browse files Browse the repository at this point in the history
  • Loading branch information
Kyle Berezin authored and tresf committed Jan 15, 2021
1 parent 95ee1a3 commit 891c2b4
Show file tree
Hide file tree
Showing 5 changed files with 195 additions and 145 deletions.
172 changes: 117 additions & 55 deletions build.xml
Original file line number Diff line number Diff line change
Expand Up @@ -276,8 +276,7 @@
<condition property="os.prefix" value="win32-${jre.arch}">
<equals arg1="${build.os.family}" arg2="windows"/>
</condition>
<!-- Darwin builds are universal, no arch required -->
<condition property="os.prefix" value="darwin">
<condition property="os.prefix" value="darwin-${jre.arch}">
<equals arg1="${build.os.family}" arg2="mac"/>
</condition>
<condition property="os.prefix" value="sunos-${jre.arch}">
Expand All @@ -295,6 +294,11 @@
<condition property="os.prefix" value="kfreebsd-${jre.arch}">
<equals arg1="${build.os.name}" arg2="GNU/kFreeBSD"/>
</condition>
<!-- Darwin's resource prefix lacks arch info, use "darwin" instead -->
<condition property="resource.prefix" value="darwin">
<matches string="${os.prefix}" pattern="^darwin-"/>
</condition>
<property name="resource.prefix" value="${os.prefix}" description="fallback"/>
<fail unless="os.prefix" message="OS/arch not supported (${os.name}/${jre.arch}), edit build.xml and native/Makefile to add it."/>
<!-- Keep all natives separate -->
<property name="native.subdir" value="native-${os.prefix}"/>
Expand All @@ -316,6 +320,9 @@
<condition property="ld.preload.name" value="LD_PRELOAD" else="IGNORE">
<not><equals arg1="${libjsig}" arg2=""/></not>
</condition>
<condition property="native.jar" value="darwin.jar">
<matches string="${os.prefix}" pattern="^darwin-"/>
</condition>
<property name="native.jar" value="${os.prefix}.jar"/>
<property name="build.native" location="${build}/${native.subdir}"/>
<property name="build.headers" location="${build}/headers"/>
Expand Down Expand Up @@ -521,7 +528,7 @@ com/sun/jna/openbsd-x86-64/libjnidispatch.so;
processor=x86-64;osname=openbsd,
com/sun/jna/darwin/libjnidispatch.jnilib;
osname=macosx;processor=x86;processor=x86-64;processor=ppc
osname=macosx;processor=x86;processor=x86-64;processor=aarch64;processor=ppc
"/>
</manifest>
<manifest file="@{target}" mode="update" if:true="@{module-info}">
Expand Down Expand Up @@ -873,6 +880,21 @@ osname=macosx;processor=x86;processor=x86-64;processor=ppc
</condition>
<property name="make.OS" value="IGNORE="/>
<!-- Ensure Makefile ARCH property properly set -->
<condition property="ARCH" value="aarch64">
<matches string="${os.prefix}" pattern="-aarch64$"/>
</condition>
<condition property="ARCH" value="x86-64">
<matches string="${os.prefix}" pattern="-x86-64$"/>
</condition>
<condition property="ARCH" value="ppc">
<matches string="${os.prefix}" pattern="-ppc$"/>
</condition>
<condition property="ARCH" value="ppc64">
<matches string="${os.prefix}" pattern="-ppc64$"/>
</condition>
<condition property="ARCH" value="x86">
<matches string="${os.prefix}" pattern="-x86$"/>
</condition>
<condition property="ARCH" value="arm">
<equals arg1="${os.prefix}" arg2="w32ce-arm"/>
</condition>
Expand All @@ -882,27 +904,12 @@ osname=macosx;processor=x86;processor=x86-64;processor=ppc
<condition property="ARCH" value="armv7">
<equals arg1="${os.prefix}" arg2="android-armv7"/>
</condition>
<condition property="ARCH" value="aarch64">
<matches string="${os.prefix}" pattern="-aarch64$"/>
</condition>
<condition property="ARCH" value="x86">
<equals arg1="${os.prefix}" arg2="android-x86"/>
</condition>
<condition property="ARCH" value="x86-64">
<equals arg1="${os.prefix}" arg2="android-x86-64"/>
</condition>
<condition property="ARCH" value="mips">
<equals arg1="${os.prefix}" arg2="android-mips"/>
</condition>
<condition property="ARCH" value="mips64">
<equals arg1="${os.prefix}" arg2="android-mips64"/>
</condition>
<condition property="ARCH" value="ppc">
<equals arg1="${os.prefix}" arg2="aix-ppc"/>
</condition>
<condition property="ARCH" value="ppc64">
<equals arg1="${os.prefix}" arg2="aix-ppc64"/>
</condition>
<!-- ensure ARCH is set properly for 64-bit capable platforms -->
<!-- use ANT_OPTS=-d64/-d32 to build 64-bit/32-bit if not the platform default -->
<property name="ARCH" value="${build.os.arch}"/>
Expand All @@ -918,49 +925,41 @@ osname=macosx;processor=x86;processor=x86-64;processor=ppc
<condition property="make.SDKROOT" value="SDKROOT=${SDKROOT}">
<isset property="SDKROOT"/>
</condition>
<property name="xcode" value="/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform"/>
<condition property="make.SDKROOT"
value="SDKROOT=${xcode}/Developer/SDKs/MacOSX10.11.sdk">
<and>
<equals arg1="${os.prefix}" arg2="darwin" trim="true"/>
<available file="${xcode}/Developer/SDKs/MacOSX10.11.sdk"/>
</and>
</condition>
<condition property="make.SDKROOT"
value="SDKROOT=${xcode}/Developer/SDKs/MacOSX10.9.sdk">
<and>
<equals arg1="${os.prefix}" arg2="darwin" trim="true"/>
<available file="${xcode}/Developer/SDKs/MacOSX10.9.sdk"/>
</and>
</condition>
<condition property="make.SDKROOT"
value="SDKROOT=${xcode}/Developer/SDKs/MacOSX10.8.sdk">
<and>
<equals arg1="${os.prefix}" arg2="darwin" trim="true"/>
<available file="${xcode}/Developer/SDKs/MacOSX10.8.sdk"/>
</and>
</condition>
<condition property="make.SDKROOT"
value="SDKROOT=/Developer/SDKs/MacOSX10.6.sdk">
<!-- If not manually provided, detect the SDKROOT in various locations:
- Modern build environments ("MacOSX.sdk", no version):
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk
- macOS 10.8 and older:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX(version).sdk
- Prior versions:
/Developer/SDKs/MacOSX(version).sdk
-->
<condition property="make.SDKROOT" value="SDKROOT=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk">
<and>
<equals arg1="${os.prefix}" arg2="darwin" trim="true"/>
<available file="/Developer/SDKs/MacOSX10.6.sdk"/>
<matches string="${os.prefix}" pattern="^darwin-"/>
<available file="/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk"/>
</and>
</condition>
<condition property="make.SDKROOT"
value="SDKROOT=/Developer/SDKs/MacOSX10.5.sdk">
<condition property="sdk-parent" value="/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs">
<and>
<equals arg1="${os.prefix}" arg2="darwin" trim="true"/>
<available file="/Developer/SDKs/MacOSX10.5.sdk"/>
<matches string="${os.prefix}" pattern="^darwin-"/>
<available file="/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs"/>
</and>
</condition>
<condition property="make.SDKROOT"
value="SDKROOT=/Developer/SDKs/MacOSX10.4u.sdk" else="IGNORE=">
<condition property="sdk-parent" value="/Developer/SDKs">
<and>
<equals arg1="${os.prefix}" arg2="darwin" trim="true"/>
<available file="/Developer/SDKs/MacOSX10.4u.sdk"/>
<matches string="${os.prefix}" pattern="^darwin-"/>
<available file="/Developer/SDKs"/>
</and>
</condition>
<!-- Multiple SDKs is common; find the most recent (sort -V requires 10.12+) -->
<exec executable="sh" dir="${sdk-parent}" outputproperty="sdk-latest" unless:set="make.SDKROOT">
<arg value="-c"/>
<arg line="&quot;ls -d MacOSX10.*.sdk | sort -t &quot;.&quot; -k2 -n | tail -1&quot;"/>
</exec>
<property name="make.SDKROOT" value="SDKROOT=${sdk-parent}/${sdk-latest}"/>

<!-- Windows' drive letters and spaces in absolute paths wreak havoc on
make -->
<condition property="make.BUILD" value="BUILD=../${build}/${native.subdir}" else="BUILD=${build.native}">
Expand Down Expand Up @@ -989,7 +988,7 @@ osname=macosx;processor=x86;processor=x86-64;processor=ppc
<isset property="EXTRA_MAKE_OPTS"/>
</condition>
<!-- Native resource path within jna.jar -->
<property name="native.path" value="com/sun/jna/${os.prefix}"/>
<property name="native.path" value="com/sun/jna/${resource.prefix}"/>

<!-- Default make program -->
<property name="make" value="make"/>
Expand Down Expand Up @@ -1055,6 +1054,68 @@ cd ..
</zip>
</target>

<!--
Darwin prefers fat libraries. native/Makefile outputs a binary file for
one architecture. The binary is joined into a preexisting library pulled
from dist/darwin.jar using lipo.
If the preexisting library does not exist, or the library is thin and
only supports the target arch, the output binary will be renamed and
used in lieu of joining a fat lib.
-->
<macrodef name="darwin-lipo">
<sequential>
<available file="${dist}/${native.jar}" property="dist-available"/>
<unzip src="${dist}/${native.jar}" dest="${build.native}" if:true="${dist-available}">
<patternset>
<include name="libjnidispatch.jnilib"/>
</patternset>
</unzip>
<!--
Detect the arch that was just built.
Note, lipo -info will not exactly match that provided by ${ARCH}, this is OK
-->
<exec executable="lipo" dir="${build.native}" failonerror="true" outputproperty="lipo-info" if:true="${dist-available}">
<arg value="-info"/>
<arg value="libjnidispatch-${ARCH}.jnilib"/>
</exec>
<regexp id="lipo-regex" pattern="\b(\w+)$"/>
<loadresource property="lipo-arch" if:true="${dist-available}">
<propertyresource name="lipo-info"/>
<filterchain>
<tokenfilter>
<filetokenizer/>
<replaceregex pattern=".*\s" replace=""/>
</tokenfilter>
</filterchain>
</loadresource>
<!-- Use the detected arch to remove the old binary, and add the new binary to the fat library -->
<exec executable="lipo" dir="${build.native}" failonerror="false" if:true="${dist-available}">
<arg value="-remove"/>
<arg value="${lipo-arch}"/>
<arg value="libjnidispatch.jnilib"/>
<arg value="-output"/>
<arg value="libjnidispatch.jnilib"/>
</exec>
<exec executable="lipo" dir="${build.native}" failonerror="false" if:true="${dist-available}" resultproperty="lipo-result">
<arg value="-create"/>
<arg value="libjnidispatch.jnilib"/>
<arg value="libjnidispatch-${ARCH}.jnilib"/>
<arg value="-output"/>
<arg value="libjnidispatch.jnilib"/>
</exec>
<condition property="replace-lib" value="true">
<or>
<not>
<equals arg1="0" arg2="${lipo-result}"/>
</not>
<isfalse value="${dist-available}"/>
</or>
</condition>
<move file="${build.native}/libjnidispatch-${ARCH}.jnilib" tofile="${build.native}/libjnidispatch.jnilib" if:true="${replace-lib}" overwrite="true"/>
</sequential>
</macrodef>

<target name="native" depends="-enable-native,javah,-native-api-check,-prepare-native" unless="-native"
description="Build native libraries. Use 'ant -DCC=xxx' to build using a compiler other than gcc">
<exec executable="${make}" dir="${native}" failonerror="true">
Expand All @@ -1074,6 +1135,7 @@ cd ..
<arg value="JNA_JNI_VERSION=${jni.version}"/>
<arg value="CHECKSUM=${jni.md5}"/>
</exec>
<darwin-lipo if:set="make.SDKROOT"/>
<mkdir dir="${classes}/${native.path}"/>
<copy todir="${classes}/${native.path}">
<fileset dir="${build.native}"
Expand Down Expand Up @@ -1132,13 +1194,13 @@ cd ..
<exclude name="${tests.exclude}"/>
</javac>
<!-- Embed testlib-jar at root and at default resource path -->
<mkdir dir="${test.classes}/${os.prefix}"/>
<mkdir dir="${test.classes}/${resource.prefix}"/>
<copy todir="${test.classes}">
<fileset dir="${build.native}">
<include name="*testlib-jar*"/>
</fileset>
</copy>
<copy todir="${test.classes}/${os.prefix}">
<copy todir="${test.classes}/${resource.prefix}">
<fileset dir="${build.native}">
<include name="*testlib-jar*"/>
</fileset>
Expand Down
Binary file modified lib/native/darwin.jar
Binary file not shown.
89 changes: 39 additions & 50 deletions native/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
#
# Windows (x86/amd64/aarch64)
# Windows CE/Mobile (arm)
# Darwin/OS X (i386/x86_64/ppc)
# Darwin/OS X (i386/x86-64/ppc/aarch64)
# Linux (i386/amd64/ppc/arm)
# Solaris (i386/amd64/sparc/sparcv9)
# AIX (ppc/ppc64)
Expand Down Expand Up @@ -392,44 +392,56 @@ endif


ifeq ($(OS),darwin)
XCODE_VERSION=$(shell xcodebuild -version | grep Xcode | sed 's/^Xcode \([1-9]\).*/\1/g')
JAVA_INCLUDES+=-I/System/Library/Frameworks/JavaVM.framework/Headers
DEFAULT_ARCH=$(shell arch)
ARCH=$(shell arch)
HOST_CONFIG=--host $(ARCH)-apple-darwin
FFI_ENV += CC="$(CC)" CFLAGS="-arch $(ARCH) $(ISYSROOT) $(COPT) $(CDEBUG)" CPPFLAGS="$(CDEFINES)" LD="$(LD) -arch $(ARCH)"
ALT_ARCHS=
ifneq ($(ARCH),i386)
ALT_ARCHS+=i386

DARWIN_ARCH=$(ARCH)
ifeq ($(ARCH),aarch64)
DARWIN_ARCH=arm64
else
ifeq ($(ARCH),x86-64)
DARWIN_ARCH=x86_64
else
ifeq ($(ARCH),x86)
DARWIN_ARCH=x86
else
endif
ifneq ($(ARCH),x86_64)
ALT_ARCHS+=x86_64
endif
endif

XCODE_VERSION=$(shell xcodebuild -version | grep Xcode | sed 's/^Xcode \([1-9][0-9]*\).*/\1/g')
MACOS_VERSION_MAJOR=$(shell sw_vers -productVersion | cut -d. -f 1)
MACOS_VERSION_MINOR=$(shell sw_vers -productVersion | cut -d. -f 2)
JAVA_INCLUDES+=-I/System/Library/Frameworks/JavaVM.framework/Headers
DEFAULT_ARCH=$(shell arch)
HOST_CONFIG=--host $(DARWIN_ARCH)-apple-darwin
FFI_ENV += CC="$(CC)" CFLAGS="-arch $(DARWIN_ARCH) $(ISYSROOT) $(COPT) $(CDEBUG)" CPPFLAGS="$(CDEFINES)" LD="$(LD) -arch $(DARWIN_ARCH)"
LIBSFX=.dylib
JNISFX=-$(ARCH).jnilib
# JAWT no longer supported on OSX
CDEFINES+=-DTARGET_RT_MAC_CFM=0 -DFFI_MMAP_EXEC_WRIT -DNO_JAWT

ifneq ($(ARCH),ppc)
ifeq ($(XCODE_VERSION),3)
# Xcode 3 options
# not supported on XCode 4+
ALT_ARCHS+=ppc
else
ifneq ($(XCODE_VERSION),3)
# Xcode 4+ options
NO_COMPACT_UNWIND=-Wl,-no_compact_unwind
endif
endif
LIBSFX=.dylib
JNISFX=.jnilib
ifneq ($(SDKROOT),)
SYSLIBROOT=-Wl,-syslibroot,$(SDKROOT)
ISYSROOT=-isysroot $(SDKROOT)
ARCHFLAGS=-arch i386 -arch x86_64
ifeq ($(XCODE_VERSION),3)
ARCHFLAGS+=-arch ppc
endif
ARCHFLAGS+=-arch $(DARWIN_ARCH)
endif

PCFLAGS+=$(ISYSROOT) -x objective-c
# JAWT no longer supported on OSX
CDEFINES+=-DTARGET_RT_MAC_CFM=0 -DFFI_MMAP_EXEC_WRIT -DNO_JAWT
LDFLAGS=$(ARCHFLAGS) -dynamiclib -o $@ -framework JavaVM \

# MAJOR < 10 || (MAJOR = 10 && MINOR < 7)
MACOS_LT_10_7 = $(shell [ ${MACOS_VERSION_MAJOR} -lt 10 -o ${MACOS_VERSION_MAJOR} -eq 10 -a ${MACOS_VERSION_MINOR} -lt 7 ] && echo true)

# JavaVM.framwork is "Deprecated in OS X v10.7."
ifeq ($(MACOS_LT_10_7),true)
FRAMEWORK=-framework JavaVM
endif

LDFLAGS=$(ARCHFLAGS) -dynamiclib -o $@ $(FRAMEWORK) \
-compatibility_version $(shell echo ${JNA_JNI_VERSION}|sed 's/^\([0-9][0-9]*\).*/\1/g') \
-current_version $(JNA_JNI_VERSION) \
-mmacosx-version-min=10.3 \
Expand All @@ -447,11 +459,7 @@ endif
$(BUILD)/%.o : %.c dispatch.h protect.h $(FFI_LIB)
@mkdir -p $(BUILD)
ifneq ($(SDKROOT),)
$(CC) $(LOC_CC_OPTS) -arch $(ARCH) $(CFLAGS) -c $< -o $@.$(ARCH)
for arch in $(ALT_ARCHS); do \
$(CC) $(LOC_CC_OPTS) -arch $$arch -I$(BUILD)/libffi.$$arch/include $(CFLAGS) -c $< -o $@.$$arch; \
done
lipo -create -output $@ $@.*
$(CC) $(LOC_CC_OPTS) -arch $(DARWIN_ARCH) $(CFLAGS) -c $< -o $@
else
$(CC) $(CFLAGS) $(LOC_CC_OPTS) -c $< $(COUT)
endif
Expand Down Expand Up @@ -507,25 +515,6 @@ $(FFI_LIB):
&& $(FFI_ENV) $(FFI_SRC)/configure $(FFI_CONFIG) $(HOST_CONFIG)); \
fi
$(MAKE) -C $(FFI_BUILD)
ifneq ($(SDKROOT),)
@for arch in $(ALT_ARCHS); do \
mkdir -p $(BUILD)/libffi.$$arch; \
if [ ! -f $(BUILD)/libffi.$$arch/Makefile ]; then \
echo "Configuring libffi ($$arch)"; \
(cd $(BUILD)/libffi.$$arch \
&& CC="$(CC)" CFLAGS="-arch $$arch $(ISYSROOT) $(COPT) $(CDEBUG)" CPPFLAGS="$(CDEFINES)" \
LDFLAGS="-arch $$arch" \
$(FFI_SRC)/configure $(FFI_CONFIG) --host=$$arch-apple-darwin --disable-dependency-tracking); \
fi; \
$(MAKE) -C $(BUILD)/libffi.$$arch; \
done
ifneq ($(ALT_ARCHS),)
/usr/bin/libtool -static -o [email protected] $(FFI_BUILD)/.libs/${@F} $(BUILD)/libffi.*/.libs/${@F}
else
/usr/bin/libtool -static -o [email protected] $(FFI_BUILD)/.libs/${@F}
endif
mv [email protected] $@
endif
endif

clean:
Expand Down
Loading

0 comments on commit 891c2b4

Please sign in to comment.