Skip to content

Commit e3ec246

Browse files
authored
Synchronize Java to Makefile (#86)
* Build Java module by default, provided BUILD_SHARED_LIBS is set As per Makefile. Builds, but does not install, cbflib-0.9.8.jar (and cbflib.jar symlink). * Add Java examples As per Makefile, not installed. * Add Java tests As per Makefile. * Add default-jdk and swig dependencies for Docker
1 parent d0d4f96 commit e3ec246

File tree

2 files changed

+138
-3
lines changed

2 files changed

+138
-3
lines changed

.dev/docker/cmake_ctest.dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ RUN mkdir /app
55
COPY ./cbflib /app/cbflib
66

77
RUN apt-get update && \
8-
apt-get install -y build-essential git cmake gfortran m4
8+
apt-get install -y build-essential git cmake default-jdk gfortran m4 swig
99

1010
RUN cd /app/cbflib && \
1111
cmake . && \

CMakeLists.txt

Lines changed: 137 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,17 @@ option(CBF_ENABLE_ULP "Enable ULP" OFF)
313313
set (CBF_CMAKE_DEBUG "ON")
314314

315315

316+
#
317+
# Java bindings
318+
#
319+
# The Java module can only be built when BUILD_SHARED_LIBS is set. On
320+
# Debian, Java should only require openjdk-17-jdk-headless but AWT
321+
# requires openjdk-17-jdk?
322+
if(BUILD_SHARED_LIBS)
323+
option(CBF_ENABLE_JAVA "Enable Java" ON)
324+
endif()
325+
326+
316327
#
317328
# User setable parameters
318329
#
@@ -398,8 +409,6 @@ list(GET _cra 2 _age)
398409
math(EXPR SOVERSION "${_current} - ${_age}")
399410

400411

401-
set(JCBF "${CBFlib_SOURCE_DIR}/jcbf" CACHE STRING "")
402-
set(JAVADIR "${CBFlib_SOURCE_DIR}/java" CACHE STRING "")
403412
set(BIN "${CBFlib_BINARY_DIR}/bin" CACHE STRING "")
404413
set(PYCBF "${CBFlib_SOURCE_DIR}/pycbf" CACHE STRING "")
405414
set(EXAMPLES "${CBFlib_SOURCE_DIR}/examples" CACHE STRING "" )
@@ -908,6 +917,76 @@ if(CBF_ENABLE_FORTRAN)
908917
endif()
909918

910919

920+
#
921+
# Java bindings
922+
if(CBF_ENABLE_JAVA)
923+
# In CMake 3.24, COMPONENTS could be set to "JVM" for FindJNI.
924+
find_package(Java COMPONENTS Development REQUIRED)
925+
find_package(JNI REQUIRED)
926+
find_package(SWIG COMPONENTS java REQUIRED)
927+
include(UseJava)
928+
include(UseSWIG)
929+
930+
931+
# Generate ${CMAKE_CURRENT_BINARY_DIR}/jcbf/jcbfJAVA_wrap.c and
932+
# ${_java_files_generated}. Cannot use file(GLOB ...) for
933+
# ${_java_files_generated}, because it would be executed at
934+
# configuration time, when ${CMAKE_CURRENT_BINARY_DIR}/jcbf may not
935+
# exist. get_property(... SWIG_SUPPORT_FILES) only returns
936+
# "jcbf/cbf.java" and "jcbf/cbfJNI.java".
937+
#
938+
# CMake 3.19 and earlier may not automatically regenerate
939+
# ${CMAKE_CURRENT_BINARY_DIR}/jcbf for Makefile Generators unless
940+
# ${CBF__SRC}/jcbf.i is touched.
941+
set_property(SOURCE "${CBF__SRC}/jcbf.i" PROPERTY
942+
INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}/include")
943+
set_property(SOURCE "${CBF__SRC}/jcbf.i" PROPERTY
944+
USE_SWIG_DEPENDENCIES TRUE)
945+
946+
swig_add_library(cbf_wrap
947+
LANGUAGE Java
948+
OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/jcbf"
949+
SOURCES "${CBF__SRC}/jcbf.i")
950+
set_property(TARGET cbf_wrap PROPERTY
951+
SWIG_COMPILE_OPTIONS -package org.iucr.cbflib)
952+
target_include_directories(cbf_wrap
953+
PRIVATE "${JAVA_INCLUDE_PATH}"
954+
"${JAVA_INCLUDE_PATH2}")
955+
target_link_libraries(cbf_wrap
956+
cbf)
957+
958+
set(_java_files_generated
959+
"${CMAKE_CURRENT_BINARY_DIR}/jcbf/CBF_NODETYPE.java"
960+
"${CMAKE_CURRENT_BINARY_DIR}/jcbf/SWIGTYPE_p_FILE.java"
961+
"${CMAKE_CURRENT_BINARY_DIR}/jcbf/SWIGTYPE_p_cbf_context.java"
962+
"${CMAKE_CURRENT_BINARY_DIR}/jcbf/SWIGTYPE_p_cbf_file.java"
963+
"${CMAKE_CURRENT_BINARY_DIR}/jcbf/SWIGTYPE_p_double.java"
964+
"${CMAKE_CURRENT_BINARY_DIR}/jcbf/SWIGTYPE_p_int.java"
965+
"${CMAKE_CURRENT_BINARY_DIR}/jcbf/SWIGTYPE_p_long.java"
966+
"${CMAKE_CURRENT_BINARY_DIR}/jcbf/SWIGTYPE_p_p__cbf_handle_struct.java"
967+
"${CMAKE_CURRENT_BINARY_DIR}/jcbf/SWIGTYPE_p_p_cbf_node_struct.java"
968+
"${CMAKE_CURRENT_BINARY_DIR}/jcbf/SWIGTYPE_p_p_char.java"
969+
"${CMAKE_CURRENT_BINARY_DIR}/jcbf/SWIGTYPE_p_size_t.java"
970+
"${CMAKE_CURRENT_BINARY_DIR}/jcbf/SWIGTYPE_p_unsigned_int.java"
971+
"${CMAKE_CURRENT_BINARY_DIR}/jcbf/SWIGTYPE_p_void.java"
972+
"${CMAKE_CURRENT_BINARY_DIR}/jcbf/cbf.java"
973+
"${CMAKE_CURRENT_BINARY_DIR}/jcbf/cbfConstants.java"
974+
"${CMAKE_CURRENT_BINARY_DIR}/jcbf/cbfJNI.java"
975+
"${CMAKE_CURRENT_BINARY_DIR}/jcbf/cbf_handle_struct.java"
976+
"${CMAKE_CURRENT_BINARY_DIR}/jcbf/cbf_node.java"
977+
"${CMAKE_CURRENT_BINARY_DIR}/jcbf/doubleP.java"
978+
"${CMAKE_CURRENT_BINARY_DIR}/jcbf/intP.java"
979+
"${CMAKE_CURRENT_BINARY_DIR}/jcbf/sizetP.java"
980+
"${CMAKE_CURRENT_BINARY_DIR}/jcbf/uintP.java")
981+
982+
add_jar(cbflib
983+
"${_java_files_generated}"
984+
VERSION "${PROJECT_VERSION}")
985+
add_dependencies(cbflib
986+
cbf_wrap)
987+
endif()
988+
989+
911990
#
912991
# C and C++ examples
913992
#
@@ -1068,6 +1147,20 @@ if(CBF_ENABLE_FORTRAN)
10681147
endif()
10691148

10701149

1150+
#
1151+
# Java examples
1152+
if(CBF_ENABLE_JAVA)
1153+
add_executable(ctestcbf
1154+
"${CBF__EXAMPLES}/testcbf.c")
1155+
target_link_libraries(ctestcbf
1156+
cbf)
1157+
1158+
add_jar(testcbf
1159+
"${CBF__EXAMPLES}/testcbf.java"
1160+
INCLUDE_JARS cbflib)
1161+
endif()
1162+
1163+
10711164
#
10721165
# install
10731166
#
@@ -2359,3 +2452,45 @@ if(CBF_ENABLE_FORTRAN)
23592452
FIXTURES_REQUIRED fcb_read_image-flatpacked
23602453
REQUIRED_FILES "${data_output}/test_fcb_read_testflatpackedout_orig.out")
23612454
endif()
2455+
2456+
2457+
#
2458+
# Java tests
2459+
if(CBF_ENABLE_JAVA)
2460+
add_test(NAME java-setup-c
2461+
COMMAND ${CMAKE_COMMAND}
2462+
"-Dcommand=$<TARGET_FILE:ctestcbf>"
2463+
"-Doutput-file=${CBF__DATA}/testcbfc.txt"
2464+
-P "${CMAKE_CURRENT_SOURCE_DIR}/redirect.cmake"
2465+
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
2466+
set_tests_properties(java-setup-c PROPERTIES
2467+
FIXTURES_SETUP java-setup-c
2468+
REQUIRED_FILES "${CMAKE_CURRENT_SOURCE_DIR}/examples/template_pilatus6m_2463x2527.cbf")
2469+
2470+
add_test(NAME java-cleanup-c
2471+
COMMAND ${CMAKE_COMMAND} -E rm "${CBF__DATA}/testcbfc.txt")
2472+
set_tests_properties(java-cleanup-c PROPERTIES
2473+
FIXTURES_CLEANUP java-setup-c)
2474+
2475+
add_test(NAME java-setup-java
2476+
COMMAND ${CMAKE_COMMAND}
2477+
"-Dcommand=${Java_JAVA_EXECUTABLE};-Djava.library.path=${CMAKE_BINARY_DIR}/lib/;-cp;$<TARGET_PROPERTY:cbflib,JAR_FILE>:$<TARGET_PROPERTY:testcbf,JAR_FILE>;testcbf"
2478+
"-Doutput-file=${CBF__DATA}/testcbfj.txt"
2479+
-P "${CMAKE_CURRENT_SOURCE_DIR}/redirect.cmake"
2480+
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
2481+
set_tests_properties(java-setup-java PROPERTIES
2482+
FIXTURES_SETUP java-setup-java
2483+
REQUIRED_FILES "${CMAKE_CURRENT_SOURCE_DIR}/examples/template_pilatus6m_2463x2527.cbf")
2484+
2485+
add_test(NAME java-cleanup-java
2486+
COMMAND ${CMAKE_COMMAND} -E rm "${CBF__DATA}/testcbfj.txt")
2487+
set_tests_properties(java-cleanup-java PROPERTIES
2488+
FIXTURES_CLEANUP java-setup-java)
2489+
2490+
add_test(NAME java-cmp
2491+
COMMAND ${CMAKE_COMMAND} -E compare_files
2492+
"${CBF__DATA}/testcbfc.txt"
2493+
"${CBF__DATA}/testcbfj.txt")
2494+
set_tests_properties(java-cmp PROPERTIES
2495+
FIXTURES_REQUIRED "java-setup-c;java-setup-java")
2496+
endif()

0 commit comments

Comments
 (0)