Как исправить зависимость от модулей CMake Fortran? - PullRequest
0 голосов
/ 06 февраля 2019

Привет У меня есть проект на Fortran со следующим порядком каталогов

CMakeLists.txt
src/module_1.f90     (Fortran Modules)
src/module_2.f90
src/... (more files)

module_1.f90 зависит от module_2.f90.

Упрощенный CMakeLists.txt:

project(MyProject LANGUAGES Fortran)
file(GLOB SOURCES src/*.f90)
add_executable(MyExec SOURCES)

Я получаю ошибку зависимости:

Fatal Error: Can't open module file ‘module_2.mod’ :for reading at (1): The file or directory doesn't exist.

Я пытался:

include_directories(src)

без положительных результатов.

, если вы выполняете поиск в каталоге сборки:

find . -name "module_2*"

ничего не выходит, поэтому module_2 не скомпилирован до module_1.Почему это происходит?

Отредактировано:

Я нашел проблему в конце.В module_1 у меня была прагма (которая изначально не поддерживается Fortran), которая была похожа на:

#ifdef VAR
    module_1_function
#endif

, и в моем CMakeLists.txt я объявил:

 set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -DVAR=2")

Когда CMakeсоздавал дерево зависимостей, оно не учитывало эту переменную.Чтобы сделать это правильно, я должен был сделать последнее следующим образом:

 add_definitions(-DVAR=2)

Это решило проблему.

Ответы [ 2 ]

0 голосов
/ 28 марта 2019

Вместо того, чтобы помещать все файлы .mod в один каталог, для более крупных проектов существует более чистое решение, определяющее функцию:

function(add_fortran_library LIB)
    add_library(${LIB} ${ARGN})

    # set module path to LIB_DIR/mod
    get_target_property(LIB_DIR ${LIB} BINARY_DIR)
    set_target_properties(${LIB} PROPERTIES Fortran_MODULE_DIRECTORY ${LIB_DIR}/mod)

    # making LIB_DIR/mod available for libraries linking LIB 
    target_include_directories(${LIB} INTERFACE ${LIB_DIR}/mod)
endfunction(add_fortran_library)

Если вы теперь используете add_fortran_library () вместо add_library (), выбольше не нужно заботиться о модулях.

0 голосов
/ 06 февраля 2019

Вы должны указать CMake, где разместить и найти модули.

Я использую следующее, но, конечно, конкретное местоположение зависит от вас.

set(CMAKE_Fortran_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/modules)

Поместите строку выше передлюбая команда include_directory или add_executable.

...