使用CMake,如何为多个不同版本的库使用相同的源代码

时间:2014-02-20 09:03:49

标签: cmake

我需要找到如何最好地使用CMake来构建同一个库的多个不同版本。

假设我有软件A,B和C.所有这些都使用相同的外部库,让我们称之为D.让我们假设D与A,B和A相比是巨大的。 C.因此,只需使用svn:external多次结账就是一个糟糕的选择。

我想到的是有一个文件夹,我有A,B,C和C的子文件夹。 D,只需调用add_subdir(../ D)。但是为了使事情变得复杂,我不想在其他开发人员上强制执行这个文件夹结构,所以我最终想到了以某种方式使用find_package工作。

我希望看到的是,您可以将C和D从subversion转换到任何文件夹,让C自己编译它自己的D版本并使用它,而不需要自定义文件夹。

这似乎是一个愚蠢的梦想,但不是这个星球上最聪明的人,也许有人知道如何实现这一目标。

编辑: 请注意A B& C不能为D使用相同的二进制文件,因为它们将使用不同的编译器标志来构建库。

1 个答案:

答案 0 :(得分:0)

add_subdirectory适用于位于主项目目录之外的目录,您只需要提供binary_dir

  

<强> add_subdirectory (source_dir [binary_dir] [EXCLUDE_FROM_ALL])

     

向构建添加子目录。 source_dir指定源CMakeLists.txt和代码文件所在的目录。如果它是相对路径,它将根据当前目录(典型用法)进行评估,但它也可能是绝对路径binary_dir指定放置输出文件的目录。如果它是相对路径,它将根据当前输出目录进行评估,但它也可能是绝对路径。

在A,B和C中你可以有类似的东西:

set(MYPROJECT_D_PATH "" CACHE PATH "Path to D")

if("${test}" STREQUAL "")
    message(FATAL_ERROR "You must set MYPROJECT_D_PATH")
endif()

add_subdirectory(${MYPROJECT_D_PATH} D)

首次编译A,B或C时,您提供D的路径:

cmake <src_dir> -DMYPROJECT_D_PATH=<path_to_D>