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

Reply via email to