diff --git a/Makefile b/Makefile index f240d45..198a05d 100644 --- a/Makefile +++ b/Makefile @@ -135,7 +135,7 @@ snappy-jar-version:=snappy-java-$(shell perl -npe "s/version in ThisBuild\s+:=\s native: jni-header $(NATIVE_DLL) snappy: native $(TARGET)/$(snappy-jar-version).jar -native-all: win32 win64 mac64 native-arm linux32 linux64 linux-ppc64le linux-aarch64 +native-all: win32 win64 mac64 native-arm linux32 linux64 linux-ppc64 linux-ppc64le linux-aarch64 $(NATIVE_DLL): $(SNAPPY_SOURCE_CONFIGURED) $(SNAPPY_OUT)/$(LIBNAME) @mkdir -p $(@D) @@ -193,6 +193,9 @@ linux-android-arm: jni-header linux-ppc64le: jni-header ./docker/dockcross-ppc64le -a $(DOCKER_RUN_OPTS) bash -c 'make clean-native native CROSS_PREFIX=powerpc64le-linux-gnu- OS_NAME=Linux OS_ARCH=ppc64le' +linux-ppc64: jni-header + ./docker/dockcross-ppc64 -a $(DOCKER_RUN_OPTS) bash -c 'make clean-native native CROSS_PREFIX=ppc64-linux-gnu- OS_NAME=Linux OS_ARCH=ppc64' + linux-aarch64: jni-header ./docker/dockcross-aarch64 -a $(DOCKER_RUN_OPTS) bash -c 'make clean-native native CROSS_PREFIX=aarch64-linux-gnu- OS_NAME=Linux OS_ARCH=aarch64' diff --git a/Makefile.common b/Makefile.common index 340aac9..205896c 100755 --- a/Makefile.common +++ b/Makefile.common @@ -42,7 +42,7 @@ endif # os=Default is meant to be generic unix/linux -known_os_archs := Linux-x86 Linux-x86_64 Linux-arm Linux-armv6 Linux-armv7 Linux-android-arm Linux-aarch64 Linux-ppc Linux-ppc64le Linux-s390 Linux-s390x Mac-x86 Mac-x86_64 FreeBSD-x86_64 Windows-x86 Windows-x86_64 SunOS-x86 SunOS-sparc SunOS-x86_64 AIX-ppc AIX-ppc64 +known_os_archs := Linux-x86 Linux-x86_64 Linux-arm Linux-armv6 Linux-armv7 Linux-android-arm Linux-aarch64 Linux-ppc Linux-ppc64 Linux-ppc64le Linux-s390 Linux-s390x Mac-x86 Mac-x86_64 FreeBSD-x86_64 Windows-x86 Windows-x86_64 SunOS-x86 SunOS-sparc SunOS-x86_64 AIX-ppc AIX-ppc64 os_arch := $(OS_NAME)-$(OS_ARCH) IBM_JDK_7 := $(findstring IBM, $(shell $(JAVA) -version 2>&1 | grep IBM | grep "JRE 1.7")) @@ -116,6 +116,17 @@ Linux-ppc64le_LINKFLAGS := -shared -static-libgcc -static-libstdc++ Linux-ppc64le_LIBNAME := libsnappyjava.so Linux-ppc64le_SNAPPY_FLAGS := +Linux-ppc64_CXX := g++ +Linux-ppc64_STRIP := strip +ifeq ($(IBM_JDK_7),) + Linux-ppc64_CXXFLAGS := -DHAVE_CONFIG_H -Ilib/inc_linux -I$(JAVA_HOME)/include -Ilib/inc_mac -O2 -fPIC -fvisibility=hidden -m64 +else + Linux-ppc64_CXXFLAGS := -DHAVE_CONFIG_H -include $(IBM_JDK_LIB)/jni_md.h -include $(IBM_JDK_LIB)/jniport.h -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux -O2 -fPIC -m64 +endif +Linux-ppc64_LINKFLAGS := -shared -static-libgcc -static-libstdc++ +Linux-ppc64_LIBNAME := libsnappyjava.so +Linux-ppc64_SNAPPY_FLAGS := + AIX-ppc_CXX := g++ AIX-ppc_STRIP := strip AIX-ppc_LIBNAME := libsnappyjava.a diff --git a/docker/Dockerfile.linux-ppc64 b/docker/Dockerfile.linux-ppc64 new file mode 100644 index 0000000..edd4c8b --- /dev/null +++ b/docker/Dockerfile.linux-ppc64 @@ -0,0 +1,55 @@ +FROM dockcross/base:latest +MAINTAINER Taro L. Saito "leo@xerial.org" + +# Add the cross compiler sources +RUN echo "deb http://emdebian.org/tools/debian/ jessie main" >> /etc/apt/sources.list && \ + dpkg --add-architecture powerpc && \ + curl http://emdebian.org/tools/debian/emdebian-toolchain-archive.key | apt-key add - + +RUN apt-get update && apt-get install -y \ + crossbuild-essential-powerpc \ + gfortran-powerpc-linux-gnu \ + libbz2-dev:powerpc \ + libexpat1-dev:powerpc \ + ncurses-dev:powerpc \ + libssl-dev:powerpc + +WORKDIR /usr/src + +RUN apt-get update && \ + apt-get install -y libglib2.0-dev zlib1g-dev libpixman-1-dev && \ + curl -L http://wiki.qemu-project.org/download/qemu-2.6.0.tar.bz2 | tar xj && \ + cd qemu-2.6.0 && \ + ./configure --target-list=ppc64-linux-user --prefix=/usr && \ + make -j$(nproc) && \ + make install && \ + cd .. && rm -rf qemu-2.6.0 + +ENV CROSS_TRIPLE ppc64-linux-gnu +ENV CROSS_ROOT /usr/${CROSS_TRIPLE} +ENV AS=/usr/bin/${CROSS_TRIPLE}-as \ + AR=/usr/bin/${CROSS_TRIPLE}-ar \ + CC=/usr/bin/${CROSS_TRIPLE}-gcc \ + CPP=/usr/bin/${CROSS_TRIPLE}-cpp \ + CXX=/usr/bin/${CROSS_TRIPLE}-g++ \ + LD=/usr/bin/${CROSS_TRIPLE}-ld + +ENV DEFAULT_DOCKCROSS_IMAGE dockcross/linux-ppc64 +WORKDIR /work + +# Note: Toolchain file support is currently in debian Experimental according to: +# https://wiki.debian.org/CrossToolchains#In_jessie_.28Debian_8.29 +# We can switch to that when it becomes stable. +COPY Toolchain-ppc64.cmake /usr/lib/${CROSS_TRIPLE}/Toolchain.cmake +ENV CMAKE_TOOLCHAIN_FILE /usr/lib/${CROSS_TRIPLE}/Toolchain.cmake + +# Build-time metadata as defined at http://label-schema.org +ARG BUILD_DATE +ARG IMAGE +ARG VCS_REF +ARG VCS_URL +LABEL org.label-schema.build-date=$BUILD_DATE \ + org.label-schema.name=$IMAGE \ + org.label-schema.vcs-ref=$VCS_REF \ + org.label-schema.vcs-url=$VCS_URL \ + org.label-schema.schema-version="1.0" \ No newline at end of file diff --git a/docker/Toolchain-ppc64.cmake b/docker/Toolchain-ppc64.cmake new file mode 100644 index 0000000..81ecaad --- /dev/null +++ b/docker/Toolchain-ppc64.cmake @@ -0,0 +1,15 @@ +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_VERSION 1) +set(CMAKE_SYSTEM_PROCESSOR ppc64) + +set(cross_triple "ppc64-linux-gnu") + +set(CMAKE_C_COMPILER /usr/bin/${cross_triple}-cc) +set(CMAKE_CXX_COMPILER /usr/bin/${cross_triple}-c++) +set(CMAKE_Fortran_COMPILER /usr/bin/${cross_triple}-gfortran) + +# Discard path returned by pkg-config and associated with HINTS in module +# like FindOpenSSL. +set(CMAKE_IGNORE_PATH /usr/lib/x86_64-linux-gnu/ /usr/lib/x86_64-linux-gnu/lib/) + +set(CMAKE_CROSSCOMPILING_EMULATOR /usr/bin/qemu-ppc64) \ No newline at end of file diff --git a/docker/dockcross-ppc64 b/docker/dockcross-ppc64 new file mode 100755 index 0000000..cd567bb --- /dev/null +++ b/docker/dockcross-ppc64 @@ -0,0 +1,200 @@ +#!/bin/bash + +DEFAULT_DOCKCROSS_IMAGE=xerial/linux-ppc64 + +#------------------------------------------------------------------------------ +# 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 $FINAL_IMAGE ) $0; then + echo $0 is up to date + else + echo -n Updating $0 '... ' + docker run $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 + exit 1 + fi +} + +#------------------------------------------------------------------------------ +# Option processing +# +special_update_command='' +while [[ $# != 0 ]]; do + case $1 in + + --) + 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}} + +# If we are not running via boot2docker +if [ -z $DOCKER_HOST ]; then + USER_IDS="-e BUILDER_UID=$( id -u ) -e BUILDER_GID=$( id -g ) -e BUILDER_USER=$( id -un ) -e BUILDER_GROUP=$( id -gn )" +fi + +#------------------------------------------------------------------------------ +# Now, finally, run the command in a container +# +docker run --rm \ + -v $PWD:/work \ + $USER_IDS \ + $FINAL_ARGS \ + $FINAL_IMAGE "$@" + +################################################################################ +# +# This image is not intended to be run manually. +# +# To create a dockcross helper script for the +# dockcross/linux-armv7 image, run: +# +# docker run --rm dockcross/linux-armv7 > dockcross-linux-armv7 +# chmod +x dockcross-linux-armv7 +# +# You may then wish to move the dockcross script to your PATH. +# +################################################################################ diff --git a/src/main/resources/org/xerial/snappy/native/Linux/ppc64/libsnappyjava.so b/src/main/resources/org/xerial/snappy/native/Linux/ppc64/libsnappyjava.so new file mode 100755 index 0000000..f7677c8 Binary files /dev/null and b/src/main/resources/org/xerial/snappy/native/Linux/ppc64/libsnappyjava.so differ