Skip to content

Commit 8927219

Browse files
committed
Build and test Java module on MSYS2/UCRT64
Tweak PATH to find CBFlib on Windows, do not explicitely load dependent libraries from Java. Collect test program definitions with their respective modules and cowardly refuse to build modules unless shared libraries are enabled.
1 parent 19349a5 commit 8927219

File tree

2 files changed

+63
-54
lines changed

2 files changed

+63
-54
lines changed

CMakeLists.txt

Lines changed: 63 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -318,8 +318,7 @@ set (CBF_CMAKE_DEBUG "ON")
318318
# Java and Python bindings
319319
#
320320
# The Java and Python modules can only be built when BUILD_SHARED_LIBS
321-
# is set. On Debian, Java should only require openjdk-17-jdk-headless
322-
# but AWT requires openjdk-17-jdk?
321+
# is set, but that is not enforced here.
323322
if(BUILD_SHARED_LIBS)
324323
option(CBF_ENABLE_JAVA "Enable Java" ON)
325324
option(CBF_ENABLE_PYTHON "Enable Python" ON)
@@ -860,8 +859,8 @@ target_include_directories(img
860859

861860

862861
#
863-
# Build all Fortran sources and libraries. The f90cbf library is not
864-
# installed.
862+
# Build Fortran sources, libraries, and examples. The f90cbf library
863+
# and the examples for testing are not installed.
865864
if(CBF_ENABLE_FORTRAN)
866865
find_program(M4 m4 REQUIRED)
867866
set(M4FLAGS "-Dfcb_bytes_in_rec=4096" CACHE STRING
@@ -914,6 +913,16 @@ if(CBF_ENABLE_FORTRAN)
914913
set_target_properties(fcb PROPERTIES LINKER_LANGUAGE C)
915914
install(TARGETS fcb DESTINATION lib)
916915

916+
add_executable(test_fcb_read_image
917+
"${CMAKE_CURRENT_BINARY_DIR}/src/test_fcb_read_image.f90")
918+
target_link_libraries(test_fcb_read_image
919+
fcb)
920+
921+
add_executable(test_xds_binary
922+
"${CMAKE_CURRENT_BINARY_DIR}/src/test_xds_binary.f90")
923+
target_link_libraries(test_xds_binary
924+
fcb)
925+
917926

918927
# Use the pre-generated SWIG wrapper, because current SWIG does not
919928
# support Fortran.
@@ -926,9 +935,10 @@ endif()
926935

927936

928937
#
929-
# Java bindings
930-
if(CBF_ENABLE_JAVA)
931-
# In CMake 3.24, COMPONENTS could be set to "JVM" for FindJNI.
938+
# Java bindings and examples
939+
if(BUILD_SHARED_LIBS AND CBF_ENABLE_JAVA)
940+
# In CMake 3.24, COMPONENTS could be set to "JVM" for FindJNI,
941+
# because AWT is not needed.
932942
find_package(Java COMPONENTS Development REQUIRED)
933943
find_package(JNI REQUIRED)
934944
find_package(SWIG COMPONENTS java REQUIRED)
@@ -941,7 +951,9 @@ if(CBF_ENABLE_JAVA)
941951
# ${_java_files_generated}, because it would be executed at
942952
# configuration time, when ${CMAKE_CURRENT_BINARY_DIR}/jcbf may not
943953
# exist. get_property(... SWIG_SUPPORT_FILES) only returns
944-
# "jcbf/cbf.java" and "jcbf/cbfJNI.java".
954+
# "jcbf/cbf.java" and "jcbf/cbfJNI.java"; the contents of
955+
# CMakeFiles/cbflib.dir/java_class_filelist do not appear to be
956+
# accessible.
945957
#
946958
# CMake 3.19 and earlier may not automatically regenerate
947959
# ${CMAKE_CURRENT_BINARY_DIR}/jcbf for Makefile Generators unless
@@ -955,13 +967,14 @@ if(CBF_ENABLE_JAVA)
955967
LANGUAGE Java
956968
OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/jcbf"
957969
SOURCES "${CBF__SRC}/jcbf.i")
958-
set_property(TARGET cbf_wrap PROPERTY
959-
SWIG_COMPILE_OPTIONS -package org.iucr.cbflib)
970+
set_target_properties(cbf_wrap PROPERTIES
971+
LIBRARY_OUTPUT_DIRECTORY "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}"
972+
SWIG_COMPILE_OPTIONS "-package;org.iucr.cbflib")
960973
target_include_directories(cbf_wrap
961974
PRIVATE "${JAVA_INCLUDE_PATH}"
962975
"${JAVA_INCLUDE_PATH2}")
963976
target_link_libraries(cbf_wrap
964-
cbf)
977+
PRIVATE cbf)
965978

