如何在多个GIT存储库中组织大型项目? 我有一个C++项目 CAT/COD> >这取决于 LBZZZ 库。libzzz有自己的git存储库,现在我将为cat项目创建一个存储库

如何在多个GIT存储库中组织大型项目? 我有一个C++项目 CAT/COD> >这取决于 LBZZZ 库。libzzz有自己的git存储库,现在我将为cat项目创建一个存储库,c++,git,build,cmake,C++,Git,Build,Cmake,如何为cat组织CMake构建脚本 选项> 1:代码> > CAT代码> >代码> LBZZZ < /代码>系统中内置和安装>代码> CAT项目提供 FindLibZZZ .CuScript < /COD>脚本> LISZZZ < /> > /UR/ICOR/LIBZZZ+/UR/LBB/LIBZZZ 。但是如何处理非linux平台呢?我通常不喜欢这个选择 选项2:在GIT repositorycat中添加某种链接或依赖项,它会自动将libzzz源代码从其源代码签出到一些cat子目录中。所

如何为
cat
组织CMake构建脚本

    选项> 1:代码> > CAT<代码>代码> >代码> LBZZZ < /代码>系统中内置和安装>代码> CAT<代码>项目提供<代码> FindLibZZZ .CuScript < /COD>脚本> <代码> LISZZZ < /> > <代码> /UR/ICOR/LIBZZZ+/UR/LBB/LIBZZZ 。但是如何处理非linux平台呢?我通常不喜欢这个选择

  • 选项2:在GIT repository
    cat
    中添加某种链接或依赖项,它会自动将
    libzzz
    源代码从其源代码签出到一些
    cat
    子目录中。所以<代码> CAT/CODE>的CMAKLISTS.TXT考虑<代码> LBZZZ 放置在一些<代码> CAT/COD>的子目录中。怎么做


我认为,如果您计划将项目分发给其他人(如果您考虑的是非linux平台,听起来您是这样做的),那么选项1是最好的选择。如果您不打算将
cat
分发到更广泛的世界,那么请务必使用选项2,这可能会稍微容易一些。但是,假设我想使用
cat
,您使用选项2。在这种情况下,可能存在几个问题:

  • 如果我已经有了
    libzzz
    ,因为它也被
    dog
    项目使用,那么你正在下载并构建我已经有的东西。这至少是浪费时间
  • 如果
    libzzz
    发布了一个关键的安全更新,那么我也需要重新下载您的项目。如果幸运的话,您更新了
    cat
    存储库以使用新版本的
    libzzz
    。如果我运气不好,那么你还没有注意到新的安全更新,你正在维护储存库的不同部分,或者你已经死了,<代码> CAT/COM>完全不被维护。如果我真的很不走运,我不会注意到
    cat
    现在需要更新,因为
    libzzz
    发布了一个新版本,我受到了安全问题的影响
  • 您的
    cat
    项目变得流行起来。现在,各地的包维护人员都需要了解如何从他们的存储库中使用现有的
    libzzz
    编译
    cat

我知道我看过一篇文章,作者实际上是一名软件包维护人员,他为选项1争论不休,但我似乎再也找不到了。如果我这样做了,我会用链接更新这个答案。

如果
libzzz
也是一个CMake项目,那么我建议另一种方法(我们称之为选项3)。而不是依赖于<代码> LBZZZ 已经在您的系统上已经可用(它可以更难集成到CI系统等),您可能也想考虑把它作为整个项目的一部分来构建。您不需要通过git子模块将其添加到
cat
(有效,但有其自身的缺点,例如,请参见),您可以创建顶级构建(也称为超级构建)来控制
libzzz
cat
的构建

将外部项目引入到超级构建中通常是使用CMake的。这允许您在一次操作中下载和构建项目。不幸的是,它在构建时就这样做了,并且没有为您提供可链接的CMake目标,因此您最终必须手动计算出要从中链接的库的名称和位置,等等。是的,您可以为您的构建可靠地预测这些,但您必须手动处理所有平台差异。这就是CMake应该为我们做的

但是,您可以引导它在CMake时执行下载,而不是以正常方式使用
ExternalProject
。这样就可以立即使用外部项目的源代码,您可以调用
add_子目录
,将其直接带到主构建中。这反过来意味着,由该外部构建定义的任何CMake目标也将可见,因此您可以简单地链接这些目标。在您的特定示例中,
libzzz
build可能会定义一个
zzz
CMake目标或类似的,在您的
cat
build中,您只需添加如下调用:

target_link_libraries(cat PUBLIC zzz)

无需手动计算出任何库名称或位置,因为CMake现在为您完成这项工作。所有这些的诀窍是让
ExternalProject
在CMake时执行,而不是在构建时执行。以GoogleTest为例,对该方法进行了充分的说明。该技术主要涉及使用
external\u进程
通过CMake的脚本模式调用一个小脚本,以立即调用
ExternalProject\u Add
。这篇文章包含了一个链接,指向一个完全通用的实现,您应该能够在特定情况下使用它来下载
libzzz

我相信
git子模块
是我第二个选择的答案。或者
git子树
您真的应该看看这样的东西:
但是如何处理呢非linux平台?
-非linux平台有什么问题
find_path
和其他
find_*
命令不仅在Linux上有效,因此FindLibZZZ.cmake可能是多平台的(而且许多现有的
find
脚本实际上是多平台的)。请看一下cmake的。如果
libzzz
cat
项目都在您的控制之下,这是迄今为止最强大的机制。在我看来,这也是在Windows上运行良好的唯一方法(多亏了包注册表)。