在arm64平台下,执行:
gem install zookeeper
报错:
configure: error: cannot guess build type; you must specify one
说明,/var/lib/gems/2.3.0/gems/zookeeper-1.4.11/ext/zkc-3.4.5/c/config.sub文件已经过时,没有包含当前arm64或aarch64的信息,需要更换成新版本,可以从其他的源码包中获取,比如Python2.7的源码包
替换文件之后,手动执行:
./configure --prefix=/var/lib/gems/2.3.0/gems/zookeeper-1.4.11/ext --with-pic --without-cppunit --disable-dependency-tracking --build=aarch64
make
会报错:
/tmp/ccHyPDT3.s:1648: Error: unknown mnemonic `lock' -- `lock xaddl x1,[x0]'
这是因为在一段代码中,直接嵌入了x86的汇编所以在arm平台下会报错,解决方法在https://issues.apache.org/jira/browse/ZOOKEEPER-2760
即找到./src/mt_adaptor.c
按照这里的patch进行修改https://issues.apache.org/jira/secure/attachment/12863764/ZOOKEEPER-2760.patch
最后,修改extconf.rb文件,在找到make和make install,加入:
Dir.chdir(BUNDLE_PATH) do
configure = "./configure --prefix=#{HERE} --with-pic --without-cppunit --build=aarch64 --disable-dependency-tracking #{$EXTRA_CONF} 2>&1"
configure = "env CFLAGS='#{DEBUG_CFLAGS}' #{configure}" if ZK_DEBUG
safe_sh("cp /tmp/config.sub /var/lib/gems/2.3.0/gems/zookeeper-1.4.11/ext/zkc-3.4.5/c/")
safe_sh(configure)
safe_sh("rm -f /var/lib/gems/2.3.0/gems/zookeeper-1.4.11/ext/zkc-3.4.5/c/src/mt_adaptor.c")
safe_sh("cp /tmp/mt_adaptor.c /var/lib/gems/2.3.0/gems/zookeeper-1.4.11/ext/zkc-3.4.5/c/src/")
safe_sh("make 2>&1")
safe_sh("make install 2>&1")
end
修改完成后,执行
cd /var/lib/gems/2.3.0/gems/zookeeper-1.4.11/ext/
ruby extconf.rb
make install