我需要找到如何最好地使用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使用相同的二进制文件,因为它们将使用不同的编译器标志来构建库。
答案 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>