Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
56b1e8d
Add apple architure support
GMKennedy Apr 5, 2021
4aa05e8
Apple native arm64 binary included in Cmake resources, cross compilat…
GMKennedy Apr 5, 2021
09dbcb9
Apple native arm64 binary included in Cmake resources, cross compilat…
GMKennedy Apr 5, 2021
80ae1f6
Initial arm64 rewrite
tresf Jun 3, 2021
b3f9db8
Minor formatting
tresf Jun 3, 2021
2302435
Remove armtrusy profile from Travis
tresf Jun 3, 2021
35b7dba
Finally make aarch64 a generic profile for all platforms
tresf Jun 4, 2021
6f5f190
Cleanup compiler warnings
tresf Jun 4, 2021
6480a20
Add the ability to automatically skip tests for certain platforms.
tresf Jun 30, 2021
c000646
Better logging of the test helper
tresf Jul 1, 2021
c751828
Add aarch64 to osx builds; consolidate dependencies
tresf Jul 1, 2021
1ecc403
PPC: Assume linux os for linux toolchain.
tresf Jul 14, 2021
5f245f1
Sanitize JAVA_HOME before its picked up by CMake
GMKennedy Jul 15, 2021
1ea17e6
Fix compiler warnings for MSVC
GMKennedy Jul 15, 2021
480e48e
Improve platform detection and profile ordering
GMKennedy Jul 15, 2021
e632a47
Make skip tests output more readable on cross-compile
tresf Jul 15, 2021
a139117
Fix JNI detection on Linux
GMKennedy Jul 16, 2021
771486c
Remove hard-coded Armhf compiler version information
GMKennedy Jul 16, 2021
f520e58
Delete DetectLinux.cmake
GMKennedy Jul 20, 2021
bb4881a
Fix broken compilation on CMake < 3.10
tresf Jul 23, 2021
cba11c3
Handle edge-case calling cmake directly
tresf Jul 23, 2021
a4c9370
Remove debugging
tresf Jul 23, 2021
fb412b6
Fix incorrect architecture on MacOS
tresf Jul 23, 2021
3a5cbb6
Remove debug line
tresf Jul 23, 2021
7a16a31
Bump version
tresf Jul 23, 2021
73c5c11
Bring back linux aarch64 cross compilation support
tresf Jul 23, 2021
423337c
Initial llvm-mingw support
tresf Jul 23, 2021
be52a53
Fix TOOLCHAIN_LOCATION for mingwaarch64
tresf Jul 23, 2021
55f806d
Revert version change
tresf Jul 23, 2021
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 16 additions & 12 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,55 +17,59 @@ matrix:
addons:
apt:
packages:
- cmake
- g++
- os: linux
env: PROFILE=m32
addons:
apt:
packages:
- cmake
- g++-multilib
- os: linux
env: PROFILE=mingw32
addons:
apt:
packages:
- cmake
- g++-mingw-w64-i686
- os: linux
env: PROFILE=mingw64
addons:
apt:
packages:
- cmake
- g++-mingw-w64-x86-64
- os: linux
env: PROFILE=armhf,armtrusty
env: PROFILE=armhf
addons:
apt:
packages:
- cmake
- g++-arm-linux-gnueabihf
- os: linux
env: PROFILE=aarch64
addons:
apt:
packages:
- cmake
- g++-aarch64-linux-gnu
- os: linux
env: PROFILE=ppc64
addons:
apt:
packages:
- cmake
- g++-powerpc64le-linux-gnu
- os: osx
addons:
homebrew:
packages:
- cmake
- os: osx
osx_image: xcode12.5 # xcode 12+ needed for cross-compile
env: PROFILE=aarch64

addons:
homebrew:
packages:
- maven
- ant
- cmake
apt:
packages:
- maven
- ant
- cmake

install:
- mvn dependency:resolve
Expand Down
117 changes: 83 additions & 34 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,11 +1,41 @@
cmake_minimum_required(VERSION 3.0)
cmake_policy(SET CMP0048 OLD)
cmake_policy(SET CMP0048 NEW)
cmake_policy(SET CMP0042 NEW)

