mirror of
https://github.com/apache/maven-mvnd.git
synced 2025-09-10 13:15:27 +00:00
Merge pull request #401 from gnodet/i400
Provide a native library, fixes #400
This commit is contained in:
@@ -41,6 +41,10 @@
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.mvndaemon.mvnd</groupId>
|
||||
<artifactId>mvnd-native</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.maven</groupId>
|
||||
<artifactId>maven-embedder</artifactId>
|
||||
|
@@ -95,7 +95,6 @@ import org.codehaus.plexus.classworlds.realm.ClassRealm;
|
||||
import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
|
||||
import org.codehaus.plexus.util.StringUtils;
|
||||
import org.eclipse.aether.transfer.TransferListener;
|
||||
import org.fusesource.jansi.internal.CLibrary;
|
||||
import org.mvndaemon.mvnd.cache.invalidating.InvalidatingExtensionRealmCache;
|
||||
import org.mvndaemon.mvnd.cache.invalidating.InvalidatingPluginArtifactsCache;
|
||||
import org.mvndaemon.mvnd.cache.invalidating.InvalidatingPluginRealmCache;
|
||||
@@ -105,6 +104,7 @@ import org.mvndaemon.mvnd.logging.internal.Slf4jLoggerManager;
|
||||
import org.mvndaemon.mvnd.logging.smart.BuildEventListener;
|
||||
import org.mvndaemon.mvnd.logging.smart.LoggingExecutionListener;
|
||||
import org.mvndaemon.mvnd.logging.smart.LoggingOutputStream;
|
||||
import org.mvndaemon.mvnd.nativ.CLibrary;
|
||||
import org.mvndaemon.mvnd.plugin.CliMavenPluginManager;
|
||||
import org.mvndaemon.mvnd.transfer.DaemonMavenTransferListener;
|
||||
import org.slf4j.ILoggerFactory;
|
||||
|
98
native/Makefile
Normal file
98
native/Makefile
Normal file
@@ -0,0 +1,98 @@
|
||||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
include Makefile.common
|
||||
|
||||
.phony: all package native native-all deploy
|
||||
|
||||
all: package
|
||||
|
||||
MVNDNATIVE_OUT:=target/native-$(OS_NAME)-$(OS_ARCH)
|
||||
|
||||
CCFLAGS:= -I$(MVNDNATIVE_OUT) $(CCFLAGS)
|
||||
|
||||
|
||||
clean-native:
|
||||
rm -rf $(MVNDNATIVE_OUT)
|
||||
|
||||
$(MVNDNATIVE_OUT)/%.o: src/main/native/%.c
|
||||
@mkdir -p $(@D)
|
||||
$(info running: $(CC) $(CCFLAGS) -c $< -o $@)
|
||||
$(CC) $(CCFLAGS) -c $< -o $@
|
||||
|
||||
$(MVNDNATIVE_OUT)/$(LIBNAME): $(MVNDNATIVE_OUT)/mvndnative.o
|
||||
@mkdir -p $(@D)
|
||||
$(CC) $(CCFLAGS) -o $@ $(MVNDNATIVE_OUT)/mvndnative.o $(LINKFLAGS)
|
||||
|
||||
NATIVE_DIR=src/main/resources/org/mvndaemon/mvnd/nativ/$(OS_NAME)/$(OS_ARCH)
|
||||
NATIVE_TARGET_DIR:=target/classes/org/mvndaemon/mvnd/nativ/$(OS_NAME)/$(OS_ARCH)
|
||||
NATIVE_DLL:=$(NATIVE_DIR)/$(LIBNAME)
|
||||
|
||||
# For cross-compilation, install docker. See also https://github.com/dockcross/dockcross
|
||||
# Disabled linux-armv6 build because of this issue; https://github.com/dockcross/dockcross/issues/190
|
||||
native-all: linux-x86 linux-x86_64 linux-arm linux-armv7 \
|
||||
linux-arm64 linux-ppc64 win-x86 win-x86_64 mac-x86 mac-x86_64 freebsd-x86 freebsd-x86_64
|
||||
|
||||
native: $(NATIVE_DLL)
|
||||
|
||||
$(NATIVE_DLL): $(MVNDNATIVE_OUT)/$(LIBNAME)
|
||||
@mkdir -p $(@D)
|
||||
cp $< $@
|
||||
@mkdir -p $(NATIVE_TARGET_DIR)
|
||||
cp $< $(NATIVE_TARGET_DIR)/$(LIBNAME)
|
||||
|
||||
linux-x86:
|
||||
./docker/dockcross-linux-x86 bash -c 'make clean-native native OS_NAME=Linux OS_ARCH=x86'
|
||||
|
||||
linux-x86_64:
|
||||
docker run -it --rm -v $$PWD:/workdir -e CROSS_TRIPLE=x86_64-linux-gnu multiarch/crossbuild make clean-native native OS_NAME=Linux OS_ARCH=x86_64
|
||||
|
||||
linux-arm:
|
||||
docker run -it --rm -v $$PWD:/workdir -e CROSS_TRIPLE=arm-linux-gnueabi multiarch/crossbuild make clean-native native OS_NAME=Linux OS_ARCH=arm
|
||||
|
||||
linux-armv7:
|
||||
docker run -it --rm -v $$PWD:/workdir -e CROSS_TRIPLE=arm-linux-gnueabihf multiarch/crossbuild make clean-native native OS_NAME=Linux OS_ARCH=armv7
|
||||
|
||||
linux-arm64:
|
||||
docker run -it --rm -v $$PWD:/workdir -e CROSS_TRIPLE=aarch64-linux-gnu multiarch/crossbuild make clean-native native OS_NAME=Linux OS_ARCH=arm64
|
||||
|
||||
linux-ppc64:
|
||||
docker run -it --rm -v $$PWD:/workdir -e CROSS_TRIPLE=powerpc64le-linux-gnu multiarch/crossbuild make clean-native native OS_NAME=Linux OS_ARCH=ppc64
|
||||
|
||||
win-x86:
|
||||
./docker/dockcross-windows-static-x86 bash -c 'make clean-native native CROSS_PREFIX=i686-w64-mingw32.static- OS_NAME=Windows OS_ARCH=x86'
|
||||
|
||||
win-x86_64:
|
||||
./docker/dockcross-windows-static-x64 bash -c 'make clean-native native CROSS_PREFIX=x86_64-w64-mingw32.static- OS_NAME=Windows OS_ARCH=x86_64'
|
||||
|
||||
mac-x86:
|
||||
docker run -it --rm -v $$PWD:/workdir -e CROSS_TRIPLE=i386-apple-darwin multiarch/crossbuild make clean-native native OS_NAME=Mac OS_ARCH=x86
|
||||
|
||||
mac-x86_64:
|
||||
docker run -it --rm -v $$PWD:/workdir -e CROSS_TRIPLE=x86_64-apple-darwin multiarch/crossbuild make clean-native native OS_NAME=Mac OS_ARCH=x86_64
|
||||
|
||||
freebsd-x86:
|
||||
docker run -it --rm -v $$PWD:/workdir empterdose/freebsd-cross-build:9.3 make clean-native native CROSS_PREFIX=i386-freebsd9- OS_NAME=FreeBSD OS_ARCH=x86
|
||||
|
||||
freebsd-x86_64:
|
||||
docker run -it --rm -v $$PWD:/workdir empterdose/freebsd-cross-build:9.3 make clean-native native CROSS_PREFIX=x86_64-freebsd9- OS_NAME=FreeBSD OS_ARCH=x86_64
|
||||
|
||||
#sparcv9:
|
||||
# $(MAKE) native OS_NAME=SunOS OS_ARCH=sparcv9
|
||||
|
||||
|
||||
|
166
native/Makefile.common
Normal file
166
native/Makefile.common
Normal file
@@ -0,0 +1,166 @@
|
||||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
# os=Default is meant to be generic unix/linux
|
||||
|
||||
known_targets := Linux-x86 Linux-x86_64 Linux-arm Linux-armv6 Linux-armv7 Linux-android-arm Linux-ppc64 Mac-x86 Mac-x86_64 DragonFly-x86_64 FreeBSD-x86_64 OpenBSD-x86_64 Windows-x86 Windows-x86_64 SunOS-sparcv9 HPUX-ia64_32
|
||||
target := $(OS_NAME)-$(OS_ARCH)
|
||||
|
||||
ifeq (,$(findstring $(strip $(target)),$(known_targets)))
|
||||
target := Default
|
||||
endif
|
||||
|
||||
# cross-compilation toolchain prefix (e.g. "arm-linux-gnueabi-")
|
||||
CROSS_PREFIX :=
|
||||
|
||||
Default_CC := $(CROSS_PREFIX)gcc
|
||||
Default_STRIP := $(CROSS_PREFIX)strip
|
||||
Default_CCFLAGS := -I$(JAVA_HOME)/include -Isrc/main/lib/inc_linux -Os -fPIC -fvisibility=hidden
|
||||
Default_LINKFLAGS := -shared
|
||||
Default_LIBNAME := libmvndnative.so
|
||||
Default_JANSI_FLAGS :=
|
||||
|
||||
Linux-x86_CC := $(CROSS_PREFIX)gcc
|
||||
Linux-x86_STRIP := $(CROSS_PREFIX)strip
|
||||
Linux-x86_CCFLAGS := -I$(JAVA_HOME)/include -Isrc/main/lib/inc_linux -Os -fPIC -m32 -fvisibility=hidden
|
||||
Linux-x86_LINKFLAGS := -shared -static-libgcc
|
||||
Linux-x86_LIBNAME := libmvndnative.so
|
||||
Linux-x86_JANSI_FLAGS :=
|
||||
|
||||
Linux-x86_64_CC := $(CROSS_PREFIX)gcc
|
||||
Linux-x86_64_STRIP := $(CROSS_PREFIX)strip
|
||||
Linux-x86_64_CCFLAGS := -Isrc/main/lib/inc_linux -I$(JAVA_HOME)/include -Os -fPIC -m64 -fvisibility=hidden
|
||||
Linux-x86_64_LINKFLAGS := -shared -static-libgcc
|
||||
Linux-x86_64_LIBNAME := libmvndnative.so
|
||||
Linux-x86_64_JANSI_FLAGS :=
|
||||
|
||||
Linux-arm_CC := $(CROSS_PREFIX)gcc
|
||||
Linux-arm_STRIP := $(CROSS_PREFIX)strip
|
||||
Linux-arm_CCFLAGS := -I$(JAVA_HOME)/include -Isrc/main/lib/inc_linux -Os -fPIC -mfloat-abi=softfp -mfpu=vfp -fvisibility=hidden
|
||||
Linux-arm_LINKFLAGS := -shared -static-libgcc
|
||||
Linux-arm_LIBNAME := libmvndnative.so
|
||||
Linux-arm_JANSI_FLAGS :=
|
||||
|
||||
Linux-armv6_CC := $(CROSS_PREFIX)gcc
|
||||
Linux-armv6_STRIP := $(CROSS_PREFIX)strip
|
||||
Linux-armv6_CCFLAGS := -I$(JAVA_HOME)/include -Isrc/main/lib/inc_linux -Os -mfloat-abi=hard -mfpu=vfp -fPIC -fvisibility=hidden
|
||||
Linux-armv6_LINKFLAGS := -shared -static-libgcc
|
||||
Linux-armv6_LIBNAME := libmvndnative.so
|
||||
Linux-armv6_JANSI_FLAGS :=
|
||||
|
||||
Linux-armv7_CC := $(CROSS_PREFIX)gcc
|
||||
Linux-armv7_STRIP := $(CROSS_PREFIX)strip
|
||||
Linux-armv7_CCFLAGS := -I$(JAVA_HOME)/include -Isrc/main/lib/inc_linux -Os -mfloat-abi=hard -mfpu=vfp -fPIC -fvisibility=hidden
|
||||
Linux-armv7_LINKFLAGS := -shared -static-libgcc
|
||||
Linux-armv7_LIBNAME := libmvndnative.so
|
||||
Linux-armv7_JANSI_FLAGS :=
|
||||
|
||||
Linux-arm64_CC := $(CROSS_PREFIX)gcc
|
||||
Linux-arm64_STRIP := $(CROSS_PREFIX)strip
|
||||
Linux-arm64_CCFLAGS := -I$(JAVA_HOME)/include -Isrc/main/lib/inc_linux -Os -mfloat-abi=hard -mfpu=vfp -fPIC -fvisibility=hidden
|
||||
Linux-arm64_LINKFLAGS := -shared -static-libgcc
|
||||
Linux-arm64_LIBNAME := libmvndnative.so
|
||||
Linux-arm64_JANSI_FLAGS :=
|
||||
|
||||
Linux-ppc64_CC := $(CROSS_PREFIX)gcc
|
||||
Linux-ppc64_STRIP := $(CROSS_PREFIX)strip
|
||||
Linux-ppc64_CCFLAGS := -I$(JAVA_HOME)/include -Isrc/main/lib/inc_linux -Os -fPIC -fvisibility=hidden
|
||||
Linux-ppc64_LINKFLAGS := -shared -static-libgcc
|
||||
Linux-ppc64_LIBNAME := libmvndnative.so
|
||||
Linux-ppc64_JANSI_FLAGS :=
|
||||
|
||||
DragonFly-x86_64_CC := $(CROSS_PREFIX)cc
|
||||
DragonFly-x86_64_STRIP := $(CROSS_PREFIX)strip
|
||||
DragonFly-x86_64_CCFLAGS := -I$(JAVA_HOME)/include -Isrc/main/lib/inc_linux -O2 -fPIC -fvisibility=hidden
|
||||
DragonFly-x86_64_LINKFLAGS := -shared
|
||||
DragonFly-x86_64_LIBNAME := libmvndnative.so
|
||||
DragonFly-x86_64_JANSI_FLAGS :=
|
||||
|
||||
FreeBSD-x86_CC := $(CROSS_PREFIX)gcc
|
||||
FreeBSD-x86_STRIP := $(CROSS_PREFIX)strip
|
||||
FreeBSD-x86_CCFLAGS := -I$(JAVA_HOME)/include -Isrc/main/lib/inc_linux -Os -fPIC -fvisibility=hidden
|
||||
FreeBSD-x86_LINKFLAGS := -shared
|
||||
FreeBSD-x86_LIBNAME := libmvndnative.so
|
||||
FreeBSD-x86_JANSI_FLAGS :=
|
||||
|
||||
FreeBSD-x86_64_CC := $(CROSS_PREFIX)gcc
|
||||
FreeBSD-x86_64_STRIP := $(CROSS_PREFIX)strip
|
||||
FreeBSD-x86_64_CCFLAGS := -I$(JAVA_HOME)/include -Isrc/main/lib/inc_linux -Os -fPIC -fvisibility=hidden
|
||||
FreeBSD-x86_64_LINKFLAGS := -shared
|
||||
FreeBSD-x86_64_LIBNAME := libmvndnative.so
|
||||
FreeBSD-x86_64_JANSI_FLAGS :=
|
||||
|
||||
OpenBSD-x86_64_CC := $(CROSS_PREFIX)gcc
|
||||
OpenBSD-x86_64_STRIP := $(CROSS_PREFIX)strip
|
||||
OpenBSD-x86_64_CCFLAGS := -I$(JAVA_HOME)/include -Isrc/main/lib/inc_linux -Os -fPIC -fvisibility=hidden
|
||||
OpenBSD-x86_64_LINKFLAGS := -shared
|
||||
OpenBSD-x86_64_LIBNAME := libmvndnative.so
|
||||
OpenBSD-x86_64_JANSI_FLAGS :=
|
||||
|
||||
SunOS-sparcv9_CC := $(CROSS_PREFIX)gcc
|
||||
SunOS-sparcv9_STRIP := $(CROSS_PREFIX)strip
|
||||
SunOS-sparcv9_CCFLAGS := -I$(JAVA_HOME)/include -Isrc/main/lib/inc_linux -O2s-fPIC -m64 -fvisibility=hidden
|
||||
SunOS-sparcv9_LINKFLAGS := -shared -static-libgcc
|
||||
SunOS-sparcv9_LIBNAME := libmvndnative.so
|
||||
SunOS-sparcv9_JANSI_FLAGS :=
|
||||
|
||||
HPUX-ia64_32_CC := cc
|
||||
HPUX-ia64_32_STRIP := strip
|
||||
HPUX-ia64_32_CCFLAGS := -Isrc/main/lib/inc_linux +Osize +z -Bhidden
|
||||
HPUX-ia64_32_LINKFLAGS := -b
|
||||
HPUX-ia64_32_LIBNAME := libmvndnative.so
|
||||
HPUX-ia64_32_JANSI_FLAGS :=
|
||||
|
||||
Mac-x86_CC := gcc
|
||||
Mac-x86_STRIP := strip -x
|
||||
Mac-x86_CCFLAGS := -I$(JAVA_HOME)/include -Isrc/main/lib/inc_mac -Os -fPIC -mmacosx-version-min=10.4 -fvisibility=hidden
|
||||
Mac-x86_LINKFLAGS := -dynamiclib
|
||||
Mac-x86_LIBNAME := libmvndnative.jnilib
|
||||
Mac-x86_JANSI_FLAGS := -DJANSI_ENABLE_LOCKING_STYLE=0
|
||||
|
||||
Mac-x86_64_CC := gcc -arch $(OS_ARCH)
|
||||
Mac-x86_64_STRIP := strip -x
|
||||
MAC_SDK := /Developer/SDKs/MacOSX10.10.sdk
|
||||
ifeq ($(wildcard MAC_SDK),)
|
||||
MAC_SDK := /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk
|
||||
endif
|
||||
Mac-x86_64_CCFLAGS := -I$(MAC_SDK)/System/Library/Frameworks/JavaVM.framework/Headers -Isrc/main/lib/inc_mac -Os -fPIC -mmacosx-version-min=10.6 -fvisibility=hidden
|
||||
Mac-x86_64_LINKFLAGS := -dynamiclib
|
||||
Mac-x86_64_LIBNAME := libmvndnative.jnilib
|
||||
Mac-x86_64_JANSI_FLAGS :=
|
||||
|
||||
Windows-x86_CC := $(CROSS_PREFIX)gcc
|
||||
Windows-x86_STRIP := $(CROSS_PREFIX)strip
|
||||
Windows-x86_CCFLAGS := -D_JNI_IMPLEMENTATION_ -Isrc/main/lib/inc_win -Os
|
||||
Windows-x86_LINKFLAGS := -Wl,--kill-at -shared -static-libgcc
|
||||
Windows-x86_LIBNAME := mvndnative.dll
|
||||
Windows-x86_JANSI_FLAGS :=
|
||||
|
||||
Windows-x86_64_CC := $(CROSS_PREFIX)gcc
|
||||
Windows-x86_64_STRIP := $(CROSS_PREFIX)strip
|
||||
Windows-x86_64_CCFLAGS := -D_JNI_IMPLEMENTATION_ -Isrc/main/lib/inc_win -Os
|
||||
Windows-x86_64_LINKFLAGS := -Wl,--kill-at -shared -static-libgcc
|
||||
Windows-x86_64_LIBNAME := mvndnative.dll
|
||||
Windows-x86_64_JANSI_FLAGS :=
|
||||
|
||||
|
||||
CC := $($(target)_CC)
|
||||
STRIP := $($(target)_STRIP)
|
||||
CCFLAGS := $($(target)_CCFLAGS)
|
||||
LINKFLAGS := $($(target)_LINKFLAGS)
|
||||
LIBNAME := $($(target)_LIBNAME)
|
||||
CCFLAGS := $(CCFLAGS)
|
273
native/docker/dockcross-linux-x86
Executable file
273
native/docker/dockcross-linux-x86
Executable file
@@ -0,0 +1,273 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
DEFAULT_DOCKCROSS_IMAGE=dockcross/linux-x86:latest
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Helpers
|
||||
#
|
||||
err() {
|
||||
echo -e >&2 ERROR: $@\\n
|
||||
}
|
||||
|
||||
die() {
|
||||
err $@
|
||||
exit 1
|
||||
}
|
||||
|
||||
has() {
|
||||
# eg. has command update
|
||||
local kind=$1
|
||||
local name=$2
|
||||
|
||||
type -t $kind:$name | grep -q function
|
||||
}
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Command handlers
|
||||
#
|
||||
command:update-image() {
|
||||
docker pull $FINAL_IMAGE
|
||||
}
|
||||
|
||||
help:update-image() {
|
||||
echo Pull the latest $FINAL_IMAGE .
|
||||
}
|
||||
|
||||
command:update-script() {
|
||||
if cmp -s <( docker run --rm $FINAL_IMAGE ) $0; then
|
||||
echo $0 is up to date
|
||||
else
|
||||
echo -n Updating $0 '... '
|
||||
docker run --rm $FINAL_IMAGE > $0 && echo ok
|
||||
fi
|
||||
}
|
||||
|
||||
help:update-image() {
|
||||
echo Update $0 from $FINAL_IMAGE .
|
||||
}
|
||||
|
||||
command:update() {
|
||||
command:update-image
|
||||
command:update-script
|
||||
}
|
||||
|
||||
help:update() {
|
||||
echo Pull the latest $FINAL_IMAGE, and then update $0 from that.
|
||||
}
|
||||
|
||||
command:help() {
|
||||
if [[ $# != 0 ]]; then
|
||||
if ! has command $1; then
|
||||
err \"$1\" is not an dockcross command
|
||||
command:help
|
||||
elif ! has help $1; then
|
||||
err No help found for \"$1\"
|
||||
else
|
||||
help:$1
|
||||
fi
|
||||
else
|
||||
cat >&2 <<ENDHELP
|
||||
Usage: dockcross [options] [--] command [args]
|
||||
|
||||
By default, run the given *command* in an dockcross Docker container.
|
||||
|
||||
The *options* can be one of:
|
||||
|
||||
--args|-a Extra args to the *docker run* command
|
||||
--image|-i Docker cross-compiler image to use
|
||||
--config|-c Bash script to source before running this script
|
||||
|
||||
|
||||
Additionally, there are special update commands:
|
||||
|
||||
update-image
|
||||
update-script
|
||||
update
|
||||
|
||||
For update command help use: $0 help <command>
|
||||
ENDHELP
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Option processing
|
||||
#
|
||||
special_update_command=''
|
||||
while [[ $# != 0 ]]; do
|
||||
case $1 in
|
||||
|
||||
--)
|
||||
shift
|
||||
break
|
||||
;;
|
||||
|
||||
--args|-a)
|
||||
ARG_ARGS="$2"
|
||||
shift 2
|
||||
;;
|
||||
|
||||
--config|-c)
|
||||
ARG_CONFIG="$2"
|
||||
shift 2
|
||||
;;
|
||||
|
||||
--image|-i)
|
||||
ARG_IMAGE="$2"
|
||||
shift 2
|
||||
;;
|
||||
update|update-image|update-script)
|
||||
special_update_command=$1
|
||||
break
|
||||
;;
|
||||
-*)
|
||||
err Unknown option \"$1\"
|
||||
command:help
|
||||
exit
|
||||
;;
|
||||
|
||||
*)
|
||||
break
|
||||
;;
|
||||
|
||||
esac
|
||||
done
|
||||
|
||||
# The precedence for options is:
|
||||
# 1. command-line arguments
|
||||
# 2. environment variables
|
||||
# 3. defaults
|
||||
|
||||
# Source the config file if it exists
|
||||
DEFAULT_DOCKCROSS_CONFIG=~/.dockcross
|
||||
FINAL_CONFIG=${ARG_CONFIG-${DOCKCROSS_CONFIG-$DEFAULT_DOCKCROSS_CONFIG}}
|
||||
|
||||
[[ -f "$FINAL_CONFIG" ]] && source "$FINAL_CONFIG"
|
||||
|
||||
# Set the docker image
|
||||
FINAL_IMAGE=${ARG_IMAGE-${DOCKCROSS_IMAGE-$DEFAULT_DOCKCROSS_IMAGE}}
|
||||
|
||||
# Handle special update command
|
||||
if [ "$special_update_command" != "" ]; then
|
||||
case $special_update_command in
|
||||
|
||||
update)
|
||||
command:update
|
||||
exit $?
|
||||
;;
|
||||
|
||||
update-image)
|
||||
command:update-image
|
||||
exit $?
|
||||
;;
|
||||
|
||||
update-script)
|
||||
command:update-script
|
||||
exit $?
|
||||
;;
|
||||
|
||||
esac
|
||||
fi
|
||||
|
||||
# Set the docker run extra args (if any)
|
||||
FINAL_ARGS=${ARG_ARGS-${DOCKCROSS_ARGS}}
|
||||
|
||||
# Bash on Ubuntu on Windows
|
||||
UBUNTU_ON_WINDOWS=$([ -e /proc/version ] && grep -l Microsoft /proc/version || echo "")
|
||||
# MSYS, Git Bash, etc.
|
||||
MSYS=$([ -e /proc/version ] && grep -l MINGW /proc/version || echo "")
|
||||
|
||||
if [ -z "$UBUNTU_ON_WINDOWS" -a -z "$MSYS" ]; then
|
||||
USER_IDS=(-e BUILDER_UID="$( id -u )" -e BUILDER_GID="$( id -g )" -e BUILDER_USER="$( id -un )" -e BUILDER_GROUP="$( id -gn )")
|
||||
fi
|
||||
|
||||
# Change the PWD when working in Docker on Windows
|
||||
if [ -n "$UBUNTU_ON_WINDOWS" ]; then
|
||||
WSL_ROOT="/mnt/"
|
||||
CFG_FILE=/etc/wsl.conf
|
||||
if [ -f "$CFG_FILE" ]; then
|
||||
CFG_CONTENT=$(cat $CFG_FILE | sed -r '/[^=]+=[^=]+/!d' | sed -r 's/\s+=\s/=/g')
|
||||
eval "$CFG_CONTENT"
|
||||
if [ -n "$root" ]; then
|
||||
WSL_ROOT=$root
|
||||
fi
|
||||
fi
|
||||
HOST_PWD=`pwd -P`
|
||||
HOST_PWD=${HOST_PWD/$WSL_ROOT//}
|
||||
elif [ -n "$MSYS" ]; then
|
||||
HOST_PWD=$PWD
|
||||
HOST_PWD=${HOST_PWD/\//}
|
||||
HOST_PWD=${HOST_PWD/\//:\/}
|
||||
else
|
||||
HOST_PWD=$PWD
|
||||
[ -L $HOST_PWD ] && HOST_PWD=$(readlink $HOST_PWD)
|
||||
fi
|
||||
|
||||
# Mount Additional Volumes
|
||||
if [ -z "$SSH_DIR" ]; then
|
||||
SSH_DIR="$HOME/.ssh"
|
||||
fi
|
||||
|
||||
HOST_VOLUMES=
|
||||
if [ -e "$SSH_DIR" -a -z "$MSYS" ]; then
|
||||
HOST_VOLUMES+="-v $SSH_DIR:/home/$(id -un)/.ssh"
|
||||
fi
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Now, finally, run the command in a container
|
||||
#
|
||||
TTY_ARGS=
|
||||
tty -s && [ -z "$MSYS" ] && TTY_ARGS=-ti
|
||||
CONTAINER_NAME=dockcross_$RANDOM
|
||||
docker run $TTY_ARGS --name $CONTAINER_NAME \
|
||||
-v "$HOST_PWD":/work \
|
||||
$HOST_VOLUMES \
|
||||
"${USER_IDS[@]}" \
|
||||
$FINAL_ARGS \
|
||||
$FINAL_IMAGE "$@"
|
||||
run_exit_code=$?
|
||||
|
||||
# Attempt to delete container
|
||||
rm_output=$(docker rm -f $CONTAINER_NAME 2>&1)
|
||||
rm_exit_code=$?
|
||||
if [[ $rm_exit_code != 0 ]]; then
|
||||
if [[ "$CIRCLECI" == "true" ]] && [[ $rm_output == *"Driver btrfs failed to remove"* ]]; then
|
||||
: # Ignore error because of https://circleci.com/docs/docker-btrfs-error/
|
||||
else
|
||||
echo "$rm_output"
|
||||
exit $rm_exit_code
|
||||
fi
|
||||
fi
|
||||
|
||||
exit $run_exit_code
|
||||
|
||||
################################################################################
|
||||
#
|
||||
# This image is not intended to be run manually.
|
||||
#
|
||||
# To create a dockcross helper script for the
|
||||
# dockcross/linux-x86:latest image, run:
|
||||
#
|
||||
# docker run --rm dockcross/linux-x86:latest > dockcross-linux-x86-latest
|
||||
# chmod +x dockcross-linux-x86-latest
|
||||
#
|
||||
# You may then wish to move the dockcross script to your PATH.
|
||||
#
|
||||
################################################################################
|
273
native/docker/dockcross-windows-static-x64
Executable file
273
native/docker/dockcross-windows-static-x64
Executable file
@@ -0,0 +1,273 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
DEFAULT_DOCKCROSS_IMAGE=dockcross/windows-static-x64:latest
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Helpers
|
||||
#
|
||||
err() {
|
||||
echo -e >&2 ERROR: $@\\n
|
||||
}
|
||||
|
||||
die() {
|
||||
err $@
|
||||
exit 1
|
||||
}
|
||||
|
||||
has() {
|
||||
# eg. has command update
|
||||
local kind=$1
|
||||
local name=$2
|
||||
|
||||
type -t $kind:$name | grep -q function
|
||||
}
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Command handlers
|
||||
#
|
||||
command:update-image() {
|
||||
docker pull $FINAL_IMAGE
|
||||
}
|
||||
|
||||
help:update-image() {
|
||||
echo Pull the latest $FINAL_IMAGE .
|
||||
}
|
||||
|
||||
command:update-script() {
|
||||
if cmp -s <( docker run --rm $FINAL_IMAGE ) $0; then
|
||||
echo $0 is up to date
|
||||
else
|
||||
echo -n Updating $0 '... '
|
||||
docker run --rm $FINAL_IMAGE > $0 && echo ok
|
||||
fi
|
||||
}
|
||||
|
||||
help:update-image() {
|
||||
echo Update $0 from $FINAL_IMAGE .
|
||||
}
|
||||
|
||||
command:update() {
|
||||
command:update-image
|
||||
command:update-script
|
||||
}
|
||||
|
||||
help:update() {
|
||||
echo Pull the latest $FINAL_IMAGE, and then update $0 from that.
|
||||
}
|
||||
|
||||
command:help() {
|
||||
if [[ $# != 0 ]]; then
|
||||
if ! has command $1; then
|
||||
err \"$1\" is not an dockcross command
|
||||
command:help
|
||||
elif ! has help $1; then
|
||||
err No help found for \"$1\"
|
||||
else
|
||||
help:$1
|
||||
fi
|
||||
else
|
||||
cat >&2 <<ENDHELP
|
||||
Usage: dockcross [options] [--] command [args]
|
||||
|
||||
By default, run the given *command* in an dockcross Docker container.
|
||||
|
||||
The *options* can be one of:
|
||||
|
||||
--args|-a Extra args to the *docker run* command
|
||||
--image|-i Docker cross-compiler image to use
|
||||
--config|-c Bash script to source before running this script
|
||||
|
||||
|
||||
Additionally, there are special update commands:
|
||||
|
||||
update-image
|
||||
update-script
|
||||
update
|
||||
|
||||
For update command help use: $0 help <command>
|
||||
ENDHELP
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Option processing
|
||||
#
|
||||
special_update_command=''
|
||||
while [[ $# != 0 ]]; do
|
||||
case $1 in
|
||||
|
||||
--)
|
||||
shift
|
||||
break
|
||||
;;
|
||||
|
||||
--args|-a)
|
||||
ARG_ARGS="$2"
|
||||
shift 2
|
||||
;;
|
||||
|
||||
--config|-c)
|
||||
ARG_CONFIG="$2"
|
||||
shift 2
|
||||
;;
|
||||
|
||||
--image|-i)
|
||||
ARG_IMAGE="$2"
|
||||
shift 2
|
||||
;;
|
||||
update|update-image|update-script)
|
||||
special_update_command=$1
|
||||
break
|
||||
;;
|
||||
-*)
|
||||
err Unknown option \"$1\"
|
||||
command:help
|
||||
exit
|
||||
;;
|
||||
|
||||
*)
|
||||
break
|
||||
;;
|
||||
|
||||
esac
|
||||
done
|
||||
|
||||
# The precedence for options is:
|
||||
# 1. command-line arguments
|
||||
# 2. environment variables
|
||||
# 3. defaults
|
||||
|
||||
# Source the config file if it exists
|
||||
DEFAULT_DOCKCROSS_CONFIG=~/.dockcross
|
||||
FINAL_CONFIG=${ARG_CONFIG-${DOCKCROSS_CONFIG-$DEFAULT_DOCKCROSS_CONFIG}}
|
||||
|
||||
[[ -f "$FINAL_CONFIG" ]] && source "$FINAL_CONFIG"
|
||||
|
||||
# Set the docker image
|
||||
FINAL_IMAGE=${ARG_IMAGE-${DOCKCROSS_IMAGE-$DEFAULT_DOCKCROSS_IMAGE}}
|
||||
|
||||
# Handle special update command
|
||||
if [ "$special_update_command" != "" ]; then
|
||||
case $special_update_command in
|
||||
|
||||
update)
|
||||
command:update
|
||||
exit $?
|
||||
;;
|
||||
|
||||
update-image)
|
||||
command:update-image
|
||||
exit $?
|
||||
;;
|
||||
|
||||
update-script)
|
||||
command:update-script
|
||||
exit $?
|
||||
;;
|
||||
|
||||
esac
|
||||
fi
|
||||
|
||||
# Set the docker run extra args (if any)
|
||||
FINAL_ARGS=${ARG_ARGS-${DOCKCROSS_ARGS}}
|
||||
|
||||
# Bash on Ubuntu on Windows
|
||||
UBUNTU_ON_WINDOWS=$([ -e /proc/version ] && grep -l Microsoft /proc/version || echo "")
|
||||
# MSYS, Git Bash, etc.
|
||||
MSYS=$([ -e /proc/version ] && grep -l MINGW /proc/version || echo "")
|
||||
|
||||
if [ -z "$UBUNTU_ON_WINDOWS" -a -z "$MSYS" ]; then
|
||||
USER_IDS=(-e BUILDER_UID="$( id -u )" -e BUILDER_GID="$( id -g )" -e BUILDER_USER="$( id -un )" -e BUILDER_GROUP="$( id -gn )")
|
||||
fi
|
||||
|
||||
# Change the PWD when working in Docker on Windows
|
||||
if [ -n "$UBUNTU_ON_WINDOWS" ]; then
|
||||
WSL_ROOT="/mnt/"
|
||||
CFG_FILE=/etc/wsl.conf
|
||||
if [ -f "$CFG_FILE" ]; then
|
||||
CFG_CONTENT=$(cat $CFG_FILE | sed -r '/[^=]+=[^=]+/!d' | sed -r 's/\s+=\s/=/g')
|
||||
eval "$CFG_CONTENT"
|
||||
if [ -n "$root" ]; then
|
||||
WSL_ROOT=$root
|
||||
fi
|
||||
fi
|
||||
HOST_PWD=`pwd -P`
|
||||
HOST_PWD=${HOST_PWD/$WSL_ROOT//}
|
||||
elif [ -n "$MSYS" ]; then
|
||||
HOST_PWD=$PWD
|
||||
HOST_PWD=${HOST_PWD/\//}
|
||||
HOST_PWD=${HOST_PWD/\//:\/}
|
||||
else
|
||||
HOST_PWD=$PWD
|
||||
[ -L $HOST_PWD ] && HOST_PWD=$(readlink $HOST_PWD)
|
||||
fi
|
||||
|
||||
# Mount Additional Volumes
|
||||
if [ -z "$SSH_DIR" ]; then
|
||||
SSH_DIR="$HOME/.ssh"
|
||||
fi
|
||||
|
||||
HOST_VOLUMES=
|
||||
if [ -e "$SSH_DIR" -a -z "$MSYS" ]; then
|
||||
HOST_VOLUMES+="-v $SSH_DIR:/home/$(id -un)/.ssh"
|
||||
fi
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Now, finally, run the command in a container
|
||||
#
|
||||
TTY_ARGS=
|
||||
tty -s && [ -z "$MSYS" ] && TTY_ARGS=-ti
|
||||
CONTAINER_NAME=dockcross_$RANDOM
|
||||
docker run $TTY_ARGS --name $CONTAINER_NAME \
|
||||
-v "$HOST_PWD":/work \
|
||||
$HOST_VOLUMES \
|
||||
"${USER_IDS[@]}" \
|
||||
$FINAL_ARGS \
|
||||
$FINAL_IMAGE "$@"
|
||||
run_exit_code=$?
|
||||
|
||||
# Attempt to delete container
|
||||
rm_output=$(docker rm -f $CONTAINER_NAME 2>&1)
|
||||
rm_exit_code=$?
|
||||
if [[ $rm_exit_code != 0 ]]; then
|
||||
if [[ "$CIRCLECI" == "true" ]] && [[ $rm_output == *"Driver btrfs failed to remove"* ]]; then
|
||||
: # Ignore error because of https://circleci.com/docs/docker-btrfs-error/
|
||||
else
|
||||
echo "$rm_output"
|
||||
exit $rm_exit_code
|
||||
fi
|
||||
fi
|
||||
|
||||
exit $run_exit_code
|
||||
|
||||
################################################################################
|
||||
#
|
||||
# This image is not intended to be run manually.
|
||||
#
|
||||
# To create a dockcross helper script for the
|
||||
# dockcross/windows-static-x64:latest image, run:
|
||||
#
|
||||
# docker run --rm dockcross/windows-static-x64:latest > dockcross-windows-static-x64-latest
|
||||
# chmod +x dockcross-windows-static-x64-latest
|
||||
#
|
||||
# You may then wish to move the dockcross script to your PATH.
|
||||
#
|
||||
################################################################################
|
273
native/docker/dockcross-windows-static-x86
Executable file
273
native/docker/dockcross-windows-static-x86
Executable file
@@ -0,0 +1,273 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
DEFAULT_DOCKCROSS_IMAGE=dockcross/windows-static-x86:latest
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Helpers
|
||||
#
|
||||
err() {
|
||||
echo -e >&2 ERROR: $@\\n
|
||||
}
|
||||
|
||||
die() {
|
||||
err $@
|
||||
exit 1
|
||||
}
|
||||
|
||||
has() {
|
||||
# eg. has command update
|
||||
local kind=$1
|
||||
local name=$2
|
||||
|
||||
type -t $kind:$name | grep -q function
|
||||
}
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Command handlers
|
||||
#
|
||||
command:update-image() {
|
||||
docker pull $FINAL_IMAGE
|
||||
}
|
||||
|
||||
help:update-image() {
|
||||
echo Pull the latest $FINAL_IMAGE .
|
||||
}
|
||||
|
||||
command:update-script() {
|
||||
if cmp -s <( docker run --rm $FINAL_IMAGE ) $0; then
|
||||
echo $0 is up to date
|
||||
else
|
||||
echo -n Updating $0 '... '
|
||||
docker run --rm $FINAL_IMAGE > $0 && echo ok
|
||||
fi
|
||||
}
|
||||
|
||||
help:update-image() {
|
||||
echo Update $0 from $FINAL_IMAGE .
|
||||
}
|
||||
|
||||
command:update() {
|
||||
command:update-image
|
||||
command:update-script
|
||||
}
|
||||
|
||||
help:update() {
|
||||
echo Pull the latest $FINAL_IMAGE, and then update $0 from that.
|
||||
}
|
||||
|
||||
command:help() {
|
||||
if [[ $# != 0 ]]; then
|
||||
if ! has command $1; then
|
||||
err \"$1\" is not an dockcross command
|
||||
command:help
|
||||
elif ! has help $1; then
|
||||
err No help found for \"$1\"
|
||||
else
|
||||
help:$1
|
||||
fi
|
||||
else
|
||||
cat >&2 <<ENDHELP
|
||||
Usage: dockcross [options] [--] command [args]
|
||||
|
||||
By default, run the given *command* in an dockcross Docker container.
|
||||
|
||||
The *options* can be one of:
|
||||
|
||||
--args|-a Extra args to the *docker run* command
|
||||
--image|-i Docker cross-compiler image to use
|
||||
--config|-c Bash script to source before running this script
|
||||
|
||||
|
||||
Additionally, there are special update commands:
|
||||
|
||||
update-image
|
||||
update-script
|
||||
update
|
||||
|
||||
For update command help use: $0 help <command>
|
||||
ENDHELP
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Option processing
|
||||
#
|
||||
special_update_command=''
|
||||
while [[ $# != 0 ]]; do
|
||||
case $1 in
|
||||
|
||||
--)
|
||||
shift
|
||||
break
|
||||
;;
|
||||
|
||||
--args|-a)
|
||||
ARG_ARGS="$2"
|
||||
shift 2
|
||||
;;
|
||||
|
||||
--config|-c)
|
||||
ARG_CONFIG="$2"
|
||||
shift 2
|
||||
;;
|
||||
|
||||
--image|-i)
|
||||
ARG_IMAGE="$2"
|
||||
shift 2
|
||||
;;
|
||||
update|update-image|update-script)
|
||||
special_update_command=$1
|
||||
break
|
||||
;;
|
||||
-*)
|
||||
err Unknown option \"$1\"
|
||||
command:help
|
||||
exit
|
||||
;;
|
||||
|
||||
*)
|
||||
break
|
||||
;;
|
||||
|
||||
esac
|
||||
done
|
||||
|
||||
# The precedence for options is:
|
||||
# 1. command-line arguments
|
||||
# 2. environment variables
|
||||
# 3. defaults
|
||||
|
||||
# Source the config file if it exists
|
||||
DEFAULT_DOCKCROSS_CONFIG=~/.dockcross
|
||||
FINAL_CONFIG=${ARG_CONFIG-${DOCKCROSS_CONFIG-$DEFAULT_DOCKCROSS_CONFIG}}
|
||||
|
||||
[[ -f "$FINAL_CONFIG" ]] && source "$FINAL_CONFIG"
|
||||
|
||||
# Set the docker image
|
||||
FINAL_IMAGE=${ARG_IMAGE-${DOCKCROSS_IMAGE-$DEFAULT_DOCKCROSS_IMAGE}}
|
||||
|
||||
# Handle special update command
|
||||
if [ "$special_update_command" != "" ]; then
|
||||
case $special_update_command in
|
||||
|
||||
update)
|
||||
command:update
|
||||
exit $?
|
||||
;;
|
||||
|
||||
update-image)
|
||||
command:update-image
|
||||
exit $?
|
||||
;;
|
||||
|
||||
update-script)
|
||||
command:update-script
|
||||
exit $?
|
||||
;;
|
||||
|
||||
esac
|
||||
fi
|
||||
|
||||
# Set the docker run extra args (if any)
|
||||
FINAL_ARGS=${ARG_ARGS-${DOCKCROSS_ARGS}}
|
||||
|
||||
# Bash on Ubuntu on Windows
|
||||
UBUNTU_ON_WINDOWS=$([ -e /proc/version ] && grep -l Microsoft /proc/version || echo "")
|
||||
# MSYS, Git Bash, etc.
|
||||
MSYS=$([ -e /proc/version ] && grep -l MINGW /proc/version || echo "")
|
||||
|
||||
if [ -z "$UBUNTU_ON_WINDOWS" -a -z "$MSYS" ]; then
|
||||
USER_IDS=(-e BUILDER_UID="$( id -u )" -e BUILDER_GID="$( id -g )" -e BUILDER_USER="$( id -un )" -e BUILDER_GROUP="$( id -gn )")
|
||||
fi
|
||||
|
||||
# Change the PWD when working in Docker on Windows
|
||||
if [ -n "$UBUNTU_ON_WINDOWS" ]; then
|
||||
WSL_ROOT="/mnt/"
|
||||
CFG_FILE=/etc/wsl.conf
|
||||
if [ -f "$CFG_FILE" ]; then
|
||||
CFG_CONTENT=$(cat $CFG_FILE | sed -r '/[^=]+=[^=]+/!d' | sed -r 's/\s+=\s/=/g')
|
||||
eval "$CFG_CONTENT"
|
||||
if [ -n "$root" ]; then
|
||||
WSL_ROOT=$root
|
||||
fi
|
||||
fi
|
||||
HOST_PWD=`pwd -P`
|
||||
HOST_PWD=${HOST_PWD/$WSL_ROOT//}
|
||||
elif [ -n "$MSYS" ]; then
|
||||
HOST_PWD=$PWD
|
||||
HOST_PWD=${HOST_PWD/\//}
|
||||
HOST_PWD=${HOST_PWD/\//:\/}
|
||||
else
|
||||
HOST_PWD=$PWD
|
||||
[ -L $HOST_PWD ] && HOST_PWD=$(readlink $HOST_PWD)
|
||||
fi
|
||||
|
||||
# Mount Additional Volumes
|
||||
if [ -z "$SSH_DIR" ]; then
|
||||
SSH_DIR="$HOME/.ssh"
|
||||
fi
|
||||
|
||||
HOST_VOLUMES=
|
||||
if [ -e "$SSH_DIR" -a -z "$MSYS" ]; then
|
||||
HOST_VOLUMES+="-v $SSH_DIR:/home/$(id -un)/.ssh"
|
||||
fi
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Now, finally, run the command in a container
|
||||
#
|
||||
TTY_ARGS=
|
||||
tty -s && [ -z "$MSYS" ] && TTY_ARGS=-ti
|
||||
CONTAINER_NAME=dockcross_$RANDOM
|
||||
docker run $TTY_ARGS --name $CONTAINER_NAME \
|
||||
-v "$HOST_PWD":/work \
|
||||
$HOST_VOLUMES \
|
||||
"${USER_IDS[@]}" \
|
||||
$FINAL_ARGS \
|
||||
$FINAL_IMAGE "$@"
|
||||
run_exit_code=$?
|
||||
|
||||
# Attempt to delete container
|
||||
rm_output=$(docker rm -f $CONTAINER_NAME 2>&1)
|
||||
rm_exit_code=$?
|
||||
if [[ $rm_exit_code != 0 ]]; then
|
||||
if [[ "$CIRCLECI" == "true" ]] && [[ $rm_output == *"Driver btrfs failed to remove"* ]]; then
|
||||
: # Ignore error because of https://circleci.com/docs/docker-btrfs-error/
|
||||
else
|
||||
echo "$rm_output"
|
||||
exit $rm_exit_code
|
||||
fi
|
||||
fi
|
||||
|
||||
exit $run_exit_code
|
||||
|
||||
################################################################################
|
||||
#
|
||||
# This image is not intended to be run manually.
|
||||
#
|
||||
# To create a dockcross helper script for the
|
||||
# dockcross/windows-static-x86:latest image, run:
|
||||
#
|
||||
# docker run --rm dockcross/windows-static-x86:latest > dockcross-windows-static-x86-latest
|
||||
# chmod +x dockcross-windows-static-x86-latest
|
||||
#
|
||||
# You may then wish to move the dockcross script to your PATH.
|
||||
#
|
||||
################################################################################
|
141
native/pom.xml
Normal file
141
native/pom.xml
Normal file
@@ -0,0 +1,141 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
Copyright (C) 2009-2017 the original author(s).
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>org.mvndaemon.mvnd</groupId>
|
||||
<artifactId>mvnd</artifactId>
|
||||
<version>0.5.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>mvnd-native</artifactId>
|
||||
|
||||
<packaging>jar</packaging>
|
||||
<name>Maven Daemon - Native Library</name>
|
||||
|
||||
<build>
|
||||
<resources>
|
||||
<resource>
|
||||
<directory>src/main/resources</directory>
|
||||
<filtering>true</filtering>
|
||||
<includes>
|
||||
<include>**/*.properties</include>
|
||||
</includes>
|
||||
</resource>
|
||||
<resource>
|
||||
<directory>src/main/resources</directory>
|
||||
<filtering>false</filtering>
|
||||
<excludes>
|
||||
<exclude>**/*.properties</exclude>
|
||||
</excludes>
|
||||
</resource>
|
||||
</resources>
|
||||
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>3.8.1</version>
|
||||
<configuration>
|
||||
<!-- parent pom 1.11 forces version instead of using property -->
|
||||
<source>${jdkTarget}</source>
|
||||
<target>${jdkTarget}</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>exec-maven-plugin</artifactId>
|
||||
<version>3.0.0</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>generate-graalvm-info</id>
|
||||
<phase>process-classes</phase>
|
||||
<goals>
|
||||
<goal>java</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<includeProjectDependencies>true</includeProjectDependencies>
|
||||
<classpathScope>test</classpathScope>
|
||||
<executableDependency>
|
||||
<groupId>info.picocli</groupId>
|
||||
<artifactId>picocli-codegen</artifactId>
|
||||
</executableDependency>
|
||||
<mainClass>picocli.codegen.aot.graalvm.JniConfigGenerator</mainClass>
|
||||
<arguments>
|
||||
<argument>org.mvndaemon.mvnd.nativ.CLibrary</argument>
|
||||
<argument>-o=target/classes/META-INF/native-image/mvndnative/jni-config.json</argument>
|
||||
</arguments>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>info.picocli</groupId>
|
||||
<artifactId>picocli-codegen</artifactId>
|
||||
<version>4.5.2</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<version>3.0.0-M5</version>
|
||||
<configuration>
|
||||
<redirectTestOutputToFile>true</redirectTestOutputToFile>
|
||||
<forkCount>1</forkCount>
|
||||
<reuseForks>true</reuseForks>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.junit.jupiter</groupId>
|
||||
<artifactId>junit-jupiter</artifactId>
|
||||
<version>5.7.0</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.junit.jupiter</groupId>
|
||||
<artifactId>junit-jupiter-params</artifactId>
|
||||
<version>5.7.0</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>info.picocli</groupId>
|
||||
<artifactId>picocli-codegen</artifactId>
|
||||
<version>4.5.2</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<profiles>
|
||||
<profile>
|
||||
<id>jdk15+</id>
|
||||
<activation>
|
||||
<jdk>[15,)</jdk>
|
||||
</activation>
|
||||
<properties>
|
||||
<jdkTarget>1.7</jdkTarget>
|
||||
<javadocSource>7</javadocSource>
|
||||
</properties>
|
||||
</profile>
|
||||
</profiles>
|
||||
|
||||
</project>
|
39
native/src/main/java/org/mvndaemon/mvnd/nativ/CLibrary.java
Normal file
39
native/src/main/java/org/mvndaemon/mvnd/nativ/CLibrary.java
Normal file
@@ -0,0 +1,39 @@
|
||||
/*
|
||||
* Copyright (C) 2009-2017 the original author(s).
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.mvndaemon.mvnd.nativ;
|
||||
|
||||
/**
|
||||
* Interface to access some low level POSIX functions, loaded by
|
||||
* <a href="http://fusesource.github.io/hawtjni/">HawtJNI</a> Runtime
|
||||
* as <code>jansi</code> library.
|
||||
*
|
||||
* @author <a href="http://hiramchirino.com">Hiram Chirino</a>
|
||||
* @see MvndNativeLoader
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
public class CLibrary {
|
||||
|
||||
static {
|
||||
MvndNativeLoader.initialize();
|
||||
}
|
||||
|
||||
public static native int setenv(String name, String value);
|
||||
|
||||
public static native int chdir(String path);
|
||||
|
||||
public static native int getOsxMemoryInfo(long[] totalAndAvailMem);
|
||||
|
||||
}
|
@@ -0,0 +1,393 @@
|
||||
/*--------------------------------------------------------------------------
|
||||
* Copyright 2007 Taro L. Saito
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*--------------------------------------------------------------------------*/
|
||||
package org.mvndaemon.mvnd.nativ;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.FilenameFilter;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.net.URL;
|
||||
import java.util.Arrays;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Properties;
|
||||
import java.util.Random;
|
||||
|
||||
/**
|
||||
* Set the system properties, library.mvndnative.path, library.mvndnative.name,
|
||||
* appropriately so that mvndnative can find *.dll, *.jnilib and
|
||||
* *.so files, according to the current OS (win, linux, mac).
|
||||
* <p>
|
||||
* The library files are automatically extracted from this project's package
|
||||
* (JAR).
|
||||
* <p>
|
||||
* usage: call {@link #initialize()} before using mvndnative.
|
||||
*/
|
||||
public class MvndNativeLoader {
|
||||
|
||||
private static boolean extracted = false;
|
||||
private static String nativeLibraryPath;
|
||||
private static String nativeLibrarySourceUrl;
|
||||
|
||||
/**
|
||||
* Loads mvndnative native library.
|
||||
*
|
||||
* @return True if mvndnative native library is successfully loaded; false
|
||||
* otherwise.
|
||||
*/
|
||||
public static synchronized boolean initialize() {
|
||||
// only cleanup before the first extract
|
||||
if (!extracted) {
|
||||
cleanup();
|
||||
}
|
||||
try {
|
||||
loadmvndnativeNativeLibrary();
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("Unable to load mvndnative native library", e);
|
||||
}
|
||||
return extracted;
|
||||
}
|
||||
|
||||
public static String getNativeLibraryPath() {
|
||||
return nativeLibraryPath;
|
||||
}
|
||||
|
||||
public static String getNativeLibrarySourceUrl() {
|
||||
return nativeLibrarySourceUrl;
|
||||
}
|
||||
|
||||
private static File getTempDir() {
|
||||
return new File(System.getProperty("mvndnative.tmpdir", System.getProperty("java.io.tmpdir")));
|
||||
}
|
||||
|
||||
/**
|
||||
* Deleted old native libraries e.g. on Windows the DLL file is not removed
|
||||
* on VM-Exit (bug #80)
|
||||
*/
|
||||
static void cleanup() {
|
||||
String tempFolder = getTempDir().getAbsolutePath();
|
||||
File dir = new File(tempFolder);
|
||||
|
||||
File[] nativeLibFiles = dir.listFiles(new FilenameFilter() {
|
||||
private final String searchPattern = "mvndnative-" + getVersion();
|
||||
|
||||
public boolean accept(File dir, String name) {
|
||||
return name.startsWith(searchPattern) && !name.endsWith(".lck");
|
||||
}
|
||||
});
|
||||
if (nativeLibFiles != null) {
|
||||
for (File nativeLibFile : nativeLibFiles) {
|
||||
File lckFile = new File(nativeLibFile.getAbsolutePath() + ".lck");
|
||||
if (!lckFile.exists()) {
|
||||
try {
|
||||
nativeLibFile.delete();
|
||||
} catch (SecurityException e) {
|
||||
System.err.println("Failed to delete old native lib" + e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static int readNBytes(InputStream in, byte[] b) throws IOException {
|
||||
int n = 0;
|
||||
int len = b.length;
|
||||
while (n < len) {
|
||||
int count = in.read(b, n, len - n);
|
||||
if (count <= 0)
|
||||
break;
|
||||
n += count;
|
||||
}
|
||||
return n;
|
||||
}
|
||||
|
||||
private static String contentsEquals(InputStream in1, InputStream in2) throws IOException {
|
||||
byte[] buffer1 = new byte[8192];
|
||||
byte[] buffer2 = new byte[8192];
|
||||
int numRead1;
|
||||
int numRead2;
|
||||
while (true) {
|
||||
numRead1 = readNBytes(in1, buffer1);
|
||||
numRead2 = readNBytes(in2, buffer2);
|
||||
if (numRead1 > 0) {
|
||||
if (numRead2 <= 0) {
|
||||
return "EOF on second stream but not first";
|
||||
}
|
||||
if (numRead2 != numRead1) {
|
||||
return "Read size different (" + numRead1 + " vs " + numRead2 + ")";
|
||||
}
|
||||
// Otherwise same number of bytes read
|
||||
if (!Arrays.equals(buffer1, buffer2)) {
|
||||
return "Content differs";
|
||||
}
|
||||
// Otherwise same bytes read, so continue ...
|
||||
} else {
|
||||
// Nothing more in stream 1 ...
|
||||
if (numRead2 > 0) {
|
||||
return "EOF on first stream but not second";
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Extracts and loads the specified library file to the target folder
|
||||
*
|
||||
* @param libFolderForCurrentOS Library path.
|
||||
* @param libraryFileName Library name.
|
||||
* @param targetFolder Target folder.
|
||||
* @return
|
||||
*/
|
||||
private static boolean extractAndLoadLibraryFile(String libFolderForCurrentOS, String libraryFileName,
|
||||
String targetFolder) {
|
||||
String nativeLibraryFilePath = libFolderForCurrentOS + "/" + libraryFileName;
|
||||
// Include architecture name in temporary filename in order to avoid conflicts
|
||||
// when multiple JVMs with different architectures running at the same time
|
||||
String uuid = randomUUID();
|
||||
String extractedLibFileName = String.format("mvndnative-%s-%s-%s", getVersion(), uuid, libraryFileName);
|
||||
String extractedLckFileName = extractedLibFileName + ".lck";
|
||||
|
||||
File extractedLibFile = new File(targetFolder, extractedLibFileName);
|
||||
File extractedLckFile = new File(targetFolder, extractedLckFileName);
|
||||
|
||||
try {
|
||||
// Extract a native library file into the target directory
|
||||
InputStream in = MvndNativeLoader.class.getResourceAsStream(nativeLibraryFilePath);
|
||||
try {
|
||||
if (!extractedLckFile.exists()) {
|
||||
new FileOutputStream(extractedLckFile).close();
|
||||
}
|
||||
OutputStream out = new FileOutputStream(extractedLibFile);
|
||||
try {
|
||||
copy(in, out);
|
||||
} finally {
|
||||
out.close();
|
||||
}
|
||||
} finally {
|
||||
// Delete the extracted lib file on JVM exit.
|
||||
extractedLibFile.deleteOnExit();
|
||||
extractedLckFile.deleteOnExit();
|
||||
in.close();
|
||||
}
|
||||
|
||||
// Set executable (x) flag to enable Java to load the native library
|
||||
extractedLibFile.setReadable(true);
|
||||
extractedLibFile.setWritable(true, true);
|
||||
extractedLibFile.setExecutable(true);
|
||||
|
||||
// Check whether the contents are properly copied from the resource folder
|
||||
InputStream nativeIn = MvndNativeLoader.class.getResourceAsStream(nativeLibraryFilePath);
|
||||
try {
|
||||
InputStream extractedLibIn = new FileInputStream(extractedLibFile);
|
||||
try {
|
||||
String eq = contentsEquals(nativeIn, extractedLibIn);
|
||||
if (eq != null) {
|
||||
throw new RuntimeException(
|
||||
String.format("Failed to write a native library file at %s because %s", extractedLibFile, eq));
|
||||
}
|
||||
} finally {
|
||||
extractedLibIn.close();
|
||||
}
|
||||
} finally {
|
||||
nativeIn.close();
|
||||
}
|
||||
|
||||
// Load library
|
||||
if (loadNativeLibrary(extractedLibFile)) {
|
||||
nativeLibrarySourceUrl = MvndNativeLoader.class.getResource(nativeLibraryFilePath).toExternalForm();
|
||||
return true;
|
||||
}
|
||||
} catch (IOException e) {
|
||||
System.err.println(e.getMessage());
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private static String randomUUID() {
|
||||
return Long.toHexString(new Random().nextLong());
|
||||
}
|
||||
|
||||
private static void copy(InputStream in, OutputStream out) throws IOException {
|
||||
byte[] buf = new byte[8192];
|
||||
int n;
|
||||
while ((n = in.read(buf)) > 0) {
|
||||
out.write(buf, 0, n);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads native library using the given path and name of the library.
|
||||
*
|
||||
* @param libPath Path of the native library.
|
||||
* @return True for successfully loading; false otherwise.
|
||||
*/
|
||||
private static boolean loadNativeLibrary(File libPath) {
|
||||
if (libPath.exists()) {
|
||||
|
||||
try {
|
||||
String path = libPath.getAbsolutePath();
|
||||
System.load(path);
|
||||
nativeLibraryPath = path;
|
||||
return true;
|
||||
} catch (UnsatisfiedLinkError e) {
|
||||
System.err.println("Failed to load native library:" + libPath.getName() + ". osinfo: "
|
||||
+ OSInfo.getNativeLibFolderPathForCurrentOS());
|
||||
System.err.println(e);
|
||||
return false;
|
||||
}
|
||||
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads mvndnative library using given path and name of the library.
|
||||
*
|
||||
* @throws
|
||||
*/
|
||||
private static void loadmvndnativeNativeLibrary() throws Exception {
|
||||
if (extracted) {
|
||||
return;
|
||||
}
|
||||
|
||||
List<String> triedPaths = new LinkedList<String>();
|
||||
|
||||
// Try loading library from library.mvndnative.path library path */
|
||||
String mvndnativeNativeLibraryPath = System.getProperty("library.mvndnative.path");
|
||||
String mvndnativeNativeLibraryName = System.getProperty("library.mvndnative.name");
|
||||
if (mvndnativeNativeLibraryName == null) {
|
||||
mvndnativeNativeLibraryName = System.mapLibraryName("mvndnative");
|
||||
assert mvndnativeNativeLibraryName != null;
|
||||
if (mvndnativeNativeLibraryName.endsWith(".dylib")) {
|
||||
mvndnativeNativeLibraryName = mvndnativeNativeLibraryName.replace(".dylib", ".jnilib");
|
||||
}
|
||||
}
|
||||
|
||||
if (mvndnativeNativeLibraryPath != null) {
|
||||
String withOs = mvndnativeNativeLibraryPath + "/" + OSInfo.getNativeLibFolderPathForCurrentOS();
|
||||
if (loadNativeLibrary(new File(withOs, mvndnativeNativeLibraryName))) {
|
||||
extracted = true;
|
||||
return;
|
||||
} else {
|
||||
triedPaths.add(withOs);
|
||||
}
|
||||
|
||||
if (loadNativeLibrary(new File(mvndnativeNativeLibraryPath, mvndnativeNativeLibraryName))) {
|
||||
extracted = true;
|
||||
return;
|
||||
} else {
|
||||
triedPaths.add(mvndnativeNativeLibraryPath);
|
||||
}
|
||||
}
|
||||
|
||||
// Load the os-dependent library from the jar file
|
||||
String packagePath = MvndNativeLoader.class.getPackage().getName().replace('.', '/');
|
||||
mvndnativeNativeLibraryPath = String.format("/%s/%s", packagePath, OSInfo.getNativeLibFolderPathForCurrentOS());
|
||||
boolean hasNativeLib = hasResource(mvndnativeNativeLibraryPath + "/" + mvndnativeNativeLibraryName);
|
||||
|
||||
if (hasNativeLib) {
|
||||
// temporary library folder
|
||||
String tempFolder = getTempDir().getAbsolutePath();
|
||||
// Try extracting the library from jar
|
||||
if (extractAndLoadLibraryFile(mvndnativeNativeLibraryPath, mvndnativeNativeLibraryName, tempFolder)) {
|
||||
extracted = true;
|
||||
return;
|
||||
} else {
|
||||
triedPaths.add(mvndnativeNativeLibraryPath);
|
||||
}
|
||||
}
|
||||
|
||||
// As a last resort try from java.library.path
|
||||
String javaLibraryPath = System.getProperty("java.library.path", "");
|
||||
for (String ldPath : javaLibraryPath.split(File.pathSeparator)) {
|
||||
if (ldPath.isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
if (loadNativeLibrary(new File(ldPath, mvndnativeNativeLibraryName))) {
|
||||
extracted = true;
|
||||
return;
|
||||
} else {
|
||||
triedPaths.add(ldPath);
|
||||
}
|
||||
}
|
||||
|
||||
extracted = false;
|
||||
throw new Exception(String.format("No native library found for os.name=%s, os.arch=%s, paths=[%s]",
|
||||
OSInfo.getOSName(), OSInfo.getArchName(), join(triedPaths, File.pathSeparator)));
|
||||
}
|
||||
|
||||
private static boolean hasResource(String path) {
|
||||
return MvndNativeLoader.class.getResource(path) != null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return The major version of the mvndnative library.
|
||||
*/
|
||||
public static int getMajorVersion() {
|
||||
String[] c = getVersion().split("\\.");
|
||||
return (c.length > 0) ? Integer.parseInt(c[0]) : 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return The minor version of the mvndnative library.
|
||||
*/
|
||||
public static int getMinorVersion() {
|
||||
String[] c = getVersion().split("\\.");
|
||||
return (c.length > 1) ? Integer.parseInt(c[1]) : 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return The version of the mvndnative library.
|
||||
*/
|
||||
public static String getVersion() {
|
||||
|
||||
URL versionFile = MvndNativeLoader.class.getResource("/META-INF/maven/org.mvndaemon.mvnd/mvnd-native/pom.properties");
|
||||
|
||||
String version = "unknown";
|
||||
try {
|
||||
if (versionFile != null) {
|
||||
Properties versionData = new Properties();
|
||||
versionData.load(versionFile.openStream());
|
||||
version = versionData.getProperty("version", version);
|
||||
version = version.trim().replaceAll("[^0-9\\.]", "");
|
||||
}
|
||||
} catch (IOException e) {
|
||||
System.err.println(e);
|
||||
}
|
||||
return version;
|
||||
}
|
||||
|
||||
private static String join(List<String> list, String separator) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
boolean first = true;
|
||||
for (String item : list) {
|
||||
if (first)
|
||||
first = false;
|
||||
else
|
||||
sb.append(separator);
|
||||
|
||||
sb.append(item);
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
}
|
213
native/src/main/java/org/mvndaemon/mvnd/nativ/OSInfo.java
Normal file
213
native/src/main/java/org/mvndaemon/mvnd/nativ/OSInfo.java
Normal file
@@ -0,0 +1,213 @@
|
||||
/*--------------------------------------------------------------------------
|
||||
* Copyright 2008 Taro L. Saito
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*--------------------------------------------------------------------------*/
|
||||
package org.mvndaemon.mvnd.nativ;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.HashMap;
|
||||
import java.util.Locale;
|
||||
|
||||
/**
|
||||
* Provides OS name and architecture name.
|
||||
*
|
||||
* @author leo
|
||||
*/
|
||||
public class OSInfo {
|
||||
|
||||
public static final String X86 = "x86";
|
||||
public static final String X86_64 = "x86_64";
|
||||
public static final String IA64_32 = "ia64_32";
|
||||
public static final String IA64 = "ia64";
|
||||
public static final String PPC = "ppc";
|
||||
public static final String PPC64 = "ppc64";
|
||||
|
||||
private static final HashMap<String, String> archMapping = new HashMap<String, String>();
|
||||
static {
|
||||
// x86 mappings
|
||||
archMapping.put(X86, X86);
|
||||
archMapping.put("i386", X86);
|
||||
archMapping.put("i486", X86);
|
||||
archMapping.put("i586", X86);
|
||||
archMapping.put("i686", X86);
|
||||
archMapping.put("pentium", X86);
|
||||
|
||||
// x86_64 mappings
|
||||
archMapping.put(X86_64, X86_64);
|
||||
archMapping.put("amd64", X86_64);
|
||||
archMapping.put("em64t", X86_64);
|
||||
archMapping.put("universal", X86_64); // Needed for openjdk7 in Mac
|
||||
|
||||
// Itenium 64-bit mappings
|
||||
archMapping.put(IA64, IA64);
|
||||
archMapping.put("ia64w", IA64);
|
||||
|
||||
// Itenium 32-bit mappings, usually an HP-UX construct
|
||||
archMapping.put(IA64_32, IA64_32);
|
||||
archMapping.put("ia64n", IA64_32);
|
||||
|
||||
// PowerPC mappings
|
||||
archMapping.put(PPC, PPC);
|
||||
archMapping.put("power", PPC);
|
||||
archMapping.put("powerpc", PPC);
|
||||
archMapping.put("power_pc", PPC);
|
||||
archMapping.put("power_rs", PPC);
|
||||
|
||||
// TODO: PowerPC 64bit mappings
|
||||
archMapping.put(PPC64, PPC64);
|
||||
archMapping.put("power64", PPC64);
|
||||
archMapping.put("powerpc64", PPC64);
|
||||
archMapping.put("power_pc64", PPC64);
|
||||
archMapping.put("power_rs64", PPC64);
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
if (args.length >= 1) {
|
||||
if ("--os".equals(args[0])) {
|
||||
System.out.print(getOSName());
|
||||
return;
|
||||
} else if ("--arch".equals(args[0])) {
|
||||
System.out.print(getArchName());
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
System.out.print(getNativeLibFolderPathForCurrentOS());
|
||||
}
|
||||
|
||||
public static String getNativeLibFolderPathForCurrentOS() {
|
||||
return getOSName() + "/" + getArchName();
|
||||
}
|
||||
|
||||
public static String getOSName() {
|
||||
return translateOSNameToFolderName(System.getProperty("os.name"));
|
||||
}
|
||||
|
||||
public static boolean isAndroid() {
|
||||
return System.getProperty("java.runtime.name", "").toLowerCase().contains("android");
|
||||
}
|
||||
|
||||
public static boolean isAlpine() {
|
||||
try {
|
||||
Process p = Runtime.getRuntime().exec("cat /etc/os-release | grep ^ID");
|
||||
p.waitFor();
|
||||
|
||||
InputStream in = p.getInputStream();
|
||||
try {
|
||||
return readFully(in).toLowerCase().contains("alpine");
|
||||
} finally {
|
||||
in.close();
|
||||
}
|
||||
|
||||
} catch (Throwable e) {
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static String getHardwareName() {
|
||||
try {
|
||||
Process p = Runtime.getRuntime().exec("uname -m");
|
||||
p.waitFor();
|
||||
|
||||
InputStream in = p.getInputStream();
|
||||
try {
|
||||
return readFully(in);
|
||||
} finally {
|
||||
in.close();
|
||||
}
|
||||
} catch (Throwable e) {
|
||||
System.err.println("Error while running uname -m: " + e.getMessage());
|
||||
return "unknown";
|
||||
}
|
||||
}
|
||||
|
||||
private static String readFully(InputStream in) throws IOException {
|
||||
int readLen = 0;
|
||||
ByteArrayOutputStream b = new ByteArrayOutputStream();
|
||||
byte[] buf = new byte[32];
|
||||
while ((readLen = in.read(buf, 0, buf.length)) >= 0) {
|
||||
b.write(buf, 0, readLen);
|
||||
}
|
||||
return b.toString();
|
||||
}
|
||||
|
||||
static String resolveArmArchType() {
|
||||
if (System.getProperty("os.name").contains("Linux")) {
|
||||
String armType = getHardwareName();
|
||||
// armType (uname -m) can be armv5t, armv5te, armv5tej, armv5tejl, armv6, armv7, armv7l, aarch64, i686
|
||||
if (armType.startsWith("armv6")) {
|
||||
// Raspberry PI
|
||||
return "armv6";
|
||||
} else if (armType.startsWith("armv7")) {
|
||||
// Generic
|
||||
return "armv7";
|
||||
} else if (armType.startsWith("armv5")) {
|
||||
// Use armv5, soft-float ABI
|
||||
return "arm";
|
||||
} else if (armType.equals("aarch64")) {
|
||||
// Use arm64
|
||||
return "arm64";
|
||||
}
|
||||
|
||||
// Java 1.8 introduces a system property to determine armel or armhf
|
||||
// http://bugs.java.com/bugdatabase/view_bug.do?bug_id=8005545
|
||||
String abi = System.getProperty("sun.arch.abi");
|
||||
if (abi != null && abi.startsWith("gnueabihf")) {
|
||||
return "armv7";
|
||||
}
|
||||
}
|
||||
// Use armv5, soft-float ABI
|
||||
return "arm";
|
||||
}
|
||||
|
||||
public static String getArchName() {
|
||||
String osArch = System.getProperty("os.arch");
|
||||
// For Android
|
||||
if (isAndroid()) {
|
||||
return "android-arm";
|
||||
}
|
||||
|
||||
if (osArch.startsWith("arm")) {
|
||||
osArch = resolveArmArchType();
|
||||
} else {
|
||||
String lc = osArch.toLowerCase(Locale.US);
|
||||
if (archMapping.containsKey(lc))
|
||||
return archMapping.get(lc);
|
||||
}
|
||||
return translateArchNameToFolderName(osArch);
|
||||
}
|
||||
|
||||
static String translateOSNameToFolderName(String osName) {
|
||||
if (osName.contains("Windows")) {
|
||||
return "Windows";
|
||||
} else if (osName.contains("Mac") || osName.contains("Darwin")) {
|
||||
return "Mac";
|
||||
// } else if (isAlpine()) {
|
||||
// return "Linux-Alpine";
|
||||
} else if (osName.contains("Linux")) {
|
||||
return "Linux";
|
||||
} else if (osName.contains("AIX")) {
|
||||
return "AIX";
|
||||
} else {
|
||||
return osName.replaceAll("\\W", "");
|
||||
}
|
||||
}
|
||||
|
||||
static String translateArchNameToFolderName(String archName) {
|
||||
return archName.replaceAll("\\W", "");
|
||||
}
|
||||
}
|
1959
native/src/main/native/inc_linux/jni.h
Normal file
1959
native/src/main/native/inc_linux/jni.h
Normal file
File diff suppressed because it is too large
Load Diff
24
native/src/main/native/inc_linux/jni_md.h
Normal file
24
native/src/main/native/inc_linux/jni_md.h
Normal file
@@ -0,0 +1,24 @@
|
||||
/*
|
||||
* %W% %E%
|
||||
*
|
||||
* Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
|
||||
* ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
|
||||
*/
|
||||
|
||||
#ifndef _JAVASOFT_JNI_MD_H_
|
||||
#define _JAVASOFT_JNI_MD_H_
|
||||
|
||||
#define JNIEXPORT __attribute__((__visibility__("default")))
|
||||
#define JNIIMPORT
|
||||
#define JNICALL
|
||||
|
||||
typedef int jint;
|
||||
#ifdef _LP64 /* 64-bit Solaris */
|
||||
typedef long jlong;
|
||||
#else
|
||||
typedef long long jlong;
|
||||
#endif
|
||||
|
||||
typedef signed char jbyte;
|
||||
|
||||
#endif /* !_JAVASOFT_JNI_MD_H_ */
|
1961
native/src/main/native/inc_mac/jni.h
Normal file
1961
native/src/main/native/inc_mac/jni.h
Normal file
File diff suppressed because it is too large
Load Diff
23
native/src/main/native/inc_mac/jni_md.h
Normal file
23
native/src/main/native/inc_mac/jni_md.h
Normal file
@@ -0,0 +1,23 @@
|
||||
/*
|
||||
* @(#)jni_md.h 1.19 05/11/17
|
||||
*
|
||||
* Copyright 2006 Sun Microsystems, Inc. All rights reserved.
|
||||
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
|
||||
*/
|
||||
|
||||
#ifndef _JAVASOFT_JNI_MD_H_
|
||||
#define _JAVASOFT_JNI_MD_H_
|
||||
|
||||
#define JNIEXPORT __attribute__((visibility("default")))
|
||||
#define JNIIMPORT
|
||||
#define JNICALL
|
||||
|
||||
#if defined(__LP64__) && __LP64__ /* for -Wundef */
|
||||
typedef int jint;
|
||||
#else
|
||||
typedef long jint;
|
||||
#endif
|
||||
typedef long long jlong;
|
||||
typedef signed char jbyte;
|
||||
|
||||
#endif /* !_JAVASOFT_JNI_MD_H_ */
|
1951
native/src/main/native/inc_win/jni.h
Normal file
1951
native/src/main/native/inc_win/jni.h
Normal file
File diff suppressed because it is too large
Load Diff
19
native/src/main/native/inc_win/jni_md.h
Normal file
19
native/src/main/native/inc_win/jni_md.h
Normal file
@@ -0,0 +1,19 @@
|
||||
/*
|
||||
* @(#)jni_md.h 1.14 03/12/19
|
||||
*
|
||||
* Copyright 2004 Sun Microsystems, Inc. All rights reserved.
|
||||
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
|
||||
*/
|
||||
|
||||
#ifndef _JAVASOFT_JNI_MD_H_
|
||||
#define _JAVASOFT_JNI_MD_H_
|
||||
|
||||
#define JNIEXPORT __declspec(dllexport)
|
||||
#define JNIIMPORT __declspec(dllimport)
|
||||
#define JNICALL __stdcall
|
||||
|
||||
typedef long jint;
|
||||
typedef __int64 jlong;
|
||||
typedef signed char jbyte;
|
||||
|
||||
#endif /* !_JAVASOFT_JNI_MD_H_ */
|
138
native/src/main/native/mvndnative.c
Normal file
138
native/src/main/native/mvndnative.c
Normal file
@@ -0,0 +1,138 @@
|
||||
/*******************************************************************************
|
||||
* Copyright (C) 2009-2017 the original author(s).
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*******************************************************************************/
|
||||
#include "mvndnative.h"
|
||||
|
||||
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) {
|
||||
return JNI_VERSION_1_2;
|
||||
}
|
||||
|
||||
#define CLibrary_NATIVE(func) Java_org_mvndaemon_mvnd_nativ_CLibrary_##func
|
||||
|
||||
#if defined(_WIN32) || defined(_WIN64)
|
||||
|
||||
wchar_t* java_to_wchar(JNIEnv* env, jstring string) {
|
||||
jsize len = (*env)->GetStringLength(env, string);
|
||||
wchar_t* str = (wchar_t*) malloc(sizeof(wchar_t) * (len + 1));
|
||||
(*env)->GetStringRegion(env, string, 0, len, (jchar*) str);
|
||||
str[len] = L'\0';
|
||||
return str;
|
||||
}
|
||||
|
||||
JNIEXPORT jint JNICALL CLibrary_NATIVE(chdir)(JNIEnv *env, jobject thiz, jstring path)
|
||||
{
|
||||
jint rc = 0;
|
||||
wchar_t* nativePath = path != NULL ? java_to_wchar(env, path) : NULL;
|
||||
rc = (jint) SetCurrentDirectoryW(nativePath);
|
||||
if (nativePath) free(nativePath);
|
||||
return rc;
|
||||
}
|
||||
|
||||
JNIEXPORT jint JNICALL CLibrary_NATIVE(setenv)(JNIEnv *env, jobject thiz, jstring name, jstring value)
|
||||
{
|
||||
jint rc = 0;
|
||||
wchar_t* nativeName = name != NULL ? java_to_wchar(env, name) : NULL;
|
||||
wchar_t* nativeValue = value != NULL ? java_to_wchar(env, value) : NULL;
|
||||
rc = (jint) SetEnvironmentVariableW(nativeName, nativeValue);
|
||||
if (nativeName) free(nativeName);
|
||||
if (nativeValue) free(nativeValue);
|
||||
return rc;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
char* java_to_char(JNIEnv* env, jstring string) {
|
||||
size_t len = (*env)->GetStringLength(env, string);
|
||||
size_t bytes = (*env)->GetStringUTFLength(env, string);
|
||||
char* chars = (char*) malloc(bytes + 1);
|
||||
(*env)->GetStringUTFRegion(env, string, 0, len, chars);
|
||||
chars[bytes] = 0;
|
||||
return chars;
|
||||
}
|
||||
|
||||
JNIEXPORT jint JNICALL CLibrary_NATIVE(chdir)(JNIEnv *env, jobject thiz, jstring path)
|
||||
{
|
||||
jint rc = 0;
|
||||
char* nativePath = java_to_char(env, path);
|
||||
rc = (jint) chdir(nativePath);
|
||||
free(nativePath);
|
||||
return rc;
|
||||
}
|
||||
|
||||
JNIEXPORT jint JNICALL CLibrary_NATIVE(setenv)(JNIEnv *env, jobject thiz, jstring name, jstring value)
|
||||
{
|
||||
jint rc = 0;
|
||||
if (name) {
|
||||
char* nativeName = java_to_char(env, name);
|
||||
if (value) {
|
||||
char* nativeValue = java_to_char(env, value);
|
||||
rc = setenv(nativeName, nativeValue, 1);
|
||||
free(nativeValue);
|
||||
} else {
|
||||
rc = unsetenv(nativeName);
|
||||
}
|
||||
free(nativeName);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#if defined(__APPLE__)
|
||||
#include <mach/mach.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/sysctl.h>
|
||||
|
||||
JNIEXPORT jint JNICALL CLibrary_NATIVE(getOsxMemoryInfo)(JNIEnv *env, jobject thiz, jlongArray totalAndAvailMem)
|
||||
{
|
||||
jint rc = 0;
|
||||
|
||||
// Get total physical memory
|
||||
int mib[2];
|
||||
mib[0] = CTL_HW;
|
||||
mib[1] = HW_MEMSIZE;
|
||||
int64_t total_memory = 0;
|
||||
size_t len = sizeof(total_memory);
|
||||
if ((rc = sysctl(mib, 2, &total_memory, &len, NULL, 0)) != 0) {
|
||||
return rc;
|
||||
}
|
||||
|
||||
// Get VM stats
|
||||
vm_size_t page_size;
|
||||
mach_port_t mach_port;
|
||||
mach_msg_type_number_t count;
|
||||
vm_statistics64_data_t vm_stats;
|
||||
|
||||
mach_port = mach_host_self();
|
||||
count = HOST_VM_INFO64_COUNT;
|
||||
if ((rc = host_page_size(mach_port, &page_size)) != 0) {
|
||||
return rc;
|
||||
}
|
||||
if ((rc = host_statistics64(mach_port, HOST_VM_INFO, (host_info64_t) &vm_stats, &count)) != 0) {
|
||||
return rc;
|
||||
}
|
||||
|
||||
// Calculate available memory
|
||||
long long available_memory =
|
||||
((int64_t) vm_stats.free_count + (int64_t) vm_stats.inactive_count
|
||||
- (int64_t) vm_stats.speculative_count) * (int64_t) page_size;
|
||||
|
||||
jlong elements[] = { (jlong) total_memory, (jlong) available_memory };
|
||||
(*env)->SetLongArrayRegion(env, totalAndAvailMem, 0, 2, elements);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
#endif
|
160
native/src/main/native/mvndnative.h
Normal file
160
native/src/main/native/mvndnative.h
Normal file
@@ -0,0 +1,160 @@
|
||||
/*******************************************************************************
|
||||
* Copyright (C) 2009-2017 the original author(s).
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*******************************************************************************/
|
||||
#ifndef JANSI_H
|
||||
#define JANSI_H
|
||||
|
||||
#ifdef __linux__
|
||||
|
||||
#include <termios.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <pty.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "inc_linux/jni.h"
|
||||
#include "inc_linux/jni_md.h"
|
||||
#endif
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <term.h>
|
||||
#include <libutil.h>
|
||||
#include <termios.h>
|
||||
#include <sys/ioctl.h>
|
||||
|
||||
#include "inc_linux/jni.h"
|
||||
#include "inc_linux/jni_md.h"
|
||||
#endif
|
||||
|
||||
/* Windows based build */
|
||||
#if defined(_WIN32) || defined(_WIN64)
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <windows.h>
|
||||
#include <conio.h>
|
||||
#include <io.h>
|
||||
|
||||
#include "inc_win/jni.h"
|
||||
#include "inc_win/jni_md.h"
|
||||
#endif
|
||||
|
||||
#if defined(__APPLE__) && defined(__MACH__)
|
||||
|
||||
#include <term.h>
|
||||
#include <util.h>
|
||||
#include <termios.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "inc_mac/jni.h"
|
||||
#include "inc_mac/jni_md.h"
|
||||
#endif
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
|
||||
#ifndef JNI64
|
||||
#if defined(_LP64)
|
||||
#define JNI64
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* 64 bit support */
|
||||
#ifndef JNI64
|
||||
|
||||
/* int/long defines */
|
||||
#define GetIntLongField GetIntField
|
||||
#define SetIntLongField SetIntField
|
||||
#define GetIntLongArrayElements GetIntArrayElements
|
||||
#define ReleaseIntLongArrayElements ReleaseIntArrayElements
|
||||
#define GetIntLongArrayRegion GetIntArrayRegion
|
||||
#define SetIntLongArrayRegion SetIntArrayRegion
|
||||
#define NewIntLongArray NewIntArray
|
||||
#define CallStaticIntLongMethod CallStaticIntMethod
|
||||
#define CallIntLongMethod CallIntMethod
|
||||
#define CallStaticIntLongMethodV CallStaticIntMethodV
|
||||
#define CallIntLongMethodV CallIntMethodV
|
||||
#define jintLongArray jintArray
|
||||
#define jintLong jint
|
||||
#define I_J "I"
|
||||
#define I_JArray "[I"
|
||||
|
||||
/* float/double defines */
|
||||
#define GetFloatDoubleField GetFloatField
|
||||
#define SetFloatDoubleField SetFloatField
|
||||
#define GetFloatDoubleArrayElements GetFloatArrayElements
|
||||
#define ReleaseFloatDoubleArrayElements ReleaseFloatArrayElements
|
||||
#define GetFloatDoubleArrayRegion GetFloatArrayRegion
|
||||
#define jfloatDoubleArray jfloatArray
|
||||
#define jfloatDouble jfloat
|
||||
#define F_D "F"
|
||||
#define F_DArray "[F"
|
||||
|
||||
#else
|
||||
|
||||
/* int/long defines */
|
||||
#define GetIntLongField GetLongField
|
||||
#define SetIntLongField SetLongField
|
||||
#define GetIntLongArrayElements GetLongArrayElements
|
||||
#define ReleaseIntLongArrayElements ReleaseLongArrayElements
|
||||
#define GetIntLongArrayRegion GetLongArrayRegion
|
||||
#define SetIntLongArrayRegion SetLongArrayRegion
|
||||
#define NewIntLongArray NewLongArray
|
||||
#define CallStaticIntLongMethod CallStaticLongMethod
|
||||
#define CallIntLongMethod CallLongMethod
|
||||
#define CallStaticIntLongMethodV CallStaticLongMethodV
|
||||
#define CallIntLongMethodV CallLongMethodV
|
||||
#define jintLongArray jlongArray
|
||||
#define jintLong jlong
|
||||
#define I_J "J"
|
||||
#define I_JArray "[J"
|
||||
|
||||
/* float/double defines */
|
||||
#define GetFloatDoubleField GetDoubleField
|
||||
#define SetFloatDoubleField SetDoubleField
|
||||
#define GetFloatDoubleArrayElements GetDoubleArrayElements
|
||||
#define ReleaseFloatDoubleArrayElements ReleaseDoubleArrayElements
|
||||
#define GetFloatDoubleArrayRegion GetDoubleArrayRegion
|
||||
#define jfloatDoubleArray jdoubleArray
|
||||
#define jfloatDouble jdouble
|
||||
#define F_D "D"
|
||||
#define F_DArray "[D"
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __GNUC__
|
||||
#define hawtjni_w_barrier() __sync_synchronize()
|
||||
#elif defined(SOLARIS2) && SOLARIS2 >= 10
|
||||
#include <mbarrier.h>
|
||||
#define hawtjni_w_barrier() __machine_w_barrier()
|
||||
#elif defined(__APPLE__)
|
||||
#include <libkern/OSAtomic.h>
|
||||
#define hawtjni_w_barrier() OSMemoryBarrier()
|
||||
#elif defined(_WIN32) || defined(_WIN64)
|
||||
#include <intrin.h>
|
||||
#define hawtjni_w_barrier() _mm_sfence(); _WriteBarrier()
|
||||
#else
|
||||
#pragma message ( "Don't know how to do a memory barrier on this platform" )
|
||||
#define hawtjni_w_barrier()
|
||||
#endif
|
||||
|
||||
#endif /* JANSI_H */
|
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"resources": [
|
||||
{"pattern": "org/mvndaemon/mvnd/nativ/.*"}
|
||||
]
|
||||
}
|
BIN
native/src/main/resources/org/mvndaemon/mvnd/nativ/FreeBSD/x86/libmvndnative.so
Executable file
BIN
native/src/main/resources/org/mvndaemon/mvnd/nativ/FreeBSD/x86/libmvndnative.so
Executable file
Binary file not shown.
Binary file not shown.
BIN
native/src/main/resources/org/mvndaemon/mvnd/nativ/Linux/arm/libmvndnative.so
Executable file
BIN
native/src/main/resources/org/mvndaemon/mvnd/nativ/Linux/arm/libmvndnative.so
Executable file
Binary file not shown.
BIN
native/src/main/resources/org/mvndaemon/mvnd/nativ/Linux/arm64/libmvndnative.so
Executable file
BIN
native/src/main/resources/org/mvndaemon/mvnd/nativ/Linux/arm64/libmvndnative.so
Executable file
Binary file not shown.
BIN
native/src/main/resources/org/mvndaemon/mvnd/nativ/Linux/armv7/libmvndnative.so
Executable file
BIN
native/src/main/resources/org/mvndaemon/mvnd/nativ/Linux/armv7/libmvndnative.so
Executable file
Binary file not shown.
BIN
native/src/main/resources/org/mvndaemon/mvnd/nativ/Linux/ppc64/libmvndnative.so
Executable file
BIN
native/src/main/resources/org/mvndaemon/mvnd/nativ/Linux/ppc64/libmvndnative.so
Executable file
Binary file not shown.
BIN
native/src/main/resources/org/mvndaemon/mvnd/nativ/Linux/x86/libmvndnative.so
Executable file
BIN
native/src/main/resources/org/mvndaemon/mvnd/nativ/Linux/x86/libmvndnative.so
Executable file
Binary file not shown.
BIN
native/src/main/resources/org/mvndaemon/mvnd/nativ/Linux/x86_64/libmvndnative.so
Executable file
BIN
native/src/main/resources/org/mvndaemon/mvnd/nativ/Linux/x86_64/libmvndnative.so
Executable file
Binary file not shown.
BIN
native/src/main/resources/org/mvndaemon/mvnd/nativ/Mac/x86/libmvndnative.jnilib
Executable file
BIN
native/src/main/resources/org/mvndaemon/mvnd/nativ/Mac/x86/libmvndnative.jnilib
Executable file
Binary file not shown.
Binary file not shown.
BIN
native/src/main/resources/org/mvndaemon/mvnd/nativ/Windows/x86/mvndnative.dll
Executable file
BIN
native/src/main/resources/org/mvndaemon/mvnd/nativ/Windows/x86/mvndnative.dll
Executable file
Binary file not shown.
BIN
native/src/main/resources/org/mvndaemon/mvnd/nativ/Windows/x86_64/mvndnative.dll
Executable file
BIN
native/src/main/resources/org/mvndaemon/mvnd/nativ/Windows/x86_64/mvndnative.dll
Executable file
Binary file not shown.
@@ -0,0 +1,17 @@
|
||||
#
|
||||
# Copyright 2019 the original author or authors.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
|
||||
version=${project.version}
|
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
* Copyright (C) 2009-2021 the original author(s).
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.mvndaemon.mvnd.nativ;
|
||||
|
||||
import java.io.File;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.condition.EnabledOnOs;
|
||||
import org.junit.jupiter.api.condition.OS;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
public class CLibraryTest {
|
||||
|
||||
@Test
|
||||
void testChdir() {
|
||||
File d = new File("target/tstDir");
|
||||
d.mkdirs();
|
||||
CLibrary.chdir(d.getAbsolutePath());
|
||||
}
|
||||
|
||||
@Test
|
||||
void testSetenv() {
|
||||
CLibrary.setenv("MY_NAME", "myValue");
|
||||
}
|
||||
|
||||
@Test
|
||||
@EnabledOnOs(OS.MAC)
|
||||
void testOsxMemory() {
|
||||
long[] mem = new long[2];
|
||||
assertEquals(0, CLibrary.getOsxMemoryInfo(mem));
|
||||
assertTrue(mem[0] > 1024, "Total: " + mem[0]);
|
||||
assertTrue(mem[1] > 1024, "Free: " + mem[1]);
|
||||
assertTrue(mem[1] < mem[0], "Free (" + mem[1] + ") < Total (" + mem[0] + ")");
|
||||
}
|
||||
}
|
@@ -0,0 +1,26 @@
|
||||
/*
|
||||
* Copyright (C) 2009-2020 the original author(s).
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.mvndaemon.mvnd.nativ;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
public class MvndNativeLoaderTest {
|
||||
|
||||
@Test
|
||||
public void testLoadJansi() {
|
||||
MvndNativeLoader.initialize();
|
||||
}
|
||||
}
|
11
pom.xml
11
pom.xml
@@ -70,6 +70,7 @@
|
||||
|
||||
<modules>
|
||||
<module>build-plugin</module>
|
||||
<module>native</module>
|
||||
<module>agent</module>
|
||||
<module>helper</module>
|
||||
<module>common</module>
|
||||
@@ -173,6 +174,11 @@
|
||||
<version>${assertj.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.mvndaemon.mvnd</groupId>
|
||||
<artifactId>mvnd-native</artifactId>
|
||||
<version>0.5.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.mvndaemon.mvnd</groupId>
|
||||
<artifactId>mvnd-agent</artifactId>
|
||||
@@ -284,6 +290,11 @@ limitations under the License.</inlineHeader>
|
||||
<exclude>mvnw</exclude>
|
||||
<exclude>mvnw.cmd</exclude>
|
||||
<exclude>pom.xml.versionsBackup</exclude>
|
||||
<exclude>**/*.so</exclude>
|
||||
<exclude>**/*.dll</exclude>
|
||||
<exclude>**/*.jnilib</exclude>
|
||||
<exclude>**/Makefile*</exclude>
|
||||
<exclude>**/docker/*</exclude>
|
||||
</excludes>
|
||||
<mapping>
|
||||
<bash>SCRIPT_STYLE</bash>
|
||||
|
Reference in New Issue
Block a user