我的应用程序由核心,许多共享库和许多使用这些共享库的插件组成。我正在使用cmake option()
命令来启用/禁用每个插件。
我想做的是仅在其中一个已启用的插件需要时才构建和安装共享库。
我尝试在共享库的目录中使用以下内容:
set_directory_properties(PROPERTIES EXCLUDE_FROM_ALL true)
但是,目标仍在Visual Studio中构建。 Linux中的GNU make正确避免了构建它们。但是,不再使用install()
安装所需的库
系统
我还尝试将EXCLUDE_FROM_DEFAULT_BUILD false
添加到库目标,
但是cmake抱怨install()
与禁用目标的未定义行为。
答案 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;如果它没有看到它的二进制文件,就不要尝试构建或安装目标。