我们CMakeList.txt有一个target_include_directories在蠕动.它打破了我们的下级客户端,如Ubuntu LTS,CentOS的和Solaris.
我知道我可以用以下内容来保护它(感谢ZW),但我需要Cmake版本2.8.11及更早版本(???)的内容.
cmake_minimum_required(VERSION 2.8.5 FATAL_ERROR)
...
if (NOT CMAKE_VERSION VERSION_LESS 2.8.12)
target_include_directories(...)
else()
???
endif()
Run Code Online (Sandbox Code Playgroud)
我们的目录结构非常简单.有一个目录中包含头文件,同一目录中包含源文件.这是设计使用户在调试器下没有麻烦.
给出我们的配置可以使用以下内容(如果@steveire答案适用于我们,我不清楚):
if (NOT CMAKE_VERSION VERSION_LESS 2.8.12)
target_include_directories(...)
else()
include_directories("${ROOT_SOURCE_DIR}")
endif()
Run Code Online (Sandbox Code Playgroud)
如果没有,应该用什么代替target_include_directories2.8.11及更早版本?
问题
该target_include_directories()命令具有扩展功能include_directories().所以我同意@Tsyvarev它主要取决于你的使用方式target_include_directories().
解
如果你使用target_include_directories(my_target PRIVATE ...)相当于set_property(TARGET my_target APPEND PROPERTY INCLUDE_DIRECTORIES ...).但include_directories()相比之下,为当前CMakeLists.txt及其所有add_subdirectory()兄弟姐妹中的所有目标设置这些目录.
如果使用target_include_directories(my_target INTERFACE/PUBLIC ...),则在版本2.8.11之前的CMake中没有此类功能.您可以模拟自传播包含目录的行为,但这要复杂得多.
建议
如果您仍想支持旧版本的CMake,请不要使用新命令.因为这不仅仅是target_include_directories()(参见CMake Version Compatibility Matrix/Commands).
参考
向下兼容 target_include_directories()
以下代码显示了较旧的CMake版本必须要模拟的内容target_include_directories():
function(target_include_directories _target)
set_property(GLOBAL APPEND PROPERTY GLOBAL_TARGETS "${_target}")
set(_mode "PRIVATE")
foreach(_arg ${ARGN})
if (_arg MATCHES "SYSTEM|BEFORE")
message(FATAL_ERROR "target_include_directories: SYSTEM or BEFORE not supported")
endif()
if (_arg MATCHES "INTERFACE|PUBLIC|PRIVATE")
set(_mode "${_arg}")
else()
get_filename_component(_inc_dir "${_arg}" ABSOLUTE)
if (_mode MATCHES "PUBLIC|PRIVATE")
set_property(TARGET ${_target} APPEND PROPERTY INCLUDE_DIRECTORIES "${_inc_dir}")
endif()
if (_mode MATCHES "INTERFACE|PUBLIC")
set_property(TARGET ${_target} APPEND PROPERTY MY_INTERFACE_INCLUDE_DIRECTORIES "${_inc_dir}")
endif()
endif()
endforeach()
endfunction(target_include_directories)
function(target_link_libraries _target)
set_property(GLOBAL APPEND PROPERTY GLOBAL_TARGETS "${_target}")
set(_mode "PUBLIC")
foreach(_arg ${ARGN})
if (_arg MATCHES "INTERFACE|PUBLIC|PRIVATE|LINK_PRIVATE|LINK_PUBLIC|LINK_INTERFACE_LIBRARIES")
set(_mode "${_arg}")
else()
if (NOT _arg MATCHES "debug|optimized|general")
set_property(TARGET ${_target} APPEND PROPERTY MY_LINK_LIBARIES "${_arg}")
endif()
endif()
endforeach()
_target_link_libraries(${_target} ${ARGN})
endfunction(target_link_libraries)
function(my_update_depending_inc_dirs _targets _target _dep_target)
get_property(_libs TARGET ${_dep_target} PROPERTY MY_LINK_LIBARIES)
if (NOT _libs)
return()
endif()
foreach(_lib ${_libs})
list(FIND _targets "${_lib}" _idx)
if (NOT _idx EQUAL -1)
get_property(_inc_dirs TARGET ${_lib} PROPERTY MY_INTERFACE_INCLUDE_DIRECTORIES)
set_property(TARGET ${_target} APPEND PROPERTY INCLUDE_DIRECTORIES "${_inc_dirs}")
# to prevent cyclic dependencies getting us into an endless loop
# remove the target we already processed from the list
list(REMOVE_AT _targets ${_idx})
my_update_depending_inc_dirs("${_targets}" "${_target}" "${_lib}")
endif()
endforeach()
endfunction(my_update_depending_inc_dirs)
function(my_update_inc_dirs)
get_property(_targets GLOBAL PROPERTY GLOBAL_TARGETS)
list(REMOVE_DUPLICATES _targets)
foreach(_target ${_targets})
my_update_depending_inc_dirs("${_targets}" "${_target}" "${_target}")
endforeach()
endfunction(my_update_inc_dirs)
Run Code Online (Sandbox Code Playgroud)
使用以下代码进行测试(注意:最后需要my_update_inc_dirs()调用):
的CMakeLists.txt
cmake_minimum_required(VERSION 2.6)
project(TargetIncludeDirectories)
...
add_library(PLib plib/source/plib.cpp)
target_include_directories(PLib PRIVATE plib/source PUBLIC plib/include)
add_library(Lib lib/source/lib.cpp)
target_include_directories(Lib PRIVATE lib/source PUBLIC lib/include)
target_link_libraries(Lib PRIVATE PLib)
add_executable(App main.cpp)
target_include_directories(App PRIVATE . PUBLIC include)
target_link_libraries(App PRIVATE Lib)
my_update_inc_dirs()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2421 次 |
| 最近记录: |