Невозможно указать параметры компиляции для импортированной цели "..." - PullRequest
1 голос
/ 22 января 2020

Я хочу предоставить пользователям моей библиотеки две цели: одну, которая задает путь включения и c., И другую, которая содержит полезные дополнительные параметры компиляции. Однако, для дополнительной цели некоторые из моих пользователей получают ошибку

Cannot specify compile options for imported target "myproject::extra"

, так что это похоже на более старые версии CMake.

Я тестировал с CMake 3.9.2. Тестовый проект, включая CI, находится на GitHub , с неудачной сборкой здесь .

(Как) можно ли сделать мой подход устойчивым для всех версий CMake?


Основной проект CMakeLists.txt:

cmake_minimum_required(VERSION 3.0)
project(myproject)
add_library(myproject INTERFACE)
set(MYPROJECT_VERSION "1.0.0")

target_include_directories(myproject INTERFACE
    $<INSTALL_INTERFACE:include>
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>)

include(CMakePackageConfigHelpers)
include(GNUInstallDirs)

install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/include/" DESTINATION include)
install(TARGETS myproject EXPORT myproject-targets)
install(EXPORT myproject-targets FILE myprojectTargets.cmake DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/myproject")
write_basic_package_version_file("${CMAKE_CURRENT_BINARY_DIR}/myprojectConfigVersion.cmake" VERSION ${MYPROJECT_VERSION} COMPATIBILITY AnyNewerVersion)
install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/myprojectConfig.cmake" "${CMAKE_CURRENT_BINARY_DIR}/myprojectConfigVersion.cmake" DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/myproject")

Проект myprojectConfig.cmake:

include(CMakeFindDependencyMacro)

if(NOT TARGET myproject)
    include("${CMAKE_CURRENT_LIST_DIR}/myprojectTargets.cmake")
endif()

if(NOT TARGET myproject::extra)
    add_library(myproject::extra INTERFACE IMPORTED)
    if(MSVC)
        target_compile_options(myproject::extra INTERFACE /W4)
    else()
        target_compile_options(myproject::extra INTERFACE -Wall)
    endif()
endif()

Проект пользователя CMakeLists.txt может выглядеть следующим образом:

cmake_minimum_required(VERSION 3.0)
project(myexec)
find_package(myproject REQUIRED)
add_executable(myexec main.cpp)
target_link_libraries(myexec PRIVATE myproject myproject::extra)

1 Ответ

1 голос
/ 22 января 2020

Список функций, применимых для целей IMPORTED и INTERFACE, изменяется по мере развития CMake.

Большинство таких функций влияет только на указанные c свойства цели . Таким образом, вместо вызова функции вы можете установить свойство напрямую. Это будет работать в любой версии CMake:

# Works only in new CMake versions
target_compile_options(myproject::extra INTERFACE /W4)
# Equivalent which works in any CMake version
set_property(TARGET myproject::extra PROPERTY INTERFACE_COMPILE_OPTIONS /W4)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...