mrk*_*rks 9 cmake jenkins apple-m1 rosetta-2
我们希望使用配备 M1 处理器的 Mac Mini 作为 CI 管道中的代理,以确保使用新 Mac 的开发人员可以编译该项目。我们复制了 x86 的设置,但 cmake 找不到 boost 等库:
CMake Error at /opt/homebrew/Cellar/cmake/3.19.7/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:218 (message):
Could NOT find Boost (missing: Boost_INCLUDE_DIR container system
date_time)
Run Code Online (Sandbox Code Playgroud)
奇怪的是,当通过 ssh 直接连接到机器时,这不是问题。即使手动设置环境变量也不会改变任何东西。
Jenkins 代理使用 Java。如果您通过brew安装Java(例如,adoptopenjdk8),您可能会获得使用Rosetta翻译层运行的x64版本(截至2021年3月)。您可以通过执行来验证这一点sysctl sysctl.proc_translated。在“正常”SSH 连接中,这应该返回 0,当sh "sysctl sysctl.proc_translated"在 Jenkins 中执行时,您将看到 1。
您可以通过以下方式安装本机可用的 zulu JDK,而不是使用例如采用openjdk8
brew install --cask zulu
Run Code Online (Sandbox Code Playgroud)
之后,您应该能够验证proc_translatedJenkins 中的值是否为 0。您可以验证本机二进制文件是否已按如下所述构建。
如果您无法安装本机 JDK,以下是一个修补程序。
我们能够通过修改 Jenkinsfile 来强制 cmake 在本机运行(从而找到本机库),如下所示:
老的:
sh "cmake .."
sh "make hyriseTest"
Run Code Online (Sandbox Code Playgroud)
新的:
sh "PATH=/opt/homebrew/bin:$PATH arch -arm64 cmake .."
sh "arch -arm64 make hyriseTest"
Run Code Online (Sandbox Code Playgroud)
不得不一遍又一遍地重复 arch 命令确实不太好。也许有人有更好的解决方案。
我们可以验证生成的二进制文件是否是本机 ARM 二进制文件:
sh "file hyriseTest"
Run Code Online (Sandbox Code Playgroud)
结果:
+ file ./hyriseTest
./hyriseTest: Mach-O 64-bit executable arm64
Run Code Online (Sandbox Code Playgroud)
注意:我们仍然看到有关“ltmp3”和“ltmp4”的链接器警告。我在网上没有找到任何相关信息,这似乎并不影响结果的正确性。例子:
ld: warning: direct access in function 'ltmp4' from file 'CMakeFiles/hyriseMvccDeletePlugin.dir/Unity/unity_0_cxx.cxx.o' to global weak symbol
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5834 次 |
| 最近记录: |