C++ 如何以编程方式确定二进制输出中的构建系统等价性?

C++ 如何以编程方式确定二进制输出中的构建系统等价性?,c++,c,linux,open-source,build-process,C++,C,Linux,Open Source,Build Process,背景:假设您有两台服务器作为C/C++代码的生成服务器(Jenkins,如果有关系的话)。这两台服务器都使用相同的kickstart、操作系统版本、库等构建。代码在Git的两个分支上进行维护——开发和发布候选。正在开发的代码具有权威性,并提升为RC。Git哈希匹配。在开发人员基础设施上构建的代码生成正常运行的二进制文件。在RC基础设施上生成的代码并没有(或者至少在测试中,似乎在开发人员身上并没有发现bug)。如何证明Dev的构建和RC的构建是相同的。你会使用什么工具?你要查什么?您将捕获哪些指标

背景:假设您有两台服务器作为C/C++代码的生成服务器(Jenkins,如果有关系的话)。这两台服务器都使用相同的kickstart、操作系统版本、库等构建。代码在Git的两个分支上进行维护——开发和发布候选。正在开发的代码具有权威性,并提升为RC。Git哈希匹配。在开发人员基础设施上构建的代码生成正常运行的二进制文件。在RC基础设施上生成的代码并没有(或者至少在测试中,似乎在开发人员身上并没有发现bug)。如何证明Dev的构建和RC的构建是相同的。你会使用什么工具?你要查什么?您将捕获哪些指标?其他软件公司如何做thsi?这不是理论上的练习——我被迫证明这一点。我读过。操作系统是RHEL 6.2。

如果有不同的预处理器指令和不同的编译选项,那么它们很可能不相同。
不同的环境本身可能是导致不同行为的另一个因素

如果您看到的行为与我抱歉地告诉您的不同,那么可能存在错误,您需要解决它


如果有人只是因为不相信有bug而让你证明他们是相同的,那么告诉他们他们错了,事实证明并非如此。

因为他们是两个不同的构建,可能有不同的编译器选项和定义,所以他们不太可能是相同的

但是,第1步是更改RC构建配置以匹配开发人员配置。如果生成的二进制文件不相同,这可能会提供一些关于构建环境差异的见解。大多数人把这种配置称为“Beta”

第2步是创建一个中间版本,该版本具有Dev build配置,但RC定义。确认二进制文件不同-很可能有一些#ifdef’d代码在RC下表现不同

我们的想法是使用这两台机器,并执行以下等效操作:

cd $BUILD
mkdir dev-bin beta-bin prerc-bin
make dev && mv $BINARIES dev-bin
make beta && mv $BINARIES beta-bin
make prerc && mv $BINARIES prerc-bin
差异和proffit。您可以在构建框中重复

我不明白为什么每个阶段都有一个单独的构建环境。这似乎保证会让你定期失望

我最成功的经验一直是在给定的构建目录中跨迭代范围开发特定的构建

  • 从源代码管理创建工作副本
  • 构建开发->测试
  • 如果修复:应用,转到步骤2
  • 构建RC->Test
  • 如果修复:应用,转到步骤2
  • 构建关系

  • 显然,这需要某种程度的手动工作流控制来支持,这样新功能就不会不断出现,并将您重置为第2步(什么?这家伙一直工作到凌晨5点,当然他没有测试就将其签入生产部门)

    您所说的“基于开发基础设施”与“基于RC基础设施”是什么意思?重点是“基础设施”。正如我在下面所述,我们为开发人员和RC提供了单独的服务器。它们是同一库存硬件上的虚拟机。编译器、芯片和机器与make文件、编译器标志和链接器的内容相同。我希望告诉他们证明这是一种选择。@DavidL如果他们真的一样,一个简单的“diff”就可以了。我想不是这样吧?一个简单的。。。?二进制文件?我们正在研究这一点,但到目前为止,不同的二进制文件并没有显示出任何差异。我们实际上正在调查,使用.o文件的“readelf”和“objdump”来查看其中是否有任何东西可以满足我们的需要。但是接下来我们讨论了内存指针的问题。如果二进制文件的差异相同,那么文件也相同。这就是环境。当你说“二进制文件的差异是相同的”时,你的意思是md5sum(Dev Binary)==md5sum(RC Binary)?不同的服务器主要用于分离负载。基本上,任何构建都可以发生在任何构建服务器上。编译器选项或定义没有任何更改。好吧-你展示它的方式让它听起来像是你必须构建不同的、有针对性的系统-一个用于开发,一个用于RC,这肯定会让我责成一名员工/同事证明它们是相同的。确保你没有给自己留下同样的印象。