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!

Lagat bränsleavstängningsrelät (idle shut off relay) till Mercan

Har märkt under en längre tid att ”klicket” från bränsleavstängningsreläet (sitter precis vid säkringsdosan) och ventilen i förgasaren när man stänger av motorn inte längre hörs. Kollade först att ventilen fungerade och det gjorde den, det gjorde jag genom att ta av höljet på relät och sedan ”stänga” relät manuellt och då hördes tydligt klickande från förgasaren.

Tänkte först att det kanske var kondensatorn som var slut (40år gammal) så jag beställde en ny och bytte och testade igen men inget liv i relät.

Bränsleavstängningsrelä-01.jpg
Bränsleavstängningsrelä-02.jpg

Tog då en liten transformator som gav 12V och matade direkt på reläts spole för att se om relät skulle aktiveras men inget hände, mätte sedan med multimeter och fick inget utslag på varken ohm eller sluten krets. Så det mesta pekade på att spolen var trasig någonstans efter lindningen, visste inte riktigt hur jag skulle göra så projektet hamnade på is ett tag.

Relät går visserligen fortfarande att få tag i men kostar dock över 1000kr (>100€) och det är lite för saftigt för ett relä som dessutom inte är direkt nödvändigt för bilen eller motorns funktion, då det går utmärkt att köra utan det. Det enda det har till uppgift är att aktivera ventilen under förgasaren som i sin tur stänger av bränsletillförseln i förgasaren när man stänger av motorn, så att inget bränsle sugs in i motorn innan den har helt stannat, från det att man vrider av tändningen. Vilket kan förhindra att motorn ”eftergår” om den är riktigt varm samt att man kanske sparar några droppar bränsle varje gång motorn stängs av.

Bestämde mig för att göra ett försök att laga spolen, så med lite milt våld fick jag lös spolen och dess hållare från kretskortet. Fick sedan knacka sönder lite av nitningen på undersidan av spolen, tillräckligt för att kunna snurra på spolen med tummen och sedan linda upp koppartråden på ett batteri. När jag hade lyckats linda av hela spolen stod det klart varför relät inte fungerade. Sista varvet var koppartråden av på flera ställen, svartbränd till och med.

Bränsleavstängningsrelä-03.jpg
Bränsleavstängningsrelä-04.jpg
Bränsleavstängningsrelä-05.jpg
Bränsleavstängningsrelä-06.jpg

Sedan började det mödosamma arbetet att linda tillbaka koppartråden på spolen och det gick inte smärtfritt och inte på första försöket 🙂
Koppartråden är dessutom väldigt tunn, så det gäller att vara försiktig och ha gott om tålamod!
Tror det krävdes tre eller fyra försök innan det blev bra, så man hann få lite blåsor på tummen.
Hade dock oturen att knäcka gröna motståndet på höger sida om kondensatorn, så fick beställa nytt och passade då på att beställa nya motstånd av de andra på kretskortet i fall att. Däremot beställde jag inga nya dioder eller transistor då jag inte kunde få fram några specifikationer på dem.

När det var ihop monterat så var det dags att testa igen men det fungerade fortfarande inte.
Fick hjälp av brorsan att rita upp relät i ett program för att bättre förstå hur relät fungerade och efter lite hårslitande och multimätning så visade det sig att dioden vid gröna motståndet (på höger sida om kondensatorn) var trasig. Det visade sig också att spolen repellerade istället för att attrahera vilket gör att den inte sluter kretsen, så blev tvungen att lossa på relä delen igen och växla på trådarna från spolen. Sedan var ju den stora frågan vilken typ/sort dioden var och efter mycket sökande så bestämde jag mig för att testa diod 1N4148 från Kjell.com och voilá, relät fungerade!

Bränsleavstängningsrelä-07.jpg
Bränsleavstängningsrelä-08.jpg
Bränsleavstängningsrelä-09.jpg
Bränsleavstängningsrelä-10.jpg

Diodens funktion är att blixtsnabbt tömma kondensatorn som aktiverar relät och sedan spärra tömningen så att kondensatorn laddas upp (tar några sekunder) och när den är fulladdad släpper relät och ventilen under förgasaren öppnas.