Skip to content

Commit dba0e4d

Browse files
authored
Synchronize Fortran to Makefile (#82)
* Collect the Fortran build bits Do not set CMAKE_Fortran_FLAGS in CMakeLists.txt. Take M4FLAGS from a user-configurable cache variable instead of from the environment. The m4 macro processor is required for the Fortran build. * Build all Fortran sources from M4 in one place first All output is written to the same directory under CMAKE_CURRENT_BINARY_DIR. * Build the fcb library as per Makefile Uses the pre-generated SWIG wrapper. The f90cbf library is not installed, nor are Fortran examples. * Add Fortran tests as per Makefile * Do not overlink the Fortran examples
1 parent b4cbd8c commit dba0e4d

File tree

1 file changed

+180
-128
lines changed

1 file changed

+180
-128
lines changed

CMakeLists.txt

Lines changed: 180 additions & 128 deletions
Original file line numberDiff line numberDiff line change
@@ -295,9 +295,6 @@ set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib")
295295
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib")
296296
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin")
297297

298-
set(CBF_F90FLAGS_ENV $ENV{F90FLAGS})
299-
set(CBF_M4FLAGS_ENV $ENV{M4FLAGS})
300-
301298
option(BUILD_SHARED_LIBS "Build using shared libraries" ON)
302299

303300
option(CBF_ENABLE_FORTRAN "Enable Fortran 90" ON)
@@ -320,24 +317,6 @@ set (CBF_CMAKE_DEBUG "ON")
320317
# User setable parameters
321318
#
322319

323-
if (CBF_M4FLAGS_ENV)
324-
set(CBF_M4FLAGS ${CBF_M4FLAGS_ENV})
325-
else (CBF_M4FLAGS_ENV)
326-
set(CBF_M4FLAGS "-Dfcb_bytes_in_rec=4096")
327-
endif (CBF_M4FLAGS_ENV)
328-
329-
if(CBF_ENABLE_FORTRAN)
330-
331-
if (CBF_F90FLAGS_ENV)
332-
set(CMAKE_Fortran_FLAGS_RELEASE "${CMAKE_Fortran_FLAGS_RELEASE} ${CBF_F90FLAGS_ENV}")
333-
set(CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_DEBUG} ${CBF_F90FLAGS_ENV}")
334-
else (CBF_F90FLAGS_ENV)
335-
set(CMAKE_Fortran_FLAGS_RELEASE "${CMAKE_Fortran_FLAGS_RELEASE} -fno-range-check")
336-
set(CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_DEBUG} -fno-range-check")
337-
endif (CBF_F90FLAGS_ENV)
338-
339-
endif()
340-
341320
# make sure that the default is a RELEASE
342321
if (NOT CMAKE_BUILD_TYPE)
343322
set (CMAKE_BUILD_TYPE RELEASE CACHE STRING
@@ -384,7 +363,6 @@ endmacro(CBF_REQUIRE_DIRECTORY)
384363
#
385364
set(CBF__SRC "${CBFlib_SOURCE_DIR}/src" )
386365
set(CBF__INCLUDE "${CBFlib_SOURCE_DIR}/include" )
387-
set(CBF__M4 "${CBFlib_SOURCE_DIR}/m4" )
388366
set(CBF__DOC "${CBFlib_SOURCE_DIR}/doc" )
389367
set(CBF__EXAMPLES "${CBFlib_SOURCE_DIR}/examples" )
390368
set(CBF__EXTERNAL_PACKAGES
@@ -396,17 +374,13 @@ set(CBF__DECTRIS_EXAMPLES
396374
#
397375
# Directories on the build side
398376
#
399-
set(CBF__BLDSRC "${CBFlib_BINARY_DIR}/src" )
400-
set(CBF__BLDEXMP "${CBFlib_BINARY_DIR}/src" )
401377
set(CBF__BIN "${CBFlib_BINARY_DIR}/bin" )
402378
set(CBF__LIB "${CBFlib_BINARY_DIR}/lib" )
403379
set(CBF__BIN_INCLUDE "${CBFlib_BINARY_DIR}/include" )
404380
set(CBF__SHARE "${CBFlib_BINARY_DIR}/share" )
405381
set(CBF__EXT_PKG "${CBFlib_BINARY_DIR}/external_packages" )
406382
set(CBF__DATA "${CBFlib_BINARY_DIR}/data_files" )
407383

408-
CBF_REQUIRE_DIRECTORY(${CBF__BLDSRC})
409-
CBF_REQUIRE_DIRECTORY(${CBF__BLDEXMP})
410384
CBF_REQUIRE_DIRECTORY(${CBF__BIN})
411385
CBF_REQUIRE_DIRECTORY(${CBF__LIB})
412386
CBF_REQUIRE_DIRECTORY(${CBF__BIN_INCLUDE})
@@ -711,30 +685,6 @@ set(
711685
${CBF__SRC}/img.c
712686
)
713687

714-
if(CBF_ENABLE_FORTRAN)
715-
716-
set(
717-
CBF_F90_BUILT_SOURCES
718-
${CBF__BLDSRC}/fcb_exit_binary.f90
719-
${CBF__BLDSRC}/fcb_next_binary.f90
720-
${CBF__BLDSRC}/fcb_open_cifin.f90
721-
${CBF__BLDSRC}/fcb_packed.f90
722-
${CBF__BLDSRC}/fcb_read_bits.f90
723-
${CBF__BLDSRC}/fcb_read_image.f90
724-
${CBF__BLDSRC}/fcb_read_xds_i2.f90
725-
)
726-
727-
set(
728-
CBF_F90_SOURCES
729-
${CBF__SRC}/fcb_atol_wcnt.f90
730-
${CBF__SRC}/fcb_ci_strncmparr.f90
731-
${CBF__SRC}/fcb_nblen_array.f90
732-
${CBF__SRC}/fcb_read_byte.f90
733-
${CBF__SRC}/fcb_read_line.f90
734-
${CBF__SRC}/fcb_skip_whitespace.f90
735-
)
736-
737-
endif()
738688

739689
# use, i.e. don't skip the full RPATH for the build tree
740690
SET(CMAKE_SKIP_BUILD_RPATH FALSE)
@@ -802,38 +752,6 @@ if(CBF_ENABLE_ULP)
802752
endif()
803753

804754

805-
if(CBF_ENABLE_FORTRAN)
806-
807-
#
808-
# m4 FCB library macro files
809-
#
810-
set(
811-
CBF_M4_FCB_DEFINES
812-
${CBF__M4}/fcblib_defines.m4
813-
)
814-
815-
set(
816-
CBF_M4_FCB_FILES
817-
${CBF__M4}/fcb_exit_binary.m4
818-
${CBF__M4}/fcb_next_binary.m4
819-
${CBF__M4}/fcb_open_cifin.m4
820-
${CBF__M4}/fcb_packed.m4
821-
${CBF__M4}/fcb_read_bits.m4
822-
${CBF__M4}/fcb_read_image.m4
823-
${CBF__M4}/fcb_read_xds_i2.m4
824-
)
825-
#
826-
# m4 F90 examples macro files
827-
#
828-
set(
829-
CBF_M4_F90_EXAMPLES
830-
${CBF__M4}/test_fcb_read_image.m4
831-
${CBF__M4}/test_xds_binary.m4
832-
)
833-
834-
endif()
835-
836-
837755
#
838756
# Documentation files
839757
#
@@ -901,32 +819,65 @@ set_target_properties(img PROPERTIES OUTPUT_NAME "img")
901819
set_target_properties(img PROPERTIES LINKER_LANGUAGE C)
902820

903821

904-
if(CBF_ENABLE_FORTRAN)
905-
906822
#
907-
# Build the f90 library sources
908-
#
909-
find_program(M4 m4)
910-
foreach(f90src IN LISTS CBF_F90_BUILT_SOURCES)
911-
get_filename_component(filename "${f90src}" NAME_WE )
912-
set(f90bldsrc "${CBF__BLDSRC}/${filename}.f90")
913-
set(f90srcm4 "${CBF__M4}/${filename}.m4")
914-
add_custom_command(
915-
OUTPUT "${f90bldsrc}"
916-
WORKING_DIRECTORY "${CBF__M4}"
917-
COMMAND ${M4} -P "${CBF_M4FLAGS}" "${f90srcm4}" > "${f90bldsrc}"
918-
DEPENDS ${CBF_M4_FCB_DEFINES} ${f90srcm4}
919-
COMMENT "Generating ${f90bldsrc}"
920-
)
921-
endforeach(f90src)
823+
# Build all Fortran sources and libraries. The f90cbf library is not
824+
# installed.
825+
if(CBF_ENABLE_FORTRAN)
826+
find_program(M4 m4 REQUIRED)
827+
set(M4FLAGS "-Dfcb_bytes_in_rec=4096" CACHE STRING
828+
"Flags used by the M4 macro processor during Fortran build")
829+
mark_as_advanced(M4FLAGS)
830+
831+
set(f90_sources_m4
832+
"${CMAKE_CURRENT_SOURCE_DIR}/m4/fcb_exit_binary.m4"
833+
"${CMAKE_CURRENT_SOURCE_DIR}/m4/fcb_next_binary.m4"
834+
"${CMAKE_CURRENT_SOURCE_DIR}/m4/fcb_open_cifin.m4"
835+
"${CMAKE_CURRENT_SOURCE_DIR}/m4/fcb_packed.m4"
836+
"${CMAKE_CURRENT_SOURCE_DIR}/m4/fcb_read_bits.m4"
837+
"${CMAKE_CURRENT_SOURCE_DIR}/m4/fcb_read_image.m4"
838+
"${CMAKE_CURRENT_SOURCE_DIR}/m4/fcb_read_xds_i2.m4"
839+
"${CMAKE_CURRENT_SOURCE_DIR}/m4/test_fcb_read_image.m4"
840+
"${CMAKE_CURRENT_SOURCE_DIR}/m4/test_xds_binary.m4")
841+
842+
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/src")
843+
foreach(f90srcm4 IN LISTS f90_sources_m4)
844+
get_filename_component(filename "${f90srcm4}" NAME_WE)
845+
set(f90bldsrc "${CMAKE_CURRENT_BINARY_DIR}/src/${filename}.f90")
846+
add_custom_command(
847+
OUTPUT "${f90bldsrc}"
848+
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/m4"
849+
COMMAND ${M4} -P ${M4FLAGS} "${f90srcm4}" > "${f90bldsrc}"
850+
DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/m4/fcblib_defines.m4"
851+
"${f90srcm4}"
852+
COMMENT "Generating ${f90bldsrc}")
853+
endforeach()
854+
855+
add_library(fcb
856+
"${CMAKE_CURRENT_BINARY_DIR}/src/fcb_exit_binary.f90"
857+
"${CMAKE_CURRENT_BINARY_DIR}/src/fcb_next_binary.f90"
858+
"${CMAKE_CURRENT_BINARY_DIR}/src/fcb_open_cifin.f90"
859+
"${CMAKE_CURRENT_BINARY_DIR}/src/fcb_packed.f90"
860+
"${CMAKE_CURRENT_BINARY_DIR}/src/fcb_read_bits.f90"
861+
"${CMAKE_CURRENT_BINARY_DIR}/src/fcb_read_image.f90"
862+
"${CMAKE_CURRENT_BINARY_DIR}/src/fcb_read_xds_i2.f90"
863+
"${CBF__SRC}/fcb_atol_wcnt.f90"
864+
"${CBF__SRC}/fcb_ci_strncmparr.f90"
865+
"${CBF__SRC}/fcb_nblen_array.f90"
866+
"${CBF__SRC}/fcb_read_byte.f90"
867+
"${CBF__SRC}/fcb_read_line.f90"
868+
"${CBF__SRC}/fcb_skip_whitespace.f90")
869+
set_target_properties(fcb PROPERTIES OUTPUT_NAME "fcb")
870+
set_target_properties(fcb PROPERTIES LINKER_LANGUAGE C)
871+
install(TARGETS fcb DESTINATION lib)
922872

923873

924-
#
925-
# Build the fcb libraries
926-
#
927-
add_library(fcb ${CBF_F90_BUILT_SOURCES};${CBF_F90_SOURCES})
928-
set_target_properties(fcb PROPERTIES OUTPUT_NAME "fcb")
929-
set_target_properties(fcb PROPERTIES LINKER_LANGUAGE C)
874+
# Use the pre-generated SWIG wrapper, because current SWIG does not
875+
# support Fortran.
876+
add_library(f90cbf
877+
"${CMAKE_CURRENT_SOURCE_DIR}/f90cbf/f90cbf.f90"
878+
"${CMAKE_CURRENT_SOURCE_DIR}/f90cbf/f90cbf_wrap.c")
879+
target_link_libraries(f90cbf
880+
cbf)
930881
endif()
931882

932883

@@ -970,6 +921,9 @@ target_link_libraries(cbf2adscimg
970921
cbf
971922
"${libm}")
972923

924+
add_executable(convert_f90_swig_wrap
925+
"${CBF__EXAMPLES}/convert_f90_swig_wrap.cpp")
926+
973927
add_executable(convert_image
974928
"${CBF__EXAMPLES}/convert_image.c")
975929
target_link_libraries(convert_image
@@ -1073,31 +1027,17 @@ target_link_libraries(testreals
10731027

10741028

10751029
#
1076-
# F90 examples
1077-
#
1030+
# F90 examples. Only for testing, not installed.
10781031
if(CBF_ENABLE_FORTRAN)
1079-
add_custom_command(OUTPUT "${CBF__BLDEXMP}/test_fcb_read_image.f90"
1080-
WORKING_DIRECTORY "${CBF__M4}"
1081-
COMMAND ${M4} -P "${CBF_M4FLAGS}" "${CBF__M4}/test_fcb_read_image.m4" > "${CBF__BLDEXMP}/test_fcb_read_image.f90"
1082-
DEPENDS ${CBF_M4_FCB_DEFINES} "${CBF__M4}/test_fcb_read_image.m4"
1083-
COMMENT "Generating ${test_fcb_read_image.f90}")
1084-
add_custom_command(OUTPUT "${CBF__BLDEXMP}/test_xds_binary.f90"
1085-
WORKING_DIRECTORY "${CBF__M4}"
1086-
COMMAND ${M4} -P "${CBF_M4FLAGS}" "${CBF__M4}/test_xds_binary.m4" > "${CBF__BLDEXMP}/test_xds_binary.f90"
1087-
DEPENDS ${CBF_M4_FCB_DEFINES} "${CBF__M4}/test_xds_binary.m4"
1088-
COMMENT "Generating ${test_xds_binary.f90}")
1089-
10901032
add_executable(test_fcb_read_image
1091-
"${CBF__BLDEXMP}/test_fcb_read_image.f90")
1033+
"${CMAKE_CURRENT_BINARY_DIR}/src/test_fcb_read_image.f90")
10921034
target_link_libraries(test_fcb_read_image
1093-
fcb
1094-
hdf5)
1035+
fcb)
10951036

10961037
add_executable(test_xds_binary
1097-
"${CBF__BLDEXMP}/test_xds_binary.f90")
1038+
"${CMAKE_CURRENT_BINARY_DIR}/src/test_xds_binary.f90")
10981039
target_link_libraries(test_xds_binary
1099-
fcb
1100-
hdf5)
1040+
fcb)
11011041
endif()
11021042

11031043

@@ -1122,10 +1062,6 @@ install (TARGETS sequence_match DESTINATION bin)
11221062
install (TARGETS tiff2cbf DESTINATION bin)
11231063
install(TARGETS cbf DESTINATION lib)
11241064

1125-
if(CBF_ENABLE_FORTRAN)
1126-
install(TARGETS fcb DESTINATION lib)
1127-
endif()
1128-
11291065
install(TARGETS img DESTINATION lib)
11301066
install (DIRECTORY ${CBF__INCLUDE}/ DESTINATION include/cbflib FILES_MATCHING PATTERN "*.h")
11311067
install (DIRECTORY ${CBF__BIN_INCLUDE}/* DESTINATION include/cbflib FILES_MATCHING PATTERN "*.h")
@@ -2280,3 +2216,119 @@ add_test(NAME dectris-cmp
22802216
set_tests_properties(dectris-cmp PROPERTIES
22812217
FIXTURES_REQUIRED dectris
22822218
REQUIRED_FILES "${CBFlib_SOURCE_DIR}/templates/cbf_test_orig.out")
2219+
2220+
2221+
#
2222+
# Fortran tests
2223+
#
2224+
# test_fcb_read_image and test_xds_binary expect the name of the input
2225+
# file on stdin and write to stdout. The input file cannot have any
2226+
# directory components.
2227+
if(CBF_ENABLE_FORTRAN)
2228+
#
2229+
# xds_binary-flat
2230+
add_test(NAME xds_binary-flat
2231+
COMMAND ${CMAKE_COMMAND}
2232+
"-Dcommand=$<TARGET_FILE:test_xds_binary>"
2233+
"-Dinput=testflatin.cbf"
2234+
"-Doutput-file=${CBF__DATA}/test_xds_bin_testflatout.out"
2235+
-P "${CMAKE_CURRENT_SOURCE_DIR}/redirect.cmake"
2236+
WORKING_DIRECTORY "${data_input}")
2237+
set_tests_properties(xds_binary-flat PROPERTIES
2238+
FIXTURES_SETUP xds_binary-flat
2239+
REQUIRED_FILES "${data_input}/testflatin.cbf")
2240+
2241+
add_test(NAME xds_binary-flat-cleanup
2242+
COMMAND ${CMAKE_COMMAND} -E rm "${CBF__DATA}/test_xds_bin_testflatout.out")
2243+
set_tests_properties(xds_binary-flat-cleanup PROPERTIES
2244+
FIXTURES_CLEANUP xds_binary-flat)
2245+
2246+
add_test(NAME xds_binary-flat-cmp
2247+
COMMAND ${CMAKE_COMMAND} -E compare_files
2248+
"${data_output}/test_xds_bin_testflatout_orig.out"
2249+
"${CBF__DATA}/test_xds_bin_testflatout.out")
2250+
set_tests_properties(xds_binary-flat-cmp PROPERTIES
2251+
FIXTURES_REQUIRED xds_binary-flat
2252+
REQUIRED_FILES "${data_output}/test_xds_bin_testflatout_orig.out")
2253+
2254+
2255+
#
2256+
# xds_binary-flatpacked
2257+
add_test(NAME xds_binary-flatpacked
2258+
COMMAND ${CMAKE_COMMAND}
2259+
"-Dcommand=$<TARGET_FILE:test_xds_binary>"
2260+
"-Dinput=testflatpackedin.cbf"
2261+
"-Doutput-file=${CBF__DATA}/test_xds_bin_testflatpackedout.out"
2262+
-P "${CMAKE_CURRENT_SOURCE_DIR}/redirect.cmake"
2263+
WORKING_DIRECTORY "${data_input}")
2264+
set_tests_properties(xds_binary-flatpacked PROPERTIES
2265+
FIXTURES_SETUP xds_binary-flatpacked
2266+
REQUIRED_FILES "${data_input}/testflatpackedin.cbf")
2267+
2268+
add_test(NAME xds_binary-flatpacked-cleanup
2269+
COMMAND ${CMAKE_COMMAND} -E rm "${CBF__DATA}/test_xds_bin_testflatpackedout.out")
2270+
set_tests_properties(xds_binary-flatpacked-cleanup PROPERTIES
2271+
FIXTURES_CLEANUP xds_binary-flatpacked)
2272+
2273+
add_test(NAME xds_binary-flatpacked-cmp
2274+
COMMAND ${CMAKE_COMMAND} -E compare_files
2275+
"${data_output}/test_xds_bin_testflatpackedout_orig.out"
2276+
"${CBF__DATA}/test_xds_bin_testflatpackedout.out")
2277+
set_tests_properties(xds_binary-flatpacked-cmp PROPERTIES
2278+
FIXTURES_REQUIRED xds_binary-flatpacked
2279+
REQUIRED_FILES "${data_output}/test_xds_bin_testflatpackedout_orig.out")
2280+
2281+
2282+
#
2283+
# fcb_read_image-flat
2284+
add_test(NAME fcb_read_image-flat
2285+
COMMAND ${CMAKE_COMMAND}
2286+
"-Dcommand=$<TARGET_FILE:test_fcb_read_image>"
2287+
"-Dinput=testflatin.cbf"
2288+
"-Doutput-file=${CBF__DATA}/test_fcb_read_testflatout.out"
2289+
-P "${CMAKE_CURRENT_SOURCE_DIR}/redirect.cmake"
2290+
WORKING_DIRECTORY "${data_input}")
2291+
set_tests_properties(fcb_read_image-flat PROPERTIES
2292+
FIXTURES_SETUP fcb_read_image-flat
2293+
REQUIRED_FILES "${data_input}/testflatin.cbf")
2294+
2295+
add_test(NAME fcb_read_image-flat-cleanup
2296+
COMMAND ${CMAKE_COMMAND} -E rm "${CBF__DATA}/test_fcb_read_testflatout.out")
2297+
set_tests_properties(fcb_read_image-flat-cleanup PROPERTIES
2298+
FIXTURES_CLEANUP fcb_read_image-flat)
2299+
2300+
add_test(NAME fcb_read_image-flat-cmp
2301+
COMMAND ${CMAKE_COMMAND} -E compare_files
2302+
"${data_output}/test_fcb_read_testflatout_orig.out"
2303+
"${CBF__DATA}/test_fcb_read_testflatout.out")
2304+
set_tests_properties(fcb_read_image-flat-cmp PROPERTIES
2305+
FIXTURES_REQUIRED fcb_read_image-flat
2306+
REQUIRED_FILES "${data_output}/test_fcb_read_testflatout_orig.out")
2307+
2308+
2309+
#
2310+
# fcb_read_image-flatpacked
2311+
add_test(NAME fcb_read_image-flatpacked
2312+
COMMAND ${CMAKE_COMMAND}
2313+
"-Dcommand=$<TARGET_FILE:test_fcb_read_image>"
2314+
"-Dinput=testflatpackedin.cbf"
2315+
"-Doutput-file=${CBF__DATA}/test_fcb_read_testflatpackedout.out"
2316+
-P "${CMAKE_CURRENT_SOURCE_DIR}/redirect.cmake"
2317+
WORKING_DIRECTORY "${data_input}")
2318+
set_tests_properties(fcb_read_image-flatpacked PROPERTIES
2319+
FIXTURES_SETUP fcb_read_image-flatpacked
2320+
REQUIRED_FILES "${data_input}/testflatpackedin.cbf")
2321+
2322+
add_test(NAME fcb_read_image-flatpacked-cleanup
2323+
COMMAND ${CMAKE_COMMAND} -E rm "${CBF__DATA}/test_fcb_read_testflatpackedout.out")
2324+
set_tests_properties(fcb_read_image-flatpacked-cleanup PROPERTIES
2325+
FIXTURES_CLEANUP fcb_read_image-flatpacked)
2326+
2327+
add_test(NAME fcb_read_image-flatpacked-cmp
2328+
COMMAND ${CMAKE_COMMAND} -E compare_files
2329+
"${data_output}/test_fcb_read_testflatpackedout_orig.out"
2330+
"${CBF__DATA}/test_fcb_read_testflatpackedout.out")
2331+
set_tests_properties(fcb_read_image-flatpacked-cmp PROPERTIES
2332+
FIXTURES_REQUIRED fcb_read_image-flatpacked
2333+
REQUIRED_FILES "${data_output}/test_fcb_read_testflatpackedout_orig.out")
2334+
endif()

0 commit comments

Comments
 (0)