Difference between revisions of "GNUstep under Ubuntu Linux"

From GNUstepWiki
Jump to navigation Jump to search
(remove -fobjc-arc from guitest.m compilation until we know what the problem is)
Line 3: Line 3:
 
* Uses llvm/clang source to ensure all the latest features are available.
 
* Uses llvm/clang source to ensure all the latest features are available.
 
* Also works on Ubuntu 13.10 Desktop.
 
* Also works on Ubuntu 13.10 Desktop.
* Instructions for installing GUI and the (Cairo) graphics backend have been appended.
+
* Includes GUI at the end
  
 
General Notes:
 
General Notes:
* Note: -fobjc-arc is not included in the guitest.m compilation line because the resulting binary will not run correctly right now.
+
* When compiling, it is generally good to tell clang both the family and version of the runtime: -fobjc-runtime=gnustep-1.7
* When compiling, it is 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)
* 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)
 
  
 
<pre>
 
<pre>
Line 15: Line 14:
 
sudo apt-get install aptitude
 
sudo apt-get install aptitude
 
# Dependencies
 
# Dependencies
sudo aptitude install build-essential git subversion ninja cmake
+
sudo aptitude -y install build-essential git subversion ninja cmake
 
# Dependencies for GNUStep Base
 
# Dependencies for GNUStep Base
sudo aptitude install libffi-dev libxml2-dev libgnutls-dev libicu-dev  
+
sudo aptitude -y install libffi-dev libxml2-dev libgnutls-dev libicu-dev  
 
# Dependencies for libdispatch
 
# Dependencies for libdispatch
sudo aptitude install libblocksruntime-dev libkqueue-dev libpthread-workqueue-dev autoconf libtool
+
sudo aptitude -y install libblocksruntime-dev libkqueue-dev libpthread-workqueue-dev autoconf libtool
 +
 
 
cd ~
 
cd ~
 
git clone git://github.com/nickhutchinson/libdispatch.git
 
git clone git://github.com/nickhutchinson/libdispatch.git
Line 49: Line 49:
  
 
cd ~/core/make
 
cd ~/core/make
./configure --enable-debug-by-default --with-layout=gnustep
+
./configure --enable-debug-by-default --with-layout=gnustep --enable-objc-nonfragile-abi
 
make && sudo -E make install
 
make && sudo -E make install
 
echo ". /usr/GNUstep/System/Library/Makefiles/GNUstep.sh" >> ~/.bashrc
 
echo ". /usr/GNUstep/System/Library/Makefiles/GNUstep.sh" >> ~/.bashrc
 
source ~/.bashrc
 
source ~/.bashrc
  
sudo /sbin/ldconfig # Step required under Ubuntu 13.10
+
sudo /sbin/ldconfig
  
 
cd ~/core/base/
 
cd ~/core/base/
Line 74: Line 74:
 
You can compile the following code with:
 
You can compile the following code with:
  
clang `gnustep-config --objc-flags` `gnustep-config --objc-libs` -fobjc-runtime=gnustep -fblocks -fobj-arc -lobjc  blocktest.m  
+
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` -fobj-arc -fobjc-runtime=gnustep -fblocks -fobj-arc -lobjc -ldispatch -lgnustep-base  Fraction.m helloGCD_objc.m
+
clang `gnustep-config --objc-flags` `gnustep-config --objc-libs` -fobj-arc -fobjc-runtime=gnustep -fblocks -fobjc-arc -lobjc -ldispatch -lgnustep-base  Fraction.m helloGCD_objc.m
  
  
Line 171: Line 171:
 
# ------------------------------------------------------
 
# ------------------------------------------------------
  
sudo aptitude install libjpeg-dev libtiff-dev
+
sudo aptitude install -y libjpeg-dev libtiff-dev
sudo aptitude install libcairo-dev libx11-dev:i386 libxt-dev
+
sudo aptitude install -y libcairo-dev libx11-dev:i386 libxt-dev
  
 
cd ~/core/gui
 
cd ~/core/gui
Line 186: Line 186:
 
You can compile the following code with:
 
You can compile the following code with:
  
clang `gnustep-config --objc-flags` `gnustep-config --objc-libs`  -fobjc-runtime=gnustep -fblocks -lobjc -ldispatch -lgnustep-base -lgnustep-gui  guitest.m
+
clang `gnustep-config --objc-flags` `gnustep-config --objc-libs`  -fobjc-runtime=gnustep -fblocks -lobjc -fobjc-arc -ldispatch -lgnustep-base -lgnustep-gui  guitest.m
  
  

Revision as of 16:39, 28 December 2013

Objective C 2.0 on a fresh install of Ubuntu 12.10 Server

  • Uses llvm/clang source to ensure all the latest features are available.
  • Also works on Ubuntu 13.10 Desktop.
  • Includes GUI at the end

General Notes:

  • 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)
# Objective C 2.0 on a fresh install of Ubuntu 12.10 Server

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 ~
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
mkdir build
cd build
cmake ..
make -j8   # 8=your number of build CPUs

echo "export PATH=\$PATH:~/llvm/build/bin" >> ~/.bashrc
echo "export CC=clang"  >> ~/.bashrc
echo "export CXX=clang++" >> ~/.bashrc
source ~/.bashrc
clang -v
clang++ -v

cd ~/libobjc2
mkdir build
cd build
cmake ..
make -j8
sudo -E make install

cd ~/core/make
./configure --enable-debug-by-default --with-layout=gnustep --enable-objc-nonfragile-abi
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` -fobj-arc -fobjc-runtime=gnustep -fblocks -fobjc-arc -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