|
|
(58 intermediate revisions by 3 users not shown) |
Line 1: |
Line 1: |
− | The most simple way to get an up-to-date installation of GNUstep on Debian or Ubuntu is to add the [https://launchpad.net/~gnustep-dev/+archive/weekly GNUstep weekly PPA] to your distribution sources, provided by the GNUstep Developers team on Launchpad. On how to do this in detail, see the PPA page.
| + | 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: |
| | | |
− | == Compiling manually ==
| + | sudo apt-get install gnustep gnustep-devel |
| | | |
− | * Uses clang and libobjc2 for all the new features like ARC, Blocks, etc.
| + | If you want to develop new apps and try the newest features consider the approach described below. |
− | * Works with a fresh install and likely with a more completed installation.
| |
− | * Works on Ubuntu 12.10 Server.
| |
− | * Works on Ubuntu 13.10 Desktop.
| |
− | * If you're trying Ubuntu 12.04 Desktop, see bottom of the page for help.
| |
| | | |
− | After this, you can try to install EtoileOS: see [[EtoileOS under Ubuntu Linux]].
| + | = Compiling Everything from Scratch = |
| | | |
− | <pre>
| + | 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. |
− | sudo apt-get install aptitude
| |
− | # Dependencies
| |
− | sudo aptitude -y install build-essential git subversion ninja cmake
| |
− | # Dependencies for GNUStep Base
| |
− | sudo aptitude -y install libffi-dev libxml2-dev libgnutls-dev libicu-dev
| |
− | # Dependencies for libdispatch
| |
− | sudo aptitude -y install libblocksruntime-dev libkqueue-dev libpthread-workqueue-dev autoconf libtool
| |
| | | |
− | cd ~
| + | For example, to build GNUstep under Ubuntu 19.04, do: |
− | git clone git://github.com/nickhutchinson/libdispatch.git
| |
− | svn co http://svn.gna.org/svn/gnustep/modules/core
| |
− | svn co http://svn.gna.org/svn/gnustep/libs/libobjc2/trunk libobjc2
| |
− | 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 ~/llvm
| + | git clone https://github.com/plaurent/gnustep-build |
− | mkdir build
| + | cd gnustep-build/ubuntu-19.04-clang-8.0-runtime-2.0/ |
− | cd build | + | ./GNUstep-buildon-ubuntu1904.sh |
− | cmake ..
| |
− | make -j8 # 8=your number of build CPUs
| |
| | | |
− | echo "export PATH=\$PATH:~/llvm/build/bin" >> ~/.bashrc
| + | The demo.sh and demo-gui.sh scripts show example code and compilation examples (using command line as well as the recommended GNUmakefile approach.) |
− | echo "export CC=clang" >> ~/.bashrc
| |
− | echo "export CXX=clang++" >> ~/.bashrc
| |
− | source ~/.bashrc
| |
− | clang -v
| |
− | clang++ -v
| |
| | | |
− | cd ~/libobjc2
| + | Reference manuals for GNUStep, including available APIs, etc, are available at http://www.gnustep.org/developers/documentation.html |
− | mkdir build
| |
− | cd build
| |
− | cmake ..
| |
− | make -j8
| |
− | sudo -E make install
| |
| | | |
− | cd ~/core/make
| + | 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 |
− | ./configure --enable-debug-by-default --with-layout=gnustep --enable-objc-nonfragile-abi
| + | (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)) |
− | make && sudo -E make install
| |
− | echo ". /usr/GNUstep/System/Library/Makefiles/GNUstep.sh" >> ~/.bashrc
| |
− | source ~/.bashrc
| |
− | | |
− | sudo /sbin/ldconfig
| |
− | | |
− | cd ~/core/base/
| |
− | ./configure
| |
− | make -j8
| |
− | sudo -E make install
| |
− | | |
− | cd ~/libdispatch
| |
− | sh autogen.sh
| |
− | ./configure CFLAGS="-I/usr/include/kqueue" LDFLAGS="-lkqueue -lpthread_workqueue -pthread -lm"
| |
− | make -j8
| |
− | sudo -E make install
| |
− | sudo ldconfig
| |
− | | |
− | # ----------------------------------------------------------------------------------------
| |
− | # TEST COMPILING SOME CODE FROM THE INTERNET
| |
− | # ----------------------------------------------------------------------------------------
| |
− | | |
− | You can compile the following code with:
| |
− | | |
− | clang `gnustep-config --objc-flags` `gnustep-config --objc-libs` -fobjc-runtime=gnustep -fblocks -fobjc-arc -lobjc blocktest.m
| |
− | | |
− | clang `gnustep-config --objc-flags` `gnustep-config --objc-libs` -fobjc-runtime=gnustep -fblocks -lobjc -ldispatch -lgnustep-base Fraction.m helloGCD_objc.m
| |
− | | |
− | | |
− | | |
− | cat > blocktest.m << EOF
| |
− | #include <stdio.h>
| |
− | | |
− | int main() {
| |
− | void (^hello)(void) = ^(void) {
| |
− | printf("Hello, block!\n");
| |
− | };
| |
− | hello();
| |
− | return 0;
| |
− | }
| |
− | EOF
| |
− | | |
− | cat > helloGCD_objc.m << 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
| |
− | | |
− | 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
| |
− | | |
− | | |
− | # ------------------------------------------------------
| |
− | # ADDITIONAL OPTIONAL STEPS FOR INSTALLING GUI AND BACK
| |
− | # (i.e., if you're running Ubuntu Desktop)
| |
− | # ------------------------------------------------------
| |
− | | |
− | sudo aptitude install -y libjpeg-dev libtiff-dev
| |
− | sudo aptitude install -y libcairo-dev libx11-dev:i386 libxt-dev
| |
− | | |
− | cd ~/core/gui
| |
− | ./configure
| |
− | make -j8
| |
− | sudo -E make install
| |
− | | |
− | cd ~/core/back
| |
− | ./configure
| |
− | make -j8
| |
− | sudo -E make install
| |
− | | |
− | You can compile the following code with:
| |
− | | |
− | clang `gnustep-config --objc-flags` `gnustep-config --objc-libs` -fobjc-runtime=gnustep -fblocks -lobjc -fobjc-arc -ldispatch -lgnustep-base -lgnustep-gui guitest.m
| |
− | | |
− | | |
− | | |
− | cat > guitest.m << EOF
| |
− | #import <AppKit/AppKit.h>
| |
− | | |
− | int main()
| |
− | {
| |
− | NSApplication *app; // Without these 2 lines, seg fault may occur
| |
− | app = [NSApplication sharedApplication];
| |
− | | |
− | NSAlert * alert = [[NSAlert alloc] init];
| |
− | [alert setMessageText:@"Hello alert"];
| |
− | [alert addButtonWithTitle:@"All done"];
| |
− | [alert runModal];
| |
− | }
| |
− | EOF
| |
− | | |
− | | |
− | </pre>
| |
− | | |
− | | |
− | * General Note: When compiling, it is generally good to tell clang both the family and version of the runtime: -fobjc-runtime=gnustep-1.7
| |
− | (The current version number can be had by looking at the latest ANNOUNCE filename in http://svn.gna.org/svn/gnustep/libs/libobjc2/trunk/ (e.g., ANNOUNCE.1.7)) | |
− | | |
− | | |
− | <b>Ubuntu 12.04 Help</b>
| |
− | | |
− | In Ubuntu 12.04 Desktop, I found that running make -j8 in llvm failed with a "syntax error in VERSION script" error.
| |
− | | |
− | I was able to overcome it by doing the following steps <b>after getting the error</b>:
| |
− | | |
− | <pre>
| |
− | # After make -j8 returned a syntax error in VERSION script error
| |
− | cd ~/llvm/build
| |
− | make clean
| |
− | cd ~/llvm/build/tools/lto
| |
− | make -j8
| |
− | cd ~/llvm/build
| |
− | make -j8
| |
− | </pre>
| |