Redis compileren onder Mac OS

Saturday 05 February 2011, 23:08:00 | mac/osx

Redis is een interessante tool uit de categorie key/value store en 'nosql'. Helaas moet je een beetje moeite doen om het compilerend te krijgen onder Mac OS.

Voor Mac OS op PowerPC zal de compiler falen met de volgende errors:

redis.c:10908: error: 'struct __darwin_ppc_thread_state' has no member named '__eip'

ld warning: in ../deps/hiredis/libhiredis.a, missing required architecture ppc in file

Het blijkt dat er wat cpu-specifieke dingen in die code zitten en dat je een kleine patch nodig hebt om te kunnen compileren voor PowerPC. Verder moet je de makefile een beetje helpen om de juiste processorarchitecture te kiezen.

(Onder Linux, en Mac OS X 10.6 op Intel, compileert Redis overigens foutloos. Voor Windows is er een port te downloaden en ik begin er niet aan om het compilerend te krijgen in Cygwin en/of MingW).

Lees verder voor alle details.

Redis compileren op Mac OS 10.5 op PowerPC

Redis 2.0.4

tarball gedownload vanaf redis.io.

charon$ cd redis-2.0.4
charon$ make
 ...
/usr/bin/gcc-4.2 -c -std=c99 -pedantic -O2 -Wall -W   -g -rdynamic -ggdb   redis.c
redis.c: In function 'getMcontextEip':
redis.c:10908: error: 'struct __darwin_ppc_thread_state' has no member named '__eip'
make: *** [redis.o] Error 1

Werkt dus niet helemaal out-of-the-box. Wat blijkt: Redis bevat wat cpu-specifieke code, waardoor de standaard tarball niet compileert op Mac OS X op PowerPC. Gelukkig is er maar een kleine patch nodig om het werkend te krijgen ("The underlying problem is that redis.c is mucking around with the thread context and CPU registers, which of course is CPU-specific."):

Download de patch (downloadredis.c.diff) van http://code.google.com/p/redis/issues/detail?id=119 en dan proberen we het nog een keer. Als we toch bezig zijn ook maar even optimaliseren specifiek voor de G4 processor:

charon$ patch <redis.c.diff
patching file redis.c
charon$ ARCH='-mcpu=G4 -mtune=G4' make
 ...
charon$ ./redis-server     # yay!

De testset kun je ook draaien ('make test') maar dan moet je eerst tcl 8.5 compileren (mac os 10.5 komt standaard met tcl 8.4).

Redis 2.2

Deze versie is nog niet officiel uit, 2.2 RC-4 is de nieuwste die beschikbaar is. Ook hier geldt dat de code zonder patch niet op PowerPC compileert. Wonder boven wonder werkt dezelfde patch die we daarnet voor Redis 2.0.4 hadden gebruikt, ook nog op redis.c uit Redis 2.2!

charon$ cd redis-2.2.0-rc4
charon$ cd src && patch < ../redis.c.diff && cd ..
patching file redis.c
Hunk #1 succeeded at 1580 (offset -9324 lines).
charon$ make
 ...
ld warning: in ../deps/hiredis/libhiredis.a, missing required architecture ppc in file
Undefined symbols:
  "_redisFormatCommand", referenced from:
  ...

De makefile rommelt wat met build architectures en dat gaat blijkbaar niet lekker op powerpc. Als je kijkt waarmee hij compileert: '-arch i386 -arch x86_64', gaat 't natuurlijk nooit wat worden op de powerpc. We moeten hem dus een beetje helpen (en laten we dan gelijk maar weer voor G4 bouwen):

charon$ make clean
 ...
charon$ OBJARCH='-arch ppc' ARCH='-mcpu=G4 -mtune=G4' make
 ...
Hint: To run 'make test' is a good idea ;)

charon$ make test   # zzzzzz

Ook hier geldt dat je tclsh8.5 nodig hebt om de testcases te draaien.

People have replied:

Irmen de Jong

2011-02-27 00:05:00

Recentelijk is de officiele 2.2.1 versie van Redis verschenen, maar die heeft net als de 2.2.0-RC versie van hierboven dezelfde patch en compiler opties nodig om werkend te krijgen op PowerPC.

Irmen de Jong

2011-12-12 12:44:00

10-seconden install op intel macs via brew install redis (homebrew)