@@ -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.
323322if (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.
865864if (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 )
9951017endif ()
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"
0 commit comments