I'm converting a Fortran package that was using GNU make to build to CMake, but I've run into a problem compiling F90 module code where the source code is stored under many directories.
The package has a directory structure src/ src/dir1 src/dir2 : : Each dir* has *.F files that must be preprocessed to *.f90 files and then compiled. In the original build system, the package had an empty 'build' directory under src. The processed files were created there and then the library was built from these files was also generated there. I tried to do something similar with CMake but I see errors from make about 'No rules to make target ' pointing to files that do not exist under the CMakeFiles directories, however the object file and the *.mod files are there, so I know I'm compiling correctly. Here's my CMakeLists.txt snippet in the src directory set(DIR1_FILES dir1/file1_module.F dir2/file2_module.F) set(DIR2_FILES dir2/file3_module.F dir2/file4_module.F) set(F_PREPROCESS_FILES ${DIR1_FILES} ${DIR2_FILES}) set(F90Library_SOURCE_FILES) foreach (src_file ${F_PREPROCESS_FILES}) get_filename_component(filename "${src_file}" NAME_WE) set(F_file ${CMAKE_CURRENT_SOURCE_DIR}/${src_file}) set(new_file_f90 ${CMAKE_CURRENT_BINARY_DIR}/${filename}.f90) message(STATUS "new_file_f90=${new_file_f90}") add_custom_command(OUTPUT "${new_file_f90}" COMMAND ${CMAKE_C_COMPILER} -E ${CMAKE_CPP_FLAGS} ${F_file} ${grep_filter} | grep -v \\!\\!CPP\\!\\! | grep -v ^\# > ${new_file_f90} IMPLICIT_DEPENDS Fortran "${F_file}" COMMENT "\tPreprocessing ${src_file}" VERBATIM) list(APPEND PGSLibIface_SOURCE_FILES ${new_file_f90}) endforeach() # --- Library add_library(mylib ${F90Library_SOURCE_FILES}) When I try to build, the error I see is the following Preprocessing dir1/file1_module.F Preprocessing dir1/file2_module.F Preprocessing dir2/file3_module.F Preprocessing dir2/file4_module.F Scanning dependencies of target mylib Building Fortran object src/CMakeFiles/mylib.dir/file1_module.f90.o make[2]: *** No rule to make target `src/file1_module.f90.provides', needed by `src/CMakeFiles/mylib.dir/file1_module.mod.proxy'. Stop. make[1]: *** [src/CMakeFiles/mylib.dir/all] Error 2 make: *** [all] Error 2 In the the CMakeFiles/mylib.dir/, I have the files src/CMakeFiles/mylib.dir/file1_module.f90.o src/CMakeFiles/mylib.dir/file1_module.f90.o.provides.build src/CMakeFiles/mylib.dir/file1_module.mod.stamp but nothing ending in *.provides or *.proxy. I assume these are files that CMake uses to construct the correct compile order for the modules. I could flatten the directory structure, however I'd rather not do that and try to preserve the original file organization. Thanks in advance for any help! Lori A. Pritchett-Sheats Los Alamos National Laboratory CCS-2, Computational Physics 505-665-6675
-- Powered by www.kitware.com Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ Follow this link to subscribe/unsubscribe: http://www.cmake.org/mailman/listinfo/cmake