966979
set(_java_files_generated
967980
"${CMAKE_CURRENT_BINARY_DIR}/jcbf/CBF_NODETYPE.java"
@@ -992,12 +1005,21 @@ if(CBF_ENABLE_JAVA)
9921005
VERSION "${PROJECT_VERSION}")
9931006
add_dependencies(cbflib
9941007
cbf_wrap)
1008+
1009+
add_executable(ctestcbf
1010+
"${CBF__EXAMPLES}/testcbf.c")
1011+
target_link_libraries(ctestcbf
1012+
cbf)
1013+
1014+
add_jar(testcbf
1015+
"${CBF__EXAMPLES}/testcbf.java"
1016+
INCLUDE_JARS cbflib)
9951017
endif()
9961018

9971019

9981020
#
9991021
# Python bindings
1000-
if(CBF_ENABLE_PYTHON)
1022+
if(BUILD_SHARED_LIBS AND CBF_ENABLE_PYTHON)
10011023
# As per Makefile, want links (not lynx) to reduce the diffs against
10021024
# versioned CBFlib.txt. Need SWIG 4.0.0 or later. For Python 3,
10031025
# Makefile also adds "# coding=utf-8" to the top of pycbf.py.
@@ -1236,35 +1258,6 @@ target_link_libraries(testreals
12361258
cbf)
12371259

12381260

1239-
#
1240-
# F90 examples. Only for testing, not installed.
1241-
if(CBF_ENABLE_FORTRAN)
1242-
add_executable(test_fcb_read_image
1243-
"${CMAKE_CURRENT_BINARY_DIR}/src/test_fcb_read_image.f90")
1244-
target_link_libraries(test_fcb_read_image
1245-
fcb)
1246-
1247-
add_executable(test_xds_binary
1248-
"${CMAKE_CURRENT_BINARY_DIR}/src/test_xds_binary.f90")
1249-
target_link_libraries(test_xds_binary
1250-
fcb)
1251-
endif()
1252-
1253-
1254-
#
1255-
# Java examples
1256-
if(CBF_ENABLE_JAVA)
1257-
add_executable(ctestcbf
1258-
"${CBF__EXAMPLES}/testcbf.c")
1259-
target_link_libraries(ctestcbf
1260-
cbf)
1261-
1262-
add_jar(testcbf
1263-
"${CBF__EXAMPLES}/testcbf.java"
1264-
INCLUDE_JARS cbflib)
1265-
endif()
1266-
1267-
12681261
#
12691262
# install
12701263
#
@@ -2560,13 +2553,12 @@ endif()
25602553

