2015-01-21 64 views
0

我正嘗試使用gcc在AIX 6.1計算機上編譯redis-2.8.19標記上的代碼。無法在AIX 6.1和GCC上使REDIS 2.8.19和GCC

我解壓縮文件,然後我啓動以下命令:

gmake distclean; CC=`which gcc` gmake -j 

我有和沒有-j標誌嘗試,具有相同的結果:

[...after lots of warnings and compiler messages...] 

LINK redis-server 
INSTALL redis-sentinel 
find: 0652-019 The status on redis-sentinel is not valid. 
install: 0653-233 File redis-server was not found. 
gmake[1]: **** [redis-sentinel] Error 2 
gmake[1]: Leaving directory '/users/carlos/redis/redis-2.8.19/src' 
gmake: **** [all] Error 2` 

但是,如果你檢查src目錄,你會看到redis-server文件就在那裏:

ll redis-server 
-rwxr-xr-x 1 ta_des gitgrp  3179825 Jan 20 12:37 redis-server 

任何想法是怎麼回事?還是我應該做點別的?

卡洛斯

+1

我還沒有建成的Redis (但是我在AIX上構建了許多開源軟件包)。通常在make文件中有一種方法可以讓它輸出正在執行的實際命令。我會看到「INSTALL」實際上在做什麼。將其捕獲到可以重複執行的腳本中,然後慢慢地調試腳本。 – pedz 2015-01-22 15:52:52

+0

感謝您的提示pedz,我會嘗試。讓我們看看那個腳本里面有什麼。 – 2015-01-26 11:53:20

回答

2

我最近編制的Redis在AIX上,不得不解決的幾個問題構建,但最終的結果正常工作(到目前爲止)爲我們的宗旨。

這是我想出的腳本。 後來一個測試失敗(我們可以住在一起),見redis 2.8.19 on AIX: BRPOPLPUSH does not affect WATCH

#!/usr/bin/env bash 
# 
# GccCompileRedis 
# Compile redis from source, on AIX. 
# 64 bit, compiled with references to our standard paths including /opt/freeware/lib64 
# TW 2014 Q1 
# 

# Check for root user, exit hard if not 
# 
if [ `whoami` != "root" ] ; then 
    echo "You must run this script as root. sudo -E is allowed (to do the build in your HOME dir)." 
    exit 1 
fi 

lclRedisVersion=$1 

if [ "${lclRedisVersion}" == "" ] 
then 
    echo "Supply a redis version, for example \"2.8.19\"" 
    exit 1 
fi 

lclAborted=0 
lclMake=/usr/bin/gmake 

if [ $lclAborted == 0 ] 
then 
    clear 
    pwd 
    echo 
    echo This script does a $lclMake of redis ${lclRedisVersion} \(from source, including download\). 
    echo Build dir \(automatically created\): /home/${LOGIN}/src/redis-${lclRedisVersion} 
    echo Info: Everything is deleted and re-downloaded. Continue? To abort: Ctrl+C. 
    echo 
    read -sn 1 -p "Press any key to continue..." ; echo 
    lclAborted=$? 
fi 

if [ $lclAborted == 0 ] 
then 
    mkdir /home/${LOGIN}/src >/dev/null 2>&1 
    cd /home/${LOGIN}/src 
    rm redis-${lclRedisVersion}.tar.gz >/dev/null 2>&1 
    rm redis-${lclRedisVersion}.tar >/dev/null 2>&1 
    rm -rf redis-${lclRedisVersion} >/dev/null 2>&1 
    wget http://download.redis.io/releases/redis-${lclRedisVersion}.tar.gz 
    gunzip redis-${lclRedisVersion}.tar.gz 
    tar -xf redis-${lclRedisVersion}.tar 
    cd /home/${LOGIN}/src/redis-${lclRedisVersion} 
    echo 
    pwd 
    echo 
    echo Run make via $lclMake ? 
    echo 
    read -sn 1 -p "Press any key to continue..." ; echo 
    lclAborted=$? 
fi 

if [ $lclAborted == 0 ] 
then 
    clear 
    echo Make... 
    echo "redis-sentinel errors will be fixed, look at end result." > make_${lclRedisVersion}.log 2>&1 
    echo >> make_${lclRedisVersion}.log 2>&1 

    # Not a clue how redis-sentinel binary is produced. On linux redis-server and redis-sentinel are byte-identical or hardlinked. 
    # So we first build redis-server, and then do a simple cp -p to redis-sentinel, afterwards continue the make. 

    # First only: redis-server 
    $SCRIPTS/GccEnvironment $lclMake V=1 redis-server >> make_${lclRedisVersion}.log 2>&1 
    tail -n14 make_${lclRedisVersion}.log 

    # Then: redis-sentinel 
    $SCRIPTS/GccEnvironment $lclMake V=1 redis-sentinel >> make_${lclRedisVersion}.log 2>&1 

    # If fail, just copy redis-server binary 
    if [ -f "src/redis-server" -a ! -f "src/redis-sentinel" ] 
    then 
    echo "FIX: Make a copy of redis-server to fix a missing redis-sentinel." >> make_${lclRedisVersion}.log 2>&1 
    cp -p "src/redis-server" "src/redis-sentinel" >> make_${lclRedisVersion}.log 2>&1 
    fi 

    # Build the rest 
    $SCRIPTS/GccEnvironment $lclMake V=1 redis-cli >> make_${lclRedisVersion}.log 2>&1 
    $SCRIPTS/GccEnvironment $lclMake V=1 redis-benchmark >> make_${lclRedisVersion}.log 2>&1 
    $SCRIPTS/GccEnvironment $lclMake V=1 redis-check-dump >> make_${lclRedisVersion}.log 2>&1 
    $SCRIPTS/GccEnvironment $lclMake V=1 redis-check-aof >> make_${lclRedisVersion}.log 2>&1 

    tail -n14 make_${lclRedisVersion}.log 
    echo 
    echo 'You can run the tests at this point, if you wish. Instructions:' 
    echo ' >sudo -i' 
    echo ' >. /etc/profile' 
    echo " >cd /home/tw/src/redis-${lclRedisVersion}" 
    echo ' >. $SCRIPTS/GccEnvironment' 
    echo ' >./runtest' 
    echo 'Note1: tcl must be installed. Check with which tclsh. Perzl package available.' 
    echo 'Note2: On 2015-01-12, we had one failing test: "BRPOPLPUSH does not affect WATCH while still blocked".' 
    echo '  See: https://groups.google.com/forum/#!topic/redis-db/8nboMaWfiEU' 
    echo 
    echo 'make install does not work on AIX. Do you want to let this script copy the binaries and make symbolic links?' 
    echo 
    read -sn 1 -p "Press any key to continue..." ; echo 
    lclAborted=$? 
fi 

if [ $lclAborted == 0 ] 
then 
    sudo -E slibclean 
    clear 
    rm -rf /opt/freeware/redis-${lclRedisVersion} >/dev/null 2>&1 
    mkdir /opt/freeware/redis-${lclRedisVersion} 

    cp -p /home/${LOGIN}/src/redis-${lclRedisVersion}/src/redis-server  /opt/freeware/redis-${lclRedisVersion}/ 
    cp -p /home/${LOGIN}/src/redis-${lclRedisVersion}/src/redis-sentinel  /opt/freeware/redis-${lclRedisVersion}/ 
    cp -p /home/${LOGIN}/src/redis-${lclRedisVersion}/src/redis-cli   /opt/freeware/redis-${lclRedisVersion}/ 
    cp -p /home/${LOGIN}/src/redis-${lclRedisVersion}/src/redis-benchmark  /opt/freeware/redis-${lclRedisVersion}/ 
    cp -p /home/${LOGIN}/src/redis-${lclRedisVersion}/src/redis-check-dump /opt/freeware/redis-${lclRedisVersion}/ 
    cp -p /home/${LOGIN}/src/redis-${lclRedisVersion}/src/redis-check-aof  /opt/freeware/redis-${lclRedisVersion}/ 
    cp -p /home/${LOGIN}/src/redis-${lclRedisVersion}/redis.conf    /opt/freeware/redis-${lclRedisVersion}/ 
    cp -p /home/${LOGIN}/src/redis-${lclRedisVersion}/sentinel.conf   /opt/freeware/redis-${lclRedisVersion}/ 
    cp -p /home/${LOGIN}/src/redis-${lclRedisVersion}/utils/install_server.sh /opt/freeware/redis-${lclRedisVersion}/ 
    ln -sf /opt/freeware/redis-${lclRedisVersion}/redis-server     /usr/bin/redis-server  
    ln -sf /opt/freeware/redis-${lclRedisVersion}/redis-sentinel    /usr/bin/redis-sentinel 
    ln -sf /opt/freeware/redis-${lclRedisVersion}/redis-cli     /usr/bin/redis-cli   
    ln -sf /opt/freeware/redis-${lclRedisVersion}/redis-benchmark    /usr/bin/redis-benchmark 
    ln -sf /opt/freeware/redis-${lclRedisVersion}/redis-check-dump    /usr/bin/redis-check-dump 
    ln -sf /opt/freeware/redis-${lclRedisVersion}/redis-check-aof    /usr/bin/redis-check-aof 

    echo 'Done: Binaries are copied, symbolic links are made.' 

    read -sn 1 -p "Press any key to continue..." ; echo 
    lclAborted=$? 
fi 

if [ $lclAborted == 0 ] 
then 
    echo $0 has finished. 
else 
    echo $0 was aborted. 
fi 

#EOF 

GccEnvironment確實是這樣的:

echo Calling slibclean, to prevent file-in-use issues 
sudo -E slibclean 
echo Done with slibclean 

alias make="gmake" 

export CC=gcc 
export CFLAGS="-maix64 -O2 -D_AIX -D_AIX53 -D_AIX61 -D_AIX71 -I/opt/freeware/include -I/usr/include${CFLAGS_XTRA}" 
export CXX=g++ 
export CXXFLAGS=$CFLAGS 
export LDFLAGS="-maix64 -L/opt/freeware/lib64 -L/opt/freeware/lib -Wl,-blibpath:/opt/freeware/lib64:/opt/freeware/lib/pthread/ppc64:/opt/freeware/lib:/usr/lib:/lib,-bmaxdata:0x80000000" 

export AR="ar -X64" 
export LIBPATH=.:/opt/freeware/lib64:/opt/freeware/lib:/usr/lib:/lib 
export OBJECT_MODE=64 
echo Gcc environment variables \(CC,CFLAGS,LDFLAGS,LIBPATH,etc\) are set. 

if [ "$1" != "--noexec" ] 
then 
exec "[email protected]" 
fi 

echo GccEnvironment has finished. 

希望這有助於TW

+0

嘿,我遇到了一些麻煩......現在,我得到這個錯誤使得redis-server:'/tmp//cciyYokl.s:line 14078:1252-149指令fsel沒有實現當前的組裝模式PPC64.'。命令行如下:'gcc -std = c99 -pedantic -Wall -W -O2 -g -ggdb -maix64 -O3 -ffast-math -D_AIX -D_AIX53 -D_AIX61 -I/opt/freeware/include -I/usr/include -I ../ deps/hiredis -I ../ deps/linenoise -I ../ deps/lua/src -c t_zset.c'。而GCC版本是4.4.6,我認爲這是問題的根源。有任何想法嗎? – 2015-02-24 16:47:29

+1

嗨!Tw!我不得不稍微修改你的腳本,但最後它能夠正常工作!問題在於gcc標誌。 Redis提供自己的旗幟,而你的腳本正在干擾他們。具體而言,我必須將'CFLAGS'變量更改爲以下內容:'export CFLAGS =「 - maix64 -D_AIX -D_AIX53 -D_AIX61 -I/opt/freeware/include -I/usr/include $ {CFLAGS_XTRA}」'-O3用-O2和-ffast-math進行處理使得fsel指令(浮點)不可用,並且不應該與任何-O一起使用(按照https://gcc.gnu.org/onlinedocs/gcc- 4.1.0/gcc/Optimize-Options.html)非常感謝! – 2015-02-25 10:43:45

+1

順便說一句,它修復了錯誤與BRPOPLPUSH,但失敗了與複製:'[例外]:執行測試客戶端:NOREPLICAS沒有足夠好的奴隸寫.. NOREPLICAS沒有足夠的好奴隸寫.' – 2015-02-25 10:51:34