Jenkins在Mac M1代理上无法正常工作
我们希望使用带有M1处理器的MacMini作为CI管道中的代理,以确保拥有新Mac的开发人员能够编译该项目。我们复制了x86的设置,但cmake找不到诸如boost:Jenkins在Mac M1代理上无法正常工作,jenkins,cmake,apple-m1,rosetta-2,Jenkins,Cmake,Apple M1,Rosetta 2,我们希望使用带有M1处理器的MacMini作为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
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)
奇怪的是,当通过ssh直接连接到机器时,这不是一个问题。即使手动设置环境变量也不会改变任何东西。Jenkins代理使用Java。如果通过brew安装Java(例如,采用OpenJDK8),则可能会获得使用Rosetta转换层运行的x64版本(截至2021年3月)。您可以通过执行
sysctl sysctl.proc\u translated
来验证这一点。在“正常”SSH连接中,这应该返回0,当在Jenkins中作为sh“sysctl sysctl.proc_translated”
执行时,您将看到1
首选选项(安装本机JDK)
您可以通过以下方式安装zulu JDK,而不是使用(例如)adoptopenjdk8
brew install --cask zulu
在此之后,您应该能够验证Jenkins中的proc_translated
是否为0。您可以验证是否按如下所述构建了本机二进制文件
修补程序(不更改JDK)
如果无法安装本机JDK,以下是一个修补程序
通过修改Jenkins文件,我们可以强制cmake以本机方式运行(从而找到本机库),如下所示:
旧的:
新的:
不得不一遍又一遍地重复arch命令真的不太好。也许有人有更好的解决办法
核实结果
我们可以验证生成的二进制文件是否为本机ARM二进制文件:
sh "file hyriseTest"
结果:
+ file ./hyriseTest
./hyriseTest: Mach-O 64-bit executable arm64
编译器警告
注意:我们仍然看到关于“ltmp3”和“ltmp4”的链接器警告。我没有在网上找到任何关于这方面的信息,这似乎不会影响结果的正确性。例如:
ld: warning: direct access in function 'ltmp4' from file 'CMakeFiles/hyriseMvccDeletePlugin.dir/Unity/unity_0_cxx.cxx.o' to global weak symbol
+ file ./hyriseTest
./hyriseTest: Mach-O 64-bit executable arm64
ld: warning: direct access in function 'ltmp4' from file 'CMakeFiles/hyriseMvccDeletePlugin.dir/Unity/unity_0_cxx.cxx.o' to global weak symbol