0

I'm trying to compile the code on the redis-2.8.19 tag in an AIX 6.1 machine with gcc.

I unzip the file and then I launch the following command:

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

I tried with and without the -j flag, with the same result:

[...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`

But if you check the src directory, you see the redis-server file just there:

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

Any idea what's going on? Or should I do something else?

Carlos

Carlos Delgado
  • 552
  • 7
  • 23
  • 1
    I've not built redis (but I do build a lot of open source packages on AIX). Usually in the make file there is a way to get it to output the actual command that is being executed. I would see what "INSTALL" is actually trying to do. Capture that into a script that you can execute repetitively and then slowly debug the script. – pedz Jan 22 '15 at 15:52
  • Thanks for the tip pedz, I'll try that. Let's see what's inside that script. – Carlos Delgado Jan 26 '15 at 11:53

1 Answers1

2

I recently compiled Redis on AIX, and had to fix several build issues, but the end result works fine (so far) for our purposes.

This is the script I came up with. Afterwards one test failed (which we can live with), see 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

The GccEnvironment does something like this:

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 "$@"
fi

echo GccEnvironment has finished.

Hope this helps, TW

Tw Bert
  • 3,659
  • 20
  • 28
  • Hey, I'm running into some trouble with this... right now I'm getting this error making the redis-server: `/tmp//cciyYokl.s: line 14078: 1252-149 Instruction fsel is not implemented in the current assembly mode PPC64.`. The command line is as this: `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`. And the GCC version is 4.4.6, which is, I think, the root of the problem. Any ideas? – Carlos Delgado Feb 24 '15 at 16:47
  • 1
    Hi Tw! I had to modify your script a little, but finally got it working! The problem was with the gcc flags. Redis puts their own flags and your script was interferring with them. Specifically I had to change the `CFLAGS`variable to the following: `export CFLAGS="-maix64 -D_AIX -D_AIX53 -D_AIX61 -I/opt/freeware/include -I/usr/include${CFLAGS_XTRA}"` The -O3 interferred with the -O2 and the -ffast-math made the fsel instruction (floating point) unavailable, and shouldn't be used in conjunction with any -O (as per https://gcc.gnu.org/onlinedocs/gcc-4.1.0/gcc/Optimize-Options.html) Many thanks! – Carlos Delgado Feb 25 '15 at 10:43
  • 1
    BTW, it fixes the error with BRPOPLPUSH, but fails the one to do with replication: `[exception]: Executing test client: NOREPLICAS Not enough good slaves to write.. NOREPLICAS Not enough good slaves to write.` – Carlos Delgado Feb 25 '15 at 10:51
  • 1
    @cdelgado I updated my answer by removing -ffast-math. Sidenote: I did not encounter the missing fsel instruction, and after rebuilding, I still have the error on BRPOPLPUSH, and I don't get the NOREPLICAS message. Possibly because I'm on AIX7.1 and you are on AIX6.1. It's no big issue for us tho. – Tw Bert Mar 09 '15 at 08:43