discuss-gnustep
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: HOWTO: ARC (libobjc2) and libdispatch on Ubuntu 12.04 Server


From: Ivan Vučica
Subject: Re: HOWTO: ARC (libobjc2) and libdispatch on Ubuntu 12.04 Server
Date: Mon, 13 Aug 2012 10:16:23 +0200

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 <plaurent@me.com> 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 (plaurent@me.com)
> # 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
> Discuss-gnustep@gnu.org
> https://lists.gnu.org/mailman/listinfo/discuss-gnustep

--
Ivan Vučica
ivan@vucica.net - http://ivan.vucica.net/




reply via email to

[Prev in Thread] Current Thread [Next in Thread]