从find-xxx.cmake文件

时间:2017-05-05 12:51:06

标签: cmake

我正在尝试将自定义的find-xxx.cmake文件添加到我的cmake项目中,以便添加外部库。外部项目不仅对链接器有一些传递依赖性,对于预编译器也有一些传递依赖性。即我需要为protobuf和occi以及其他六个小库提供标题,以便包含外部项目的标题。

find-extlib.cmake的相关部分:

function(MY_FIND_INCLUDE LIBNAME FILENAME SUFFIX)
find_path(${LIBNAME}_INCLUDE_DIR
    NAMES ${FILENAME}
    PATHS ${EXTLIB_POSSIBLE_DIRS}
    PATH_SUFFIXES ${SUFFIX} 
    )

if (${LIBNAME}_INCLUDE_DIR)
    MESSAGE_QUIETLY(EXTLIB_FIND_QUIETLY STATUS "Found ${${LIBNAME}_INCLUDE_DIR}")
elseif (EXTLIB_FIND_REQUIRED)
    message(FATAL_ERROR "Could not find extlib.")
else ()
    MESSAGE_QUIETLY(EXTLIB_FIND_QUIETLY WARNING "${LIBNAME} headers not found")
endif ()

mark_as_advanced(${LIBNAME}_INCLUDE_DIR)
endfunction ()

MY_FIND_INCLUDE(LIB1 header.h main/lib1)
if (LIB1_INCLUDE_DIR)
    set(EXTLIB_INCLUDE_DIRS ${LIB1_INCLUDE_DIR})
endif ()
MY_FIND_INCLUDE(LIB2 lib2/lib2.h include)
if (LIB2_INCLUDE_DIR)
    set(EXTLIB_INCLUDE_DIRS "${EXTLIB_INCLUDE_DIRS} ${LIB2_INCLUDE_DIR}")
endif ()
# etc, etc.

这将返回我需要添加的所有包含路径的漂亮列表。它看起来就像我的库列表,我以非常相似的方式制作,看起来很有效。

在我的CMakeLists.txt中,我添加:

target_include_directories(${PROJECT_NAME} PRIVATE ${EXTLIB_INCLUDE_DIRS})

构建失败,抱怨它无法在LIB1(或LIB2等)中找到标头。我可以在我的Linux版本的MYLIB.dir/flags.make中看到列表没有被分解。标志应该的地方是:

-I path/to/lib1 -I path/to/lib2 ...

代替列出

-I "path/to/lib1 path/to/lib2 ..."

这真的是正确的行为吗?我不应该能够为单个项目提供多个包含目录吗?如果我必须分别找到所有这些库,那将是非常繁琐的。它们每次都与此外部库具有相同的配置。总是很难说Kitware实际上打算如何完成这些工作......我应该用不同的方式编写Find模块吗?

2 个答案:

答案 0 :(得分:2)

看起来我可以使用;而不是空格连接目录,或使用list(APPEND ...)更好一点:

MY_FIND_INCLUDE(LIB1 header.h main/lib1)
if (LIB1_INCLUDE_DIR)
    list(APPEND EXTLIB_INCLUDE_DIRS ${LIB1_INCLUDE_DIR})
endif ()
MY_FIND_INCLUDE(LIB2 lib2/lib2.h include)
if (LIB2_INCLUDE_DIR)
    list(APPEND EXTLIB_INCLUDE_DIRS "${LIB2_INCLUDE_DIR}")
endif ()

答案 1 :(得分:2)

单独引用每个包含目录。

而不是: set(EXTLIB_INCLUDE_DIRS "${EXTLIB_INCLUDE_DIRS} ${LIB2_INCLUDE_DIR}")

写: set(EXTLIB_INCLUDE_DIRS "${EXTLIB_INCLUDE_DIRS}" "${LIB2_INCLUDE_DIR}")

使用双引号,您可以在字符串中包含空格。