Skip to content

Commit 00e81c0

Browse files
authored
Add Maven, CI (#14)
- Lower required cmake version from 3.9 to 3.0 - Adds unit test (disabled for cross-compiles) - Move version info into pom.xml; parse using cmake; #cmakedefine - Output natives to target/cmake/natives/ - Handle MSVC build flags - Add cross-compilation toolchains for arm, ppc, mingw - Add Travis-CI build matrix - Adds ability to build a one-off jar for patching/distribution
1 parent 76b5bae commit 00e81c0

36 files changed

+752
-409
lines changed

.gitignore

+9-5
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
build/
2+
# the maven convention for built files
3+
target/
24

35
# Prerequisites
46
*.d
@@ -13,11 +15,6 @@ build/
1315
*.gch
1416
*.pch
1517

16-
# Compiled Dynamic libraries
17-
*.so
18-
*.dylib
19-
*.dll
20-
2118
# Fortran module files
2219
*.mod
2320
*.smod
@@ -32,3 +29,10 @@ build/
3229
*.exe
3330
*.out
3431
*.app
32+
33+
# IDE files: IntellIJ
34+
.idea/
35+
*.iml
36+
37+
# IDE files: eclipse
38+
.settings/

.travis.yml

+75
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
language: java
2+
3+
cache:
4+
directories:
5+
- $HOME/.m2
6+
- $HOME/.jabba/jdk
7+
8+
before_cache:
9+
- rm -rf $HOME/.m2/repository/com/github/java-native
10+
11+
matrix:
12+
include:
13+
- os: linux
14+
addons:
15+
apt:
16+
packages:
17+
- cmake3
18+
- g++
19+
- os: linux
20+
env: PROFILE=m32
21+
addons:
22+
apt:
23+
packages:
24+
- cmake3
25+
- g++-multilib
26+
- os: linux
27+
env: PROFILE=mingw32
28+
addons:
29+
apt:
30+
packages:
31+
- cmake3
32+
- g++-mingw-w64-i686
33+
- os: linux
34+
env: PROFILE=mingw64
35+
addons:
36+
apt:
37+
packages:
38+
- cmake3
39+
- g++-mingw-w64-x86-64
40+
- os: linux
41+
env: PROFILE=armsf,armtrusty
42+
addons:
43+
apt:
44+
packages:
45+
- cmake3
46+
- g++-arm-linux-gnueabi
47+
- os: linux
48+
env: PROFILE=aarch64
49+
addons:
50+
apt:
51+
packages:
52+
- cmake3
53+
- g++-aarch64-linux-gnu
54+
- os: linux
55+
env: PROFILE=ppc64
56+
addons:
57+
apt:
58+
packages:
59+
- cmake3
60+
- g++-powerpc64le-linux-gnu
61+
- os: osx
62+
addons:
63+
homebrew:
64+
packages:
65+
- cmake
66+
67+
install:
68+
- mvn dependency:resolve
69+
70+
script: if [ -z "$PROFILE" ]; then mvn --batch-mode; else mvn -P "$PROFILE" --batch-mode; fi
71+
72+
after_success:
73+
- bash <(curl -s https://codecov.io/bash)
74+
75+

CMakeLists.txt

+65-8
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1-
cmake_minimum_required(VERSION 3.9)
2-
project(jssc VERSION 2.8.0 DESCRIPTION "Java Simple Serial Connector")
1+
cmake_minimum_required(VERSION 3.0)
2+
cmake_policy(SET CMP0048 NEW)
3+
cmake_policy(SET CMP0042 NEW)
4+
5+
project(jssc VERSION 2.7.1 LANGUAGES CXX)
36

47
find_package(Java)
58
find_package(JNI)
@@ -56,15 +59,60 @@ else()
5659
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O2")
5760
endif()
5861

59-
add_library(jssc SHARED
60-
src/cpp/${JSSC_PLATFORM}/jssc.cpp
61-
)
62+
# Detect platform if -DNATIVE_LIB_DIR is not provided
63+
# TODO: Handle arm, hardfloat, etc
64+
if(NOT NATIVE_LIB_DIR)
65+
# windows, linux, darwin, etc
66+
string(TOLOWER "${CMAKE_SYSTEM_NAME}" OS_NAME)
67+
if(OS_NAME MATCHES "darwin")
68+
set(OS_NAME "osx")
69+
endif()
70+
71+
# 32-bit or 64-bit
72+
#FIXME: Might fail on cross-compile
73+
if("${CMAKE_SIZEOF_VOID_P}" EQUAL "8")
74+
set(OS_BITS 64)
75+
else()
76+
set(OS_BITS 32)
77+
endif()
78+
SET(NATIVE_LIB_DIR ${OS_NAME}_${OS_BITS})
79+
endif()
80+
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/natives/${NATIVE_LIB_DIR})
81+
82+
# version.h using #cmakedefine for version from pom.xml.
83+
set(JSSC_VERSION "0.0.0-UNKNOWN")
84+
file(STRINGS ${CMAKE_CURRENT_SOURCE_DIR}/pom.xml POM_FILE)
85+
foreach(POM_LINE ${POM_FILE})
86+
# Assume first "<version>" is the project version
87+
if(POM_LINE MATCHES "<version>")
88+
string(REGEX REPLACE "^[ \t]+|<[^>]*>" "" DETECTED_VERSION "${POM_LINE}")
89+
string(STRIP "${DETECTED_VERSION}" DETECTED_VERSION)
90+
if(DETECTED_VERSION STREQUAL "")
91+
MESSAGE(WARNING "Could not parse version from pom.xml, defaulting to \"${JSSC_VERSION}\"")
92+
else()
93+
SET(JSSC_VERSION "${DETECTED_VERSION}")
94+
MESSAGE(STATUS "Found version \"${JSSC_VERSION}\" in pom.xml")
95+
endif()
96+
break()
97+
endif()
98+
endforeach()
99+
configure_file(src/cpp/version.h.in ${CMAKE_CURRENT_BINARY_DIR}/version.h @ONLY)
100+
101+
add_library(jssc SHARED src/cpp/${JSSC_PLATFORM}/jssc.cpp)
62102

63-
target_include_directories(jssc PRIVATE ${JNI_INCLUDE_DIRS} ${JSSC_ADDITIONAL_INCLUDES})
103+
target_include_directories(jssc PRIVATE ${JNI_INCLUDE_DIRS} ${CMAKE_CURRENT_BINARY_DIR} ${JSSC_ADDITIONAL_INCLUDES})
64104

65-
set_target_properties(jssc PROPERTIES VERSION ${PROJECT_VERSION})
66-
set_target_properties(jssc PROPERTIES PUBLIC_HEADER src/jssc_SerialNativeInterface.h)
105+
set_target_properties(jssc PROPERTIES PUBLIC_HEADER ${CMAKE_CURRENT_BINARY_DIR}/jssc_SerialNativeInterface.h)
67106
set_target_properties(jssc PROPERTIES POSITION_INDEPENDENT_CODE ON)
107+
if(WIN32)
108+
# Fix paths for MSVC (Debug/Release) and MINGW
109+
set_target_properties(jssc PROPERTIES RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}")
110+
set_target_properties(jssc PROPERTIES RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}")
111+
endif()
112+
if(FORCE_M32)
113+
# Build 32-bit binary on Linux
114+
set_target_properties(jssc PROPERTIES COMPILE_FLAGS -m32 LINK_FLAGS -m32)
115+
endif()
68116

69117
# Call strip on non-debug builds
70118
if(CMAKE_STRIP AND NOT CMAKE_BUILD_TYPE MATCHES "Deb")
@@ -73,3 +121,12 @@ if(CMAKE_STRIP AND NOT CMAKE_BUILD_TYPE MATCHES "Deb")
73121
endif()
74122
add_custom_command(TARGET jssc POST_BUILD COMMAND "${CMAKE_STRIP}" ${STRIP_ARGS} $<TARGET_FILE:jssc>)
75123
endif()
124+
125+
# Handle compiler warnings
126+
if(MSVC)
127+
#TODO Treat warnings as errors /WX
128+
target_compile_options(jssc PRIVATE /W4)
129+
else()
130+
#TODO Treat warnings as errors -Werror
131+
target_compile_options(jssc PRIVATE -Wall -Wextra -pedantic)
132+
endif()

0 commit comments

Comments
 (0)