如果其他目标依赖于cmake目标,如何构建和安装cmake目标?

时间:2013-05-14 21:00:11

标签: cmake

我的应用程序由核心,许多共享库和许多使用这些共享库的插件组成。我正在使用cmake option()命令来启用/禁用每个插件。

我想做的是仅在其中一个已启用的插件需要时才构建和安装共享库。

我尝试在共享库的目录中使用以下内容:

set_directory_properties(PROPERTIES EXCLUDE_FROM_ALL true)

但是,目标仍在Visual Studio中构建。 Linux中的GNU make正确避免了构建它们。但是,不再使用install()安装所需的库 系统

我还尝试将EXCLUDE_FROM_DEFAULT_BUILD false添加到库目标, 但是cmake抱怨install()与禁用目标的未定义行为。

1 个答案:

答案 0 :(得分:0)

听起来你有这样的事情:

OPTION( BUILD_OPTIONAL_PLUGINS "Build plugins that are not required for core install" FALSE) 
IF(${BUILD_OPTIONAL_PLUGINS}) 
    ADD_SUBDIRECTORY( Plugins/Optional) # Whatever it really is. 
ENDIF()

到目前为止一切顺利。但是,你现在可以拥有一个像" libCommon"没有人需要,如果所有这些选项标志都是假的。

因此,您最简单的解决方案是:将库视为可选TOO!

毕竟,如果没有任何消费项目本身可以构建,你甚至不需要构建它。所以有一个普通的' SET'变量如' BUILD_COMMON'在相同的顶级CMakeLists.txt中,默认为TRUE。然后就这样做:

SET( BUILD_COMMON 0) 
IF(${BUILD_OPTIONAL_1} OR ...) # Detect if you need to build the lib 
    SET( BUILD_COMMON 1) 
ENDIF()

IF(${BUILD_COMMON}) 
   ADD_SUBDIRECTORY( common)
ENDIF()

然后当你最终做“安装”时在这个版本中,一切都按预期工作。如果关闭所有可选插件,那么它们只使用它们的库也从未构建过。由于它从未在构建中,因此您不需要尝试使其安装逻辑知道是否需要它。

您还应该在库的INSTALL()命令以及每个可选插件中添加这样的行:

INSTALL( TARGETS <plugin> .... OPTIONAL)

告诉我们安装&#39;如果它没有看到它的二进制文件,就不要尝试构建或安装目标。