Hey Patryk, Nice tutorial! I don't think you need to install GNUstep first. I certainly don't do it in my script. https://bitbucket.org/ivucica/gnustep-ubuntu
I'll look into updating my script based on some things you do (e.g. adding libdispatch installation and making compiling clang from trunk optional). Also, how about replacing a government mirror server with one under Canonical-owned domain? For example, http://us.archive.ubuntu.com/ubuntu/... On 11. 8. 2012., at 18:52, Patryk Laurent <[email protected]> wrote: > > > Greetings, > > Below are some step-by-step instructions on installing libobjc2 and > libdispatch on Ubuntu 12.04 server. > > Best, > Patryk > > > > # ----------------------------------------------------------------- > # Objective C 2.0 on Ubuntu (from source) > # ----------------------------------------------------------------- > # PART 1: LIBOBJC2 from source (with ARC) > # PART 2: LIBDISPATCH from source > # ON UBUNTU 12.04 SERVER > # ----------------------------------------------------------------- > # Patryk Laurent ([email protected]) > # Step 1 based on David Chisnall > (http://etoileos.com/news/archive/2011/08/14/1206/) > # Step 2 based on Chris Mowforth > http://chris.mowforth.com/installing-grand-central-dispatch-on-linux) > # ----------------------------------------------------------------- > # August 11, 2012 > # ----------------------------------------------------------------- > > # ============================== > # ============================== > # PART 1: new libobjc2 on Ubuntu > # ============================== > # ============================== > > # -------------------------------------------------------------------- > # Some examples to test Objective C and ARC once we get it installed > # -------------------------------------------------------------------- > > cd ~ > > cat > Fraction.h << EOF > > #import <Foundation/NSObject.h> > > @interface Fraction: NSObject { > int numerator; > int denominator; > } > > -(void) print; > -(void) setNumerator: (int) n; > -(void) setDenominator: (int) d; > -(int) numerator; > -(int) denominator; > @end > > EOF > > > cat > Fraction.m << EOF > #import "Fraction.h" > #import <stdio.h> > > @implementation Fraction > -(void) print { > printf( "%i/%i", numerator, denominator ); > } > > -(void) setNumerator: (int) n { > numerator = n; > } > > -(void) setDenominator: (int) d { > denominator = d; > } > > -(int) denominator { > return denominator; > } > > -(int) numerator { > return numerator; > } > @end > > EOF > > > > cat > main.m << EOF > > #import <stdio.h> > #import "Fraction.h" > > int main( int argc, const char *argv[] ) { > // create a new instance > Fraction *frac = [[Fraction alloc] init]; > > // set the values > [frac setNumerator: 1]; > [frac setDenominator: 3]; > > // print it > printf( "The fraction is: " ); > [frac print]; > printf( "\n" ); > > // free memory > [frac release]; > > return 0; > } > > EOF > > cat > mainarc.m << EOF > #import <stdio.h> > #import "Fraction.h" > > int main( int argc, const char *argv[] ) { > // create a new instance > Fraction *frac = [[Fraction alloc] init]; > > // set the values > [frac setNumerator: 1]; > [frac setDenominator: 3]; > > // print it > printf( "The fraction is: " ); > [frac print]; > printf( "\n" ); > > // free memory > // [frac release]; // valgrind should show less leakage with -fobjc-arc > > return 0; > } > > EOF > > > # ----------------------------------------------------------------- > # INITIAL REQUIREMENTS > # ----------------------------------------------------------------- > sudo apt-get -y install build-essential subversion clang libicu-dev > libxml2-dev libxml2 libgnutls-dev libssl-dev > > #sudo apt-get -y install gnustep # If you want old runtime > #sudo apt-get -y install gnustep-make > #sudo apt-get -y install libgnustep-base-dev > > sudo apt-get -y install gobjc # Def required for below. > > # -------------------------------------------------------------------- > # TEST (may fail w/ segfault if you did not apt-get install gnustep) > # -------------------------------------------------------------------- > > cd ~ > gcc `gnustep-config --objc-flags` main.m Fraction.m -o test -lobjc > -lgnustep-base > ./test > clang `gnustep-config --objc-flags` main.m Fraction.m -o test -lobjc > -lgnustep-base > ./test > > # -------------------------------------------------------------------- > # OK, let's install the new GNUstep from Subversion repositories! > # (based on David Chisnall http://etoileos.com/news/archive/2011/08/14/1206/) > # -------------------------------------------------------------------- > mkdir gs > cd gs > > svn co svn://svn.gna.org/svn/gnustep/tools/make/trunk make > svn co http://svn.gna.org/svn/gnustep/modules/core > svn co svn://svn.gna.org/svn/gnustep/libs/libobjc2/trunk libobjc > > # -------------------------------------------------------------------- > # 1) Install GNUstep Make a first time. > # -------------------------------------------------------------------- > > cd ~/gs/make > export CC=clang > export CXX=clang++ > ./configure --enable-debug-by-default --with-layout=fhs > make && sudo -E make install > . /usr/local/share/GNUstep/Makefiles/GNUstep.sh > cd .. > > cd ~/gs/core/base > ./configure > make # On this FIRST TIME THRU, WILL SAY CAN'T BUILD NSBLOCKS for > this runtime > sudo make install > cd .. > > # -------------------------------------------------------------------- > # TEST (the resulting binary will segfault if we don't have a runtime) > # -------------------------------------------------------------------- > cd ~ > clang `gnustep-config --objc-flags` main.m Fraction.m -o test -lobjc > -lgnustep-base > > > # -------------------------------------------------------------------- > # 2) Build libobjc2 > # -------------------------------------------------------------------- > cd ~/gs/libobjc > make -f Makefile > sudo make -f Makefile install > cd .. > > # -------------------------------------------------------------------- > # 3) NOW GO BACK, RECOMPILE GNUStep MAKE (TO DETECT THE NEW OBJC RUNTIME) > # -------------------------------------------------------------------- > > cd ~/gs/make > ./configure --enable-objc-nonfragile-abi --enable-native-objc-exceptions > --with-layout=fhs --enable-debug-by-default CC=clang CXX=clang++ > make && sudo -E make install > . /usr/local/share/GNUstep/Makefiles/GNUstep.sh > cd .. > > # -------------------------------------------------------------------- > # 4) AND THEN RECOMPILE CORE/BASE > # -------------------------------------------------------------------- > > cd ~/core/base > ./configure --disable-mixedabi CC=clang CXX=clang++ > make # THIS TIME THRU, NO COMPLAINTS ABOUT BLOCKS > sudo make install > cd .. > > # -------------------------------------------------------------------- > # 5) FINALLY TEST AGAIN AND ENJOY OBJECTIVE C WITH ARC > # Note that I need to add GNUSTEP-CONFIG --OBJC-LIBS below. > # If you don't want ARC, omit -fobj-arc > # -------------------------------------------------------------------- > > cd ~ > clang `gnustep-config --objc-flags` `gnustep-config --objc-libs` -fobj-arc > -fobjc-nonfragile-abi mainarc.m Fraction.m -o test -lobjc -lgnustep-base > ./test > > > > # ============================== > # ============================== > # PART 2: libdispatch on Ubuntu > # ============================== > # ============================== > > > > # -------------------------------------------------------------------- > # Some examples to test GCD once we get it installed > # -------------------------------------------------------------------- > > cd ~ > > cat > helloGCD.c << EOF > #include <dispatch/dispatch.h> > #include <stdio.h> > > int main() { > dispatch_queue_t queue = dispatch_queue_create(NULL, NULL); > > dispatch_sync(queue, ^{ > printf("Hello, world from a dispatch queue!\n"); > }); > > dispatch_release(queue); > > return 0; > } > > EOF > > cat > helloGCD_objc.c << EOF > > #include <dispatch/dispatch.h> > #import <stdio.h> > #import "Fraction.h" > > int main( int argc, const char *argv[] ) { > dispatch_queue_t queue = dispatch_queue_create(NULL, NULL); > Fraction *frac = [[Fraction alloc] init]; > > [frac setNumerator: 1]; > [frac setDenominator: 3]; > > // print it > dispatch_sync(queue, ^{ > printf( "The fraction is: " ); > [frac print]; > printf( "\n" ); > }); > dispatch_release(queue); > > return 0; > } > > EOF > > # -------------------------------------------------------------------- > # INSTALLING LIBDISPATCH > # (based on Chris Mowforth > http://chris.mowforth.com/installing-grand-central-dispatch-on-linux) > # -------------------------------------------------------------------- > > sudo apt-get install clang libblocksruntime-dev libkqueue-dev > > # Visit http://packages.ubuntu.com/oneiric/libpthread-workqueue0 for > download links > # Visit http://packages.ubuntu.com/oneiric/libpthread-workqueue-dev for > download link > > mkdir dispatch > cd dispatch > sudo apt-get install make autoconf autogen libtool build-essential > gcc-multilib > sudo apt-get install pkg-config > > wget > http://mirror.pnl.gov/ubuntu//pool/universe/libp/libpthread-workqueue/libpthread-workqueue0_0.8.2-1_amd64.deb > wget > http://mirror.pnl.gov/ubuntu//pool/universe/libp/libpthread-workqueue/libpthread-workqueue-dev_0.8.2-1_amd64.deb > > sudo dpkg -i libpthread-workqueue0_0.8.2-1_amd64.deb > sudo dpkg -i libpthread-workqueue-dev_0.8.2-1_amd64.deb > > wget > http://archive.ubuntu.com/ubuntu/pool/universe/libd/libdispatch/libdispatch_0~svn197.orig.tar.gz > > tar xvfz libdispatch_0~svn197.orig.tar.gz > cd libdispatch-0~svn197/ > export CC=clang > export CXX=clang++ > make distclean > ./configure > make > > # dispatch_starfish.o: In function `_dispatch_time_mach2nano': > # dispatch_starfish.c:(.text+0x5bc): undefined reference to > `_dispatch_host_time_data' > # dispatch_starfish.c:(.text+0x5ea): undefined reference to > `_dispatch_get_host_time_init' > # /usr/bin/ld: .libs/dispatch_starfish: hidden symbol > `_dispatch_host_time_data' isn't defined > # /usr/bin/ld: final link failed: Bad value > # clang: error: linker command failed with exit code 1 (use -v to see > invocation) > # make[1]: *** [dispatch_starfish] Error 1 > # make[1]: Leaving directory > `/home/patryk/dispatch/libdispatch-0~svn197/testing' > # make: *** [all-recursive] Error 1 > > # -------------------------------------------------------------------- > # To fix compile, comment out build of "testing" from Makefile > # -------------------------------------------------------------------- > > make clean > sed "s/testing/#testing/" Makefile > Makefile.new > mv Makefile.new Makefile > make > sudo make install > sudo ldconfig > > # -------------------------------------------------------------------- > # Testing > # -------------------------------------------------------------------- > # Plain C: When not compiling with libobjc2 (just plain C) on Ubuntu you must > add -lBlocksRuntime > # -------------------------------------------------------------------- > > clang -o hi helloGCD.c -fblocks -ldispatch -lBlocksRuntime > ./hi > > clang -o hi helloGCD.c -fblocks -ldispatch > # /usr/bin/ld: /tmp/helloGCD-eXxFYY.o: undefined reference to symbol > '_NSConcreteGlobalBlock' > # /usr/bin/ld: note: '_NSConcreteGlobalBlock' is defined in DSO > /usr/lib/libBlocksRuntime.so.0 > # so try adding it to the linker command line > # /usr/lib/libBlocksRuntime.so.0: could not read symbols: Invalid operation > # clang: error: linker command failed with exit code 1 (use -v to see > invocation) > > > > # -------------------------------------------------------------------- > # Compiling Objective C with ARC and blocks and libdispatch > # -------------------------------------------------------------------- > # Note: do not use -lBlocksRuntime here since Apple on is not > # compatible with the libobjc2 one which has its own. (Note from > # David Chisnall) > # -------------------------------------------------------------------- > > clang `gnustep-config --objc-flags` `gnustep-config --objc-libs` -fobj-arc > -fobjc-nonfragile-abi -fblocks helloGCD_objc.m Fraction.m -o test -lobjc > -lgnustep-base -ldispatch > ./test > > > > > > > _______________________________________________ > Discuss-gnustep mailing list > [email protected] > https://lists.gnu.org/mailman/listinfo/discuss-gnustep -- Ivan Vučica [email protected] - http://ivan.vucica.net/ _______________________________________________ Discuss-gnustep mailing list [email protected] https://lists.gnu.org/mailman/listinfo/discuss-gnustep