project(jssc CXX)
# Get some architecture information
if(WIN32)
string(TOLOWER $ENV{PROCESSOR_ARCHITECTURE} OS_ARCH)
set(OS_TYPE "Windows")
else()
execute_process(COMMAND uname -m OUTPUT_VARIABLE OS_ARCH OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process(COMMAND uname OUTPUT_VARIABLE OS_TYPE OUTPUT_STRIP_TRAILING_WHITESPACE)
endif()

# Determine if compiling on Apple and host arch before starting project
if(APPLE AND NOT CMAKE_OSX_ARCHITECTURES)
set(CMAKE_OSX_ARCHITECTURES "${OS_ARCH}" CACHE STRING "Build architectures for Mac OS X" FORCE)
endif()

project(jssc VERSION "" LANGUAGES CXX)

# Use JAVA_HOME from Maven
if(JAVA_HOME)
# Sanitize path for cmake
file(TO_CMAKE_PATH "${JAVA_HOME}" JAVA_HOME)
message(STATUS "Picked up JAVA_HOME from Maven: ${JAVA_HOME}")
# Sanitize accidental jre selection on Linux
if(JAVA_HOME MATCHES "/jre$")
STRING(REGEX REPLACE "/jre$" "/jdk" JAVA_HOME "${JAVA_HOME}")
message(WARNING "Maven JAVA_HOME appears to be a JRE, trying to fix: ${JAVA_HOME}")
endif()
endif()

find_package(Java)
find_package(JNI)
# Workaround for FindJNI, per https://stackoverflow.com/a/51764145/3196753
set(JAVA_AWT_LIBRARY HeaderOnly)
set(JAVA_JVM_LIBRARY HeaderOnly)
set(JAVA_AWT_INCLUDE_PATH HeaderOnly)
find_package(JNI REQUIRED)

# Kitware-recommended technique for defaulting to 'Release' mode
if(NOT CMAKE_BUILD_TYPE)
Expand All @@ -32,22 +62,14 @@ if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
elseif(NOT CMAKE_SYSTEM_NAME STREQUAL SunOS)
set(CMAKE_CXX_STANDARD_LIBRARIES "-static-libgcc -static-libstdc++ ${CMAKE_CXX_STANDARD_LIBRARIES}")
endif()
execute_process(COMMAND uname OUTPUT_VARIABLE OS_TYPE OUTPUT_STRIP_TRAILING_WHITESPACE)
if(OS_TYPE STREQUAL "Darwin")
# Try to locate JNI again for edge-case (e.g. cross-compiling)
if(NOT JNI_FOUND)
execute_process(COMMAND /usr/libexec/java_home OUTPUT_VARIABLE JAVA_HOME OUTPUT_STRIP_TRAILING_WHITESPACE)
set(ENV{JAVA_HOME} ${JAVA_HOME})
find_package(JNI)
endif()
endif()
elseif(MSVC)
# /MT = Multithread, static version of the run-time library
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
endif()

if(WIN32)
set(JSSC_PLATFORM "windows")
# Don't append "lib" to windows binaries
set(CPP_SOURCE "windows")
# Remove "lib" prefix from windows binaries
set(CMAKE_SHARED_LIBRARY_PREFIX "")
# Disable optimization for Release builds (XP/Server 2003)
if(NOT MSVC)
Expand All @@ -56,34 +78,58 @@ if(WIN32)
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Od")
endif()
else()
set(JSSC_PLATFORM "_nix_based")
set(CPP_SOURCE "_nix_based")
# Sane level of optimization for Release builds
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O2")
endif()

# Detect platform if -DNATIVE_LIB_DIR is not provided
# TODO: Handle arm, hardfloat, etc
if(NOT NATIVE_LIB_DIR)
if(NOT NATIVE_LIB_DIR OR "${NATIVE_LIB_DIR}" STREQUAL "")
# windows, linux, darwin, etc
string(TOLOWER "${CMAKE_SYSTEM_NAME}" OS_NAME)
if(OS_NAME MATCHES "darwin")
set(OS_NAME "osx")
endif()

# 32-bit or 64-bit
#FIXME: Might fail on cross-compile
if(FORCE_M32)
set(OS_BITS 32)
# bitness/suffix
if(CMAKE_OSX_ARCHITECTURES)
# can occur when calling cmake directly
if(CMAKE_OSX_ARCHITECTURES STREQUAL "arm64")
set(OS_SUFFIX "arm64")
else()
set(OS_SUFFIX 64)
endif()
elseif("${OS_ARCH}" STREQUAL "aarch64" OR "${OS_ARCH}" STREQUAL "arm64")
set(OS_SUFFIX "arm64")
elseif("${OS_ARCH}" MATCHES "arm")
set(OS_SUFFIX "arm")
elseif(FORCE_M32)
set(OS_SUFFIX 32)
elseif(FORCE_M64)
set(OS_BITS 64)
set(OS_SUFFIX 64)
else()
if("${CMAKE_SIZEOF_VOID_P}" EQUAL "8")
set(OS_BITS 64)
set(OS_SUFFIX 64)
else()
set(OS_BITS 32)
set(OS_SUFFIX 32)
endif()
endif()
SET(NATIVE_LIB_DIR ${OS_NAME}_${OS_BITS})

# handle warnings
if(OS_SUFFIX STREQUAL "arm")
if(${CMAKE_VERSION} VERSION_LESS "3.10.0")
message(WARNING "Cmake < 3.10.0 can't detect HAS_FPU. This only affects arm 32-bit builds.")
else()
cmake_host_system_information(RESULT OS_SUFFIX_SF QUERY HAS_FPU)
# warn of native-lib-loader shortcomming
IF(NOT OS_SUFFIX_SF EQUAL 1)
message(WARNING "Soft float detected. We can't determine this at runtime; Compatibility will suffer.")
ENDIF()
endif()
endif()

set(NATIVE_LIB_DIR ${OS_NAME}_${OS_SUFFIX})
endif()
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/natives/${NATIVE_LIB_DIR})

