CMake如何检查构建目标

时间:2017-05-08 23:28:12

标签: c++ build cmake build-system

我试图找到解决方案:如何检查构建目标?

考虑以下CMake脚本:

cmake_minimum_required(VERSION 3.5.1)
project(cppTests)

# How to check at this point the target of build
if(TARGET "cppTests")
    message(STATUS "Target is cppTests")
else()
    message(STATUS "Target is not cppTests")
endif()


message(STATUS "Target is ${TARGET}")
set(CMAKE_CXX_STANDARD 11)

set(SOURCE_FILES main.cpp)
add_executable(cppTests ${SOURCE_FILES})

然后我打电话给以下人员:

/home/username/Software/clion-2017.1.1/bin/cmake/bin/cmake --build /home/username/Projects/cppTests/cmake-build-debug --target cppTests -- -j 8

如何在 - 目标选项后​​检查 CMake 脚本中的目标 cppTests ? 我在 Makefiles 中寻找类似 MAKECMDGOALS 的内容。 我找到了任何有用的解决方案......

4 个答案:

答案 0 :(得分:2)

开发人员在 CMake生成项目文件后选择构建的目标。当CMake运行时,CMake无法知道开发人员将构建什么目标。因此,你所要求的对于CMake项目来说并没有多大意义。在Makefile中,没有单独的配置步骤,它是构建的一部分,它是如何提供像MAKECMDGOALS这样的功能。如果你真的想要Makefiles的这个功能,也可能值得重新考虑,因为isn't meant for typical use(强调我的):

  

Make会将特殊变量MAKECMDGOALS设置为您在命令行中指定的目标列表。如果在命令行上没有给出目标,则此变量为空。 请注意,此变量仅应在特殊情况下使用。

在您的示例中,您也在滥用if(TARGET...)。该构造用于测试项目是否已经定义一个特定的CMake目标(在您的示例中,它直到if()命令之后才会定义,因此它总是会计算为false )。有关详细信息,请参阅文档here

答案 1 :(得分:2)

你所提出的问题在CMake世界中毫无意义。 CMake项目的时间表包括3个不同的步骤:

configure time  >  generate time  >  build time
\---------------v--------------/     \---v----/
        CMake is running           make is running

configure 步骤中,CMake读取并解析CMakeLists.txt个文件,并将处理后的数据存储在内存中。当您按下CMake GUI中的Configure按钮时会发生这种情况。

生成步骤中,CMake对内存中的数据进行操作以生成构建系统文件(Makefile,Visual Studio解决方案和项目等)。当您按下CMake GUI中的Generate按钮时会发生这种情况。

从命令行运行cmake会立即配置生成。

然后使用构建系统完成CMake并终止其运行。您现在拥有一个可以由构建工具处理的工作构建系统(例如makemsbuild)。即使您使用cmake --build运行此构建工具,这个cmake的新调用也根本不会读取您的CMakeLists.txt文件。它只是从生成的CMakeCache.txt访问最小值,以确定要运行的构建工具,然后运行它。

您没有说明您尝试使用这些信息实现的目标,但也许您可以处理add_custom_command(TARGET cppTests PRE_LINK)之类的内容?

答案 2 :(得分:0)

我不是100%确定我理解你的问题,但根据我的理解,你正在寻找变量ErrorNSError

CMAKE_PROJECT_NAME

查看常见变量列表here。当我做CMake时,我经常保持这个链接打开;我想你会发现它也很有用。

答案 3 :(得分:0)

我找到了一个解决方案:

add_custom_command(
        OUTPUT fidl_files_generated
        DEPENDS "./interfaces/*.fidl"
        COMMAND touch fidl_files_generated
        COMMAND /home/redra/Projects/Automotive/cgen/commonapi-generator/commonapi-generator-linux-x86_64 -sk ../interfaces/ *.fidl
        COMMAND /home/redra/Projects/Automotive/cgen/commonapi_dbus_generator/commonapi-dbus-generator-linux-x86_64 ../interfaces/ *.fidl
)

add_custom_target(fidl_gen
                  DEPENDS fidl_files_generated)

set(GENERATED_FILES "../cmake-build-debug/src-gen/v1/commonapi/HelloWorldDBusProxy.cpp"
                    "../cmake-build-debug/src-gen/v1/commonapi/HelloWorldDBusDeployment.cpp"
                    "../cmake-build-debug/src-gen/v1/commonapi/HelloWorldDBusStubAdapter.cpp"
                    "../cmake-build-debug/src-gen/v1/commonapi/HelloWorldStubDefault.cpp"
                    "../cmake-build-debug/src-gen/v1/commonapi/HelloWorldDBusDeployment.cpp")
set_source_files_properties(${GENERATED_FILES} PROPERTIES GENERATED TRUE)

add_executable(
        CommonAPI_Server
        ${SOURCE_FILES}
        ${GENERATED_FILES})
add_dependencies(CommonAPI_Server fidl_gen)

感谢大家的支持!!

特别感谢Angew寻求支持和帮助!!!!