25612554
#
25622555
# Java tests
2563-
if(CBF_ENABLE_JAVA)
2556+
if(BUILD_SHARED_LIBS AND CBF_ENABLE_JAVA)
25642557
add_test(NAME java-setup-c
25652558
COMMAND ${CMAKE_COMMAND}
2566-
"-Dcommand=$<TARGET_FILE:ctestcbf>"
2559+
"-Dcommand=$<TARGET_FILE:ctestcbf>;${CMAKE_CURRENT_SOURCE_DIR}/examples/template_pilatus6m_2463x2527.cbf"
25672560
"-Doutput-file=${CBF__DATA}/testcbfc.txt"
2568-
-P "${CMAKE_CURRENT_SOURCE_DIR}/redirect.cmake"
2569-
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
2561+
-P "${CMAKE_CURRENT_SOURCE_DIR}/redirect.cmake")
25702562
set_tests_properties(java-setup-c PROPERTIES
25712563
FIXTURES_SETUP java-setup-c
25722564
REQUIRED_FILES "${CMAKE_CURRENT_SOURCE_DIR}/examples/template_pilatus6m_2463x2527.cbf")
@@ -2576,13 +2568,35 @@ if(CBF_ENABLE_JAVA)
25762568
set_tests_properties(java-cleanup-c PROPERTIES
25772569
FIXTURES_CLEANUP java-setup-c)
25782570

2571+
2572+
# Tweak PATH to find CBFlib: this appears to be necessary on
2573+
# Windows, where java.library.path may not be honored for dependent
2574+
# libraries. Linux still needs java.library_path.
2575+
#
2576+
# CMake 3.22 has path_list_append() for manipulating path lists;
2577+
# could use $<JOIN:${class_path},${glue}> with that.
2578+
set(class_path
2579+
"$<TARGET_PROPERTY:cbflib,JAR_FILE>"
2580+
"$<TARGET_PROPERTY:testcbf,JAR_FILE>")
2581+
2582+
set(library_path
2583+
"$<TARGET_FILE_DIR:cbf_wrap>"
2584+
"$<TARGET_FILE_DIR:cbf>"
2585+
"$ENV{PATH}")
2586+
2587+
if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
2588+
set(glue "\;")
2589+
else()
2590+
set(glue ":")
2591+
endif()
2592+
25792593
add_test(NAME java-setup-java
25802594
COMMAND ${CMAKE_COMMAND}
2581-
"-Dcommand=${Java_JAVA_EXECUTABLE};-Djava.library.path=${CMAKE_BINARY_DIR}/lib/;-cp;$<TARGET_PROPERTY:cbflib,JAR_FILE>:$<TARGET_PROPERTY:testcbf,JAR_FILE>;testcbf"
2595+
"-Dcommand=${Java_JAVA_EXECUTABLE};-Djava.library.path=$<TARGET_FILE_DIR:cbf_wrap>;-cp;$<JOIN:${class_path},${glue}>;testcbf;${CMAKE_CURRENT_SOURCE_DIR}/examples/template_pilatus6m_2463x2527.cbf"
25822596
"-Doutput-file=${CBF__DATA}/testcbfj.txt"
2583-
-P "${CMAKE_CURRENT_SOURCE_DIR}/redirect.cmake"
2584-
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
2597+
-P "${CMAKE_CURRENT_SOURCE_DIR}/redirect.cmake")
25852598
set_tests_properties(java-setup-java PROPERTIES
2599+
ENVIRONMENT "PATH=$<JOIN:${library_path},${glue}>"
25862600
FIXTURES_SETUP java-setup-java
25872601
REQUIRED_FILES "${CMAKE_CURRENT_SOURCE_DIR}/examples/template_pilatus6m_2463x2527.cbf")
25882602

@@ -2602,7 +2616,7 @@ endif()
26022616

26032617
#
26042618
# Python tests
2605-
if(CBF_ENABLE_PYTHON)
2619+
if(BUILD_SHARED_LIBS AND CBF_ENABLE_PYTHON)
26062620
add_test(NAME pycbf-test1
26072621
COMMAND Python::Interpreter
26082622
"${CMAKE_CURRENT_SOURCE_DIR}/pycbf/pycbf_test1.py"

examples/testcbf.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,6 @@
1313
public class testcbf {
1414

1515
static {
16-
try {
17-
System.loadLibrary("cbf");
18-
} catch (UnsatisfiedLinkError e) {
19-
System.err.println("Could not load CBF library");
20-
}
2116
try {
2217
System.loadLibrary("cbf_wrap");
2318
} catch (UnsatisfiedLinkError e) {

0 commit comments

Comments
 (0)