Författararkiv: Pär Boberg

Installera gcc + nghttp2 på Mac OS X 10.6 Snow Leopard

Http2 protokollet är på frammarsch och jag ville försöka få in det på servern som denna hemsida ligger på, dock är det lite jobb att få nghttp2 att kompilera på Mac OS X 10.6, då denna version inte har inbyggt stöd för nya språkversionen av C++, som heter C++11, som nghttp2 är skriven i.

Så för att kunna kompilera nghttp2, krävs en nyare version av gcc än den som Apple levererar i Xcode 3.2.6 eller Xcode 4.2 (sista versionen för Mac OS X 10.6).

Den version av gcc jag valde, var 4.8.5, som har initialt stöd för C++11 men tillräckligt för att kompilera nghttp2. Sedan måste man använda Xcode 3.2.6 med standard gcc (ej llvm varianten, som har en bugg som förhindrar kompilering av nyare gcc). Det går inte att använda Xcode 4.2, för den har en bugg i länkaren ”LD”, som också förhindrar kompilering av nyare gcc.

Så med Xcode 3.2.6 och standard gcc så är det bara att tuta och köra!

Skapa en mapp på lämpligt ställe:
T.ex. mkdir ~/Desktop/src && cd ~/Desktop/src

Sedan laddar vi ned gcc:
curl -O https://ftp.gnu.org/gnu/gcc/gcc-4.8.5/gcc-4.8.5.tar.bz2
Packar upp med:
tar -xvf gcc-4.8.5.tar.bz2
Ändrar till mappen:
cd gcc-4.8.5

Kör sedan shellskriptet contrib/download_prerequisites
(laddar ned GMP, MPC och MPFR som krävs för att kompilera gcc).
Sedan skapar vi en mapp för alla byggfiler:
mkdir ../gcc-4.8.5-build && cd ../gcc-4.8.5-build
Och sedan configure kommandot:
../gcc-4.8.5/configure –prefix=/usr/local/gcc-4.8.5 –enable-languages=c,c++
make (tog ca 2,5tim på en Core2Duo 1,83GHz)
Och om allt gått bra, är det bara att köra:
sudo make install

Finns några configure exempel för att kompilera gcc för Mac på nätet som har –with-sysroot som pekar på Mac OS X SDK:n men jag rekommenderar att inte använda denna flagga, då jag inte kunde kompilera Subversion (fick unresolved symbols) eftersom gcc då använder include filer i SDK:n istället för de mer aktuella include filerna i /usr/include.

För att nu använda den nyare gcc, behöver vi lägga till sökvägen i ~/.bash_profile:
PATH=/usr/local/gcc-4.8.5/bin:$PATH
Sedan startar vi om Terminal programmet.

Nu kan vi börja med nghttp2, som kräver en del extra mjukvara, som vi kan läsa på: https://nghttp2.org/documentation/package_README.html#requirements
Jag installerade pkg-config, libev, libevent, jansson, openssl, python 2.7 samt cython.
zlib och libxml2 ingår redan i Mac OS X och libevent-openssl ingår redan i libevent.
Resterande cunit, jemalloc, sphinx, spdylay och libboost kan man hoppa över.

Ladda ned nghttp2 och packa upp på lämpligt ställe.
Ändra sedan i filen examples/libevent-client.c på rad ~561,
från: strndup(&uri[u.field_data[UF_HOST].off], u.field_data[UF_HOST].len)
till: strdup(&uri[u.field_data[UF_HOST].off])
annars misslyckas kompileringen.

Sedan behöver vi ändra i filen ”_sysconfigdata.py” (på rad ~392 – ”Linksforshared”)  i
/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7 mappen,
från: Python.framework/Versions/2.7/Python
till: /Library/Frameworks/Python.framework/Versions/2.7/Python
och det gör vi för att configure kommandot för nghttp2 ska kunna identifiera python korrekt.

Nu kan vi köra:
CPPFLAGS=”-I/usr/local/include” LDFLAGS=”-L/usr/local/lib” LIBS=”-ldl” ./configure
Kommandona före ./configure kan behövas för att nghttp2 skall hitta all extra mjukvara som vi installerade tidigare, som hamnar i /usr/local som standard.
Sedan måste vi ändra i filen Makefile (på rad ~545) i undermappen python, där vi tar bort detta:
–prefix=$(DESTDIR)$(prefix) annars misslyckas installeringen av nghttp2, då sökvägen till python blir felaktig.
Nu kan vi köra make och sedan sudo make install

Voilá, nu har vi nghttp2 och dess bibliotek, som gör att vi kan kompilera Apache med HTTP/2 stöd!