GNUstep under Ubuntu Linux

From GNUstepWiki

(Difference between revisions)

Revision as of 23:43, 12 August 2012


  1. -----------------------------------------------------------------
  2. Objective C 2.0 on Ubuntu (from source)
  3. -----------------------------------------------------------------
  4. PART 1: LIBOBJC2 from source (with ARC)
  5. PART 2: LIBDISPATCH from source
  6. ON UBUNTU 12.04 SERVER
  7. -----------------------------------------------------------------
  8. Step 1 based on David Chisnall (http://etoileos.com/news/archive/2011/08/14/1206/)
  9. Step 2 based on Chris Mowforth http://chris.mowforth.com/installing-grand-central-dispatch-on-linux)
  10. -----------------------------------------------------------------
  11. -----------------------------------------------------------------
  1. ==============================
  2. ==============================
  3. PART 1: new libobjc2 on Ubuntu
  4. ==============================
  5. ==============================
  1. --------------------------------------------------------------------
  2. Some examples to test Objective C and ARC once we get it installed
  3. --------------------------------------------------------------------

cd ~

cat > Fraction.h << EOF

  1. 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

  1. import "Fraction.h"
  2. 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

  1. import <stdio.h>
  2. 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

  1. import <stdio.h>
  2. 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


  1. -----------------------------------------------------------------
  2. INITIAL REQUIREMENTS
  3. -----------------------------------------------------------------

sudo apt-get -y install build-essential subversion clang libicu-dev libxml2-dev libxml2 libgnutls-dev libssl-dev

  1. sudo apt-get -y install gnustep # If you want old runtime
  2. sudo apt-get -y install gnustep-make
  3. sudo apt-get -y install libgnustep-base-dev

sudo apt-get -y install gobjc # Def required for below.

  1. --------------------------------------------------------------------
  2. TEST (may fail w/ segfault if you did not apt-get install gnustep)
  3. --------------------------------------------------------------------

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

  1. --------------------------------------------------------------------
  2. OK, let's install the new GNUstep from Subversion repositories!
  3. (based on David Chisnall http://etoileos.com/news/archive/2011/08/14/1206/)
  4. --------------------------------------------------------------------

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. --------------------------------------------------------------------
  2. 1) Install GNUstep Make a first time.
  3. --------------------------------------------------------------------

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 ..

  1. --------------------------------------------------------------------
  2. TEST (the resulting binary will segfault if we don't have a runtime)
  3. --------------------------------------------------------------------

cd ~ clang `gnustep-config --objc-flags` main.m Fraction.m -o test -lobjc -lgnustep-base


  1. --------------------------------------------------------------------
  2. 2) Build libobjc2
  3. --------------------------------------------------------------------

cd ~/gs/libobjc make -f Makefile sudo make -f Makefile install cd ..

  1. --------------------------------------------------------------------
  2. 3) NOW GO BACK, RECOMPILE GNUStep MAKE (TO DETECT THE NEW OBJC RUNTIME)
  3. --------------------------------------------------------------------

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 ..

  1. --------------------------------------------------------------------
  2. 4) AND THEN RECOMPILE CORE/BASE
  3. --------------------------------------------------------------------

cd ~/core/base ./configure --disable-mixedabi CC=clang CXX=clang++ make # THIS TIME THRU, NO COMPLAINTS ABOUT BLOCKS sudo make install cd ..

  1. --------------------------------------------------------------------
  2. 5) FINALLY TEST AGAIN AND ENJOY OBJECTIVE C WITH ARC
  3. Note that I need to add GNUSTEP-CONFIG --OBJC-LIBS below.
  4. If you don't want ARC, omit -fobj-arc
  5. --------------------------------------------------------------------

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


  1. ==============================
  2. ==============================
  3. PART 2: libdispatch on Ubuntu
  4. ==============================
  5. ==============================


  1. --------------------------------------------------------------------
  2. Some examples to test GCD once we get it installed
  3. --------------------------------------------------------------------

cd ~

cat > helloGCD.c << EOF

  1. include <dispatch/dispatch.h>
  2. 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

  1. include <dispatch/dispatch.h>
  2. import <stdio.h>
  3. 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

  1. --------------------------------------------------------------------
  2. INSTALLING LIBDISPATCH
  3. (based on Chris Mowforth http://chris.mowforth.com/installing-grand-central-dispatch-on-linux)
  4. --------------------------------------------------------------------

sudo apt-get install clang libblocksruntime-dev libkqueue-dev

  1. Visit http://packages.ubuntu.com/oneiric/libpthread-workqueue0 for download links
  2. 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
  1. --------------------------------------------------------------------
  2. Testing
  3. --------------------------------------------------------------------
  4. Plain C: When not compiling with libobjc2 (just plain C) on Ubuntu you must add -lBlocksRuntime
  5. --------------------------------------------------------------------

clang -o hi helloGCD.c -fblocks -ldispatch -lBlocksRuntime ./hi

clang -o hi helloGCD.c -fblocks -ldispatch

  1. /usr/bin/ld: /tmp/helloGCD-eXxFYY.o: undefined reference to symbol '_NSConcreteGlobalBlock'
  2. /usr/bin/ld: note: '_NSConcreteGlobalBlock' is defined in DSO /usr/lib/libBlocksRuntime.so.0
  3. so try adding it to the linker command line
  4. /usr/lib/libBlocksRuntime.so.0: could not read symbols: Invalid operation
  5. clang: error: linker command failed with exit code 1 (use -v to see invocation)


  1. --------------------------------------------------------------------
  2. Compiling Objective C with ARC and blocks and libdispatch
  3. --------------------------------------------------------------------
  4. Note: do not use -lBlocksRuntime here since Apple on is not
  5. compatible with the libobjc2 one which has its own. (Note from
  6. David Chisnall)
  7. --------------------------------------------------------------------

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