Jenkins代理使用Java。如果你通过brew安装Java(例如adoptopenjdk8),你可能会得到一个x64版本(截至2021年3月),该版本使用Rosetta翻译层运行。你可以通过执行sysctl sysctl.proc_translated
来验证这一点。在“正常”的SSH连接中,这应该返回0,当在Jenkins中以sh "sysctl sysctl.proc_translated"
的形式执行时,你将看到一个1。
首选选项(安装本地JDK)
不要使用,例如adoptopenjdk8,你可以安装zulu JDK,它是可用本地的,通过如下方式安装:
brew install --cask zulu
在此之后,您应该能够在Jenkins中验证
proc_translated
为0。您可以按以下描述验证是否构建了本机二进制文件。
热补丁(无需更改JDK)
如果您无法安装本机JDK,则以下内容是一个热补丁。
我们通过修改Jenkinsfile,强制cmake以本机方式运行(因此找到本机库),成功解决问题,具体如下:
旧的:
sh "cmake .."
sh "make hyriseTest"
新:
sh "PATH=/opt/homebrew/bin:$PATH arch -arm64 cmake .."
sh "arch -arm64 make hyriseTest"
反复输入"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