GNUstep under Ubuntu Linux

From GNUstepWiki

(Difference between revisions)
Revision as of 23:47, 12 August 2012
Pakl (Talk | contribs)

← Previous diff
Revision as of 18:12, 27 December 2012
Pakl (Talk | contribs)
Updated for CMake
Next diff →
Line 1: Line 1:
<pre> <pre>
-# -----------------------------------------------------------------+# Objective C 2.0 installation
-# Objective C 2.0 on Ubuntu (from source)+# On fresh install of Ubuntu 12.10 Server
-# -----------------------------------------------------------------+# Patryk Laurent (http://pakl.net/)
-# PART 1: LIBOBJC2 from source (with ARC)+# Dec 27, 2012
-# PART 2: LIBDISPATCH from source+
-# ON UBUNTU 12.04 SERVER+
-# -----------------------------------------------------------------+
-# 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)+
-# -----------------------------------------------------------------+
-# -----------------------------------------------------------------+
-# ==============================+sudo aptitude install build-essential git subversion ninja cmake
-# ==============================+
-# PART 1: new libobjc2 on Ubuntu+
-# ==============================+
-# ==============================+
-# --------------------------------------------------------------------+svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm
-# Some examples to test Objective C and ARC once we get it installed+cd llvm/tools
-# --------------------------------------------------------------------+svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
 +cd .. # Back to llvm directory
 +./configure --enable-optimized
 +make -j4 # Go off to prepare cup of coffee here.
-cd ~+export PATH=$PATH:~/llvm/Release+Asserts/bin # Add to .bashrc
 +export CC=clang # Add to .bashrc
 +clang -v
-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 http://svn.gna.org/svn/gnustep/modules/core
-svn co svn://svn.gna.org/svn/gnustep/libs/libobjc2/trunk libobjc+svn co http://svn.gna.org/svn/gnustep/libs/libobjc2/trunk libobjc2
- +cd core/make
-# --------------------------------------------------------------------+./configure --enable-debug-by-default --with-layout=gnustep
-# 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 make && sudo -E make install
-. /usr/local/share/GNUstep/Makefiles/GNUstep.sh+. /usr/GNUstep/System/Library/Makefiles/GNUstep.sh # Add to .bashrc
-cd ..+
-cd ~/gs/core/base+sudo aptitude install gobjc # Otherwise we get "cc1obj not found
-./configure +cd ../../libobjc2
-make # On this FIRST TIME THRU, WILL SAY CAN'T BUILD NSBLOCKS for this runtime+mkdir build
-sudo make install+cd build
-cd ..+cmake ..
 +make
 +sudo -E make install
-# --------------------------------------------------------------------+cat > blocktest.m << EOF
-# 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> #include <stdio.h>
int main() { int main() {
- dispatch_queue_t queue = dispatch_queue_create(NULL, NULL); + void (^hello)(void) = ^(void) {
- + printf("Hello, block!\n");
- dispatch_sync(queue, ^{+ };
- printf("Hello, world from a dispatch queue!\n");+ hello();
- });+ return 0;
- +
- dispatch_release(queue);+
- +
- return 0;+
} }
- 
EOF EOF
-cat > helloGCD_objc.c << EOF+clang `gnustep-config --objc-flags` `gnustep-config --objc-libs` -fobj-arc -fobjc-nonfragile-abi -fblocks -lobjc blocktest.m
- +
-#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+
- +
</pre> </pre>

Revision as of 18:12, 27 December 2012

# Objective C 2.0 installation 
# On fresh install of Ubuntu 12.10 Server
# Patryk Laurent (http://pakl.net/)
# Dec 27, 2012

sudo aptitude install build-essential git subversion ninja cmake

svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm
cd llvm/tools
svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
cd .. # Back to llvm directory
./configure --enable-optimized
make -j4  # Go off to prepare cup of coffee here.

export PATH=$PATH:~/llvm/Release+Asserts/bin  # Add to .bashrc
export CC=clang  # Add to .bashrc
clang -v

svn co http://svn.gna.org/svn/gnustep/modules/core
svn co http://svn.gna.org/svn/gnustep/libs/libobjc2/trunk libobjc2
cd core/make
./configure --enable-debug-by-default --with-layout=gnustep
make && sudo -E make install
. /usr/GNUstep/System/Library/Makefiles/GNUstep.sh # Add to .bashrc

sudo aptitude install gobjc   # Otherwise we get "cc1obj not found
cd ../../libobjc2
mkdir build
cd build
cmake ..
make
sudo -E make install

cat > blocktest.m << EOF
#include <stdio.h>

int main() {
    void (^hello)(void) = ^(void) {
        printf("Hello, block!\n");
    };
    hello();
    return 0;
}
EOF

clang `gnustep-config --objc-flags` `gnustep-config --objc-libs` -fobj-arc -fobjc-nonfragile-abi -fblocks  -lobjc  blocktest.m