在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