|
|
(90 intermediate revisions by 4 users not shown) |
Line 1: |
Line 1: |
| + | Usually it is a good a idea to just use the package manager of your distribution to get a stable and well integrated GNUstep environment: |
| | | |
| + | sudo apt-get install gnustep gnustep-devel |
| | | |
− | # -----------------------------------------------------------------
| + | If you want to develop new apps and try the newest features consider the approach described below. |
− | # 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
| |
− | # -----------------------------------------------------------------
| |
− | # 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)
| |
− | # -----------------------------------------------------------------
| |
− | # -----------------------------------------------------------------
| |
| | | |
− | # ==============================
| + | = Compiling Everything from Scratch = |
− | # ==============================
| |
− | # PART 1: new libobjc2 on Ubuntu
| |
− | # ==============================
| |
− | # ==============================
| |
| | | |
− | # --------------------------------------------------------------------
| + | The following repo contains scripts that compile and install everything needed for GNUstep Objective-C 2.0. The script uses clang and libobjc2 for all the awesome new features like ARC, blocks/Grand Central Dispatch, etc. |
− | # Some examples to test Objective C and ARC once we get it installed
| |
− | # --------------------------------------------------------------------
| |
| | | |
− | cd ~
| + | For example, to build GNUstep under Ubuntu 19.04, do: |
| | | |
− | cat > Fraction.h << EOF
| + | git clone https://github.com/plaurent/gnustep-build |
| + | cd gnustep-build/ubuntu-19.04-clang-8.0-runtime-2.0/ |
| + | ./GNUstep-buildon-ubuntu1904.sh |
| | | |
− | #import <Foundation/NSObject.h>
| + | The demo.sh and demo-gui.sh scripts show example code and compilation examples (using command line as well as the recommended GNUmakefile approach.) |
| | | |
− | @interface Fraction: NSObject {
| + | Reference manuals for GNUStep, including available APIs, etc, are available at http://www.gnustep.org/developers/documentation.html |
− | int numerator;
| |
− | int denominator;
| |
− | }
| |
| | | |
− | -(void) print;
| + | General Note: When compiling your own code, it is generally good to tell clang both the family and version of the runtime: -fobjc-runtime=gnustep-2.0 |
− | -(void) setNumerator: (int) n;
| + | (The current version number can be had by looking at the latest ANNOUNCE filename in https://github.com/gnustep/libobjc2 (e.g., ANNOUNCE.1.8.1)) |
− | -(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
| |