验证#include使用由cmake的ExternalProject_Add生成的标头,而不是系统等效的标头

时间:2019-01-04 18:47:52

标签: c++ cmake

我已将zlib添加到CMake项目中,如下所示:

project(zlib)

include(ExternalProject)

# set some variables

ExternalProject_Add(zlib_proj # boring stuff omitted ...
                   )

add_library(zlib SHARED IMPORTED GLOBAL)
add_dependencies(zlib zlib_proj)
set_target_properties(zlib PROPERTIES
  # ...
  INTERFACE_INCLUDE_DIRECTORIES "${INCLUDE_DIR}"
)

我已选择在我的CMake项目中构建zlib而不是使用系统zlib.so,以确保无论在何处克隆和使用项目,都使用相同的zlib内置(此选择不容争议)。

在其他地方,另一个目标通过zlib链接target_link_libraries。在该从属目标中的源文件中,我#include <zlib.h>。它可以很好地编译,并且我可以肯定zlib.so也可以正确建立和链接。但是,<zlib.h>也可以从系统中使用。我可能可以通过添加虚假变量并在从属源文件中使用它来手动验证我是否将<zlib.h>包含在${INCLUDE_DIR}中,但是我真的很想自动断言在执行过程中包含了正确的文件。任何机器上的任何编译。确定包含的zlib.h位于CMake构建目录中的某个位置可能就足够了。

我相信CheckIncludeFileCXX并不能完全解决问题;我需要验证特定源文件中实际上包含了哪些zlib.h。知道我的本地提供的zlib.h可以被包括在内当然是先决条件,但是并不能完全回答我的问题。

1 个答案:

答案 0 :(得分:0)

您可以通过使编译器为所需的.cpp文件生成依赖项文件,然后添加一个自定义构建步骤来验证zlib.hgrep或其他任何方式的路径来实现手段。简而言之(因为我不是CMake专家):

  • 在C / C ++标志中添加-MD -MF(或者CMake有一些不错的方法来启用依赖项生成,或者甚至默认情况下也可以这样做-不确定)。
  • 添加一个add_custom_command(或者可能还有更好的东西)以验证生成的依赖文件中<zlib.h>的路径。