Expand All @@ -96,17 +142,17 @@ foreach(POM_LINE ${POM_FILE})
string(REGEX REPLACE "^[ \t]+|<[^>]*>" "" DETECTED_VERSION "${POM_LINE}")
string(STRIP "${DETECTED_VERSION}" DETECTED_VERSION)
if(DETECTED_VERSION STREQUAL "")
MESSAGE(WARNING "Could not parse JSSC version from pom.xml, defaulting to \"${JSSC_VERSION}\"")
message(WARNING "Could not parse JSSC version from pom.xml, defaulting to \"${JSSC_VERSION}\"")
else()
SET(JSSC_VERSION "${DETECTED_VERSION}")
MESSAGE(STATUS "Found JSSC version \"${JSSC_VERSION}\" in pom.xml")
set(JSSC_VERSION "${DETECTED_VERSION}")
message(STATUS "Found JSSC version \"${JSSC_VERSION}\" in pom.xml")
endif()
break()
endif()
endforeach()
configure_file(src/main/cpp/version.h.in ${CMAKE_CURRENT_BINARY_DIR}/version.h @ONLY)

add_library(jssc SHARED src/main/cpp/${JSSC_PLATFORM}/jssc.cpp)
add_library(jssc SHARED src/main/cpp/${CPP_SOURCE}/jssc.cpp)

# Fall-back header for when maven is not available
list(APPEND JSSC_ADDITIONAL_INCLUDES src/main/cpp/)
Expand All @@ -119,12 +165,15 @@ if(WIN32)
set_target_properties(jssc PROPERTIES RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}")
set_target_properties(jssc PROPERTIES RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}")
endif()
if(FORCE_M32)
# Build 32-bit binary on Linux
set_target_properties(jssc PROPERTIES COMPILE_FLAGS -m32 LINK_FLAGS -m32)
elseif(FORCE_M64)
# Build 64-bit binary on Linux
set_target_properties(jssc PROPERTIES COMPILE_FLAGS -m64 LINK_FLAGS -m64)

if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND NOT WIN32 AND NOT FORCE_IGNORE)
if(FORCE_M32)
# Build 32-bit binary on Linux
set_target_properties(jssc PROPERTIES COMPILE_FLAGS -m32 LINK_FLAGS -m32)
elseif(FORCE_M64)
# Build 64-bit binary on Linux
set_target_properties(jssc PROPERTIES COMPILE_FLAGS -m64 LINK_FLAGS -m64)
endif()
endif()

# Call strip on non-debug builds
Expand Down
Loading