Каталог модулей CMake Fortran для использования с add_library - PullRequest
0 голосов
/ 09 октября 2018

У меня есть проект CMake 3.5.2, в котором создается библиотека: libtest.a, которая затем связывается с исполняемым файлом.

Исходный код - Fortran, а libtest.a - файл модуля.: "main.mod"

Исполняемый файл также должен включать этот файл main.mod, поэтому, чтобы сделать main.mod доступным, при создании проекта я установил переменную CMAKE_Fortran_MODULE_DIRECTORY в известном месте и добавил егок соответствующим путям включения.

Это прекрасно работает при сборке всего проекта, main.mod создается в известном месте и находится там, где необходим код.Мое использование, однако, делает необходимым только сборку libtest.a и оставление исполняемого файла для сборки последующим пользователем.

Проблема, с которой я сталкиваюсь, заключается в том, что когда я захожу в исходный код libtestи обрабатывать его как собственный проект CMake, библиотека будет собирать и устанавливать, но файл main.mod всегда остается в BINARY_DIR и не создается в CMAKE_Fortran_MODULE_DIRECTORY, несмотря на настройку в CMakeList.txt в libtest.

Fortran_MODULE_DIRECTORY соблюдается только при вызове add_executable ()?И просто проигнорировал сборку библиотеки в одиночку?Или я что-то упускаю.

Спасибо за помощь.

РЕДАКТИРОВАТЬ: Это воспроизведет мою проблему.

test_mod.f90:

module main
 implicit none
 real, parameter :: pi=3.2
end module main

tt.f90:

program test
  use main
  implicit none
  real :: a, area
  a =10
  area = a * 100
end program test

CMakeList.txt:

CMAKE_minimum_required( VERSION 3.5 )
enable_language( Fortran )
project( tt )
file( GLOB test_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.f90 )
add_library( tt STATIC ${test_SOURCES} )
set( CMAKE_Fortran_MODULE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/Mod )
install( TARGETS ${PROJECT_NAME} DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/Lib/ )

Если я соберу и установлю вышеуказанный код, я получу библиотеку libtt.a, установленную в каталоге Lib, однако мой main.mod останется в моем каталоге сборки и не будет встроен в модпапка.

1 Ответ

0 голосов
/ 09 октября 2018

Здесь я предполагаю, что «пользователь» использует cmake для сборки проекта, имея доступ к источнику вашего проекта.

Шаги к работающей сборке.

  1. ТамCMakeLists.txt файл для libtest, в котором указано CMAKE_Fortran_MODULE_DIRECTORY.Этого должно быть достаточно для появления main.mod.
  2. Существует файл CMakeLists.txt для сборки "клиентской" программы.Этот файл должен включать проект libtest с add_subdirectory.
  3. Add target_link_libraries(NAME_OF_PROGRAM NAME_OF_LIBRARY).Это только заботится о связывании библиотек и не является достаточным (в любом случае для решения B ниже), чтобы модуль был известен клиентской программе.

Теперь создайте собственное приключение:

Решение A: в libtest CMakeLists.txt поместите модуль, куда «пойдут все модули», например, set(CMAKE_Fortran_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/modules) (это необходимо сделать также для «клиента» CMakeLists.txt).Переменная ${CMAKE_BINARY_DIR} устанавливается клиентским вызовом cmake и будет одинаковой для всех включенных проектов cmake.Этот каталог будет указан в командах сборки для программ на Фортране.

Решение B: в libtest CMakeLists.txt поместите модуль этой библиотеки в выделенный каталог.Вы можете достичь этого, например, с помощью set(CMAKE_Fortran_MODULE_DIRECTORY ${PROJECT_BINARY_DIR}/modules).Затем вам нужно вручную указать это местоположение с помощью include_directories(PATH_THAT_DEPENDS_ON_THE_NAME_OF_THE_SUBPROJECT) в клиенте CMakeLists.txt.

Если вы хотите, чтобы библиотека была устанавливаемой , вам необходимо указатьпути для установки библиотеки и файла модуля.С Fortran вы должны думать об этом с учетом целевой ОС, компилятора и архитектуры.

Ссылки на документацию CMake:

После добавления вашего примера кода это должна сделать следующая модификация:

CMAKE_minimum_required( VERSION 3.5 )
enable_language( Fortran )
project( tt )

set( CMAKE_Fortran_MODULE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/Mod )

file( GLOB test_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.f90 )

add_library( tt STATIC ${test_SOURCES} )

install( TARGETS ${PROJECT_NAME} DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/Lib/ )

install(DIRECTORY ${CMAKE_Fortran_MODULE_DIRECTORY} DESTINATION ${CMAKE_CURRENT_SOURCE_DIR})
  1. Убедитесь, что set( CMAKE_Fortran_MODULE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/Mod ) стоит перед любой строкой add_library.
  2. Добавьте install(DIRECTORY ${CMAKE_Fortran_MODULE_DIRECTORY} DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}), чтобы фактически установить файл .mod.Файлы модуля (как заголовочные файлы в C) должны быть установлены в дополнение к файлу библиотеки.

Созданная вами настройка немного необычна в том, что вы находите все внутри исходной сборки, тогда как "обычная" установкалокации сделаны относительно CMAKE_INSTALL_PREFIX

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...