Вопрос:

CMake устанавливает заголовочные файлы и поддерживает иерархию каталогов

cmake

1661 просмотра

3 ответа

1182 Репутация автора

Использование cmake 2.8

Я хотел бы сохранить иерархию каталогов при копировании файлов заголовков из исходного каталога в каталог назначения. Например, файл заголовка, который необходимо скопировать, - это abc / 1.h, def / 2.h, и они также должны быть скопированы в том же порядке в месте назначения напрямую (устанавливается через CMAKE_INSTALL_PREFIX)

Это то, что я пробовал, но он просто копирует файлы заголовков, а не файлы заголовков, включая имя родительского каталога

set(HEADERS "abc/1.h;def/2.h")
install(FILES ${HEADERS} DESTINATION include)

Окончательный вывод должен быть dest_directory / abc / 1.h и dest_directory / def / 2.h.

Автор: infoclogged Источник Размещён: 11.01.2018 05:27

Ответы (3)


0 плюса

1182 Репутация автора

Просто нашел ответ сам после попытки пару раз. Это нужно сделать в несколько этапов.

install(FILES "abc/1.h" DESTINATION "include/abc")
install(FILES "def/2.h" DESTINATION "include/def")

В сложных ситуациях может использоваться REGEX. Пожалуйста, посмотрите Regex в команде установки CMake

Автор: infoclogged Размещён: 11.01.2018 05:39

7 плюса

30265 Репутация автора

Решение

Если у вас есть много файлов в каталоге для установки, вы можете рассмотреть возможность установки каталога с install(DIRECTORY)потоком команд. Вы можете выбрать, какие файлы в каталоге должны быть установлены с помощью параметров PATTERN или REGEX :

install(DIRECTORY "${CMAKE_SOURCE_DIR}/" # source directory
        DESTINATION "include" # target directory
        FILES_MATCHING # install only matched files
        PATTERN "*.h" # select header files
)

См. Документацию CMake для получения дополнительной информации о install(DIRECTORY). Кроме того, он описывает значение «/» в конце исходного каталога.

Автор: Tsyvarev Размещён: 11.01.2018 07:42

0 плюса

3938 Репутация автора

В духе вопроса мы хотели установить все заголовки в HEADERпеременную, которая не обязательно должна включать все заголовки в данном каталоге (например, могут быть зависимые от платформы заголовки).

Мы решили эту проблему с помощью следующего макроса, который фактически устанавливает все файлы, указанные FILESпри создании родительских каталогов, если таковые имеются:

macro(install_with_directory)
    set(optionsArgs "")
    set(oneValueArgs "DESTINATION")
    set(multiValueArgs "FILES")
    cmake_parse_arguments(CAS "${optionsArgs}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} )

    foreach(FILE ${CAS_FILES})
        get_filename_component(DIR ${FILE} DIRECTORY)
        INSTALL(FILES ${FILE} DESTINATION ${CAS_DESTINATION}/${DIR})
    endforeach()
endmacro(install_with_directory)
Автор: Ad N Размещён: 22.05.2019 05:02
Вопросы из категории :
32x32