C++ 如何检查构建目标

C++ 如何检查构建目标,c++,build,cmake,build-system,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

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

考虑以下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
--target选项之后,如何在CMake脚本中检查targetcppTests
我正在Makefiles中查找类似MAKECMDGOALS的内容。
我找到了任何有用的解决方案……

我不能100%确定我是否正确理解了您的问题,但是,根据我的理解,您正在寻找变量
CMAKE\u PROJECT\u NAME
PROJECT\u NAME

if (${CMAKE_PROJECT_NAME} STREQUAL "cppTests")
    message("CMAKE_PROJECT_NAME is \"cppTests\"")
else ()
    message("CMAKE_PROJECT_NAME is NOT \"cppTests\"")
endif ()

请参阅常见变量列表。我经常在制作CMake时打开此链接;我想您也会发现它很有用。

开发人员在CMake生成项目文件后选择要构建的目标。当CMake运行时,CMake无法知道开发人员将构建什么目标。因此,对于CMake项目来说,您所要求的并没有实际意义。在Makefile中,没有单独的配置步骤,它是构建的一部分,这就是它如何提供类似MAKECMDGOALS的功能。如果您真的想要Makefiles的这种功能,也可能值得重新考虑,因为它(我的重点):

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


在您的示例中,您还误用了
if(TARGET…
)。该构造用于测试项目是否定义了特定的CMake目标(在您的示例中,该目标直到执行
if()
命令之后才定义,因此它的计算结果总是为false)。有关详细信息,请参阅文档。

在CMake世界中,您的要求毫无意义。CMake项目的时间线由3个不同的步骤组成:

配置时间>生成时间>构建时间
\---------------v---------/\---v----/
CMake正在运行make正在运行
configure步骤中,CMake读取并解析
CMakeLists.txt
文件,并将处理后的数据存储在内存中。按下CMake GUI中的
Configure
按钮时会发生这种情况

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

从命令行运行
cmake
会立即执行配置,然后执行生成

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


您没有指定您试图通过这些信息实现的目标,但也许您可以使用以下内容?

我找到了一个解决方案:

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)
谢谢大家的支持


特别感谢您的支持和帮助

不,我不是在寻找${CMAKE_PROJECT_NAME},因为在同一个项目中,可以是具有不同名称的不同目标,例如:add_executable(cppExe${SOURCE_FILES});add_library(cppLib${SOURCE_FILES})我在makefiles中寻找类似MAKECMDGOALS的东西您不完全正确。。。实际上,在cmake为构建生成文件之后,您可以使用cmake运行命令来运行构建,比如:/home/redra/Software/clion-2017.1.1/bin/cmake/bin/cmake--build/home/redra/Projects/cppTests/cmake build debug--target cppTests--j8add_custom_命令(target cppTests PRE_LINK)-我需要添加_custom_命令(target cppTests PRE-build)替换if-else,但由于某些原因,它不适用于Make等Linux工具。文件中提到了这一点either@DenisKotov我确实提到了
cmake--build
,但这与配置或生成步骤完全不同。“即使您使用
cmake--build
..运行此构建工具,答案中也有正确的答案。”
PRE_BUILD
无法使用Make,因为Make文件中没有可以合理放置它的位置。如果你提出了一个新的问题,关于你到底需要它做什么,也许有另一种实现它的方法。我的任务是在构建主目标之前生成文件。CommonAPI也许你知道我需要在构建目标之前生成一些文件。我已经用add_custom_命令和add_custom_目标实现了它,但是我试图找到alternatives@DenisKotov如果您做得正确,它确实可以保证正确的重新生成。如果您在创建文件的
add\u custom\u command()
中指定依赖项,CMake将尊重这些依赖项。我可以用add\u custom\u命令(TARGET cppTests PRE\u BUILD)替换MAKECMDGOALS,但实际上它不起作用,在现实生活中不起作用,不符合CMake的文档。我想在生成特定目标之前生成一些文件。如果add_custom_命令(TARGET cppTests PRE_BUILD)起作用,它将解决我的问题这一切都很好,但在您不知道将获得什么生成的_文件时不起作用:-(GLOB_RECURSE在这里会失败,因为它在配置时是可操作的。真正的问题是add_custom_命令不提供从命令中获取结果的工具。查看execute_进程-您会得到返回值、错误等。因此,您不能创建一个自定义命令来“返回”在某些目录中找到的生成文件列表:-(不要只是大声思考。