0

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

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

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

set_directory_properties(PROPERTIES EXCLUDE_FROM_ALL true)

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

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

4

1 回答 1

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!

毕竟,如果没有任何消费项目本身将被构建,您甚至不需要构建它。因此,在同一个顶级 CMakeLists.txt 中有一个普通的“SET”变量,如“BUILD_COMMON”,默认为 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()

然后,当您最终在此版本上执行“make install”时,一切都按预期工作。如果关闭所有可选插件,则仅由它们使用的库也永远不会构建。由于它从未在构建中,因此您无需尝试使其安装逻辑知道是否需要它。

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

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

这告诉“make install”如果没有看到它的二进制文件,就不要尝试构建或安装目标。

于 2018-05-03T17:04:16.860 回答