GNUstep under Ubuntu Linux

From GNUstepWiki

(Difference between revisions)
Revision as of 02:56, 22 April 2019
Pakl (Talk | contribs)

← Previous diff
Revision as of 02:15, 13 May 2019
Pakl (Talk | contribs)

Next diff →
Line 3: Line 3:
== Compiling Everything from Scratch == == Compiling Everything from Scratch ==
-The following script compiles and installs everything needed for Objective-C 2.0 from scratch. The script uses clang and libobjc2 for all the awesome new features like ARC, blocks, etc.+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.
 + 
 +For example, to build GNUstep under Ubuntu 19.04, do:
 +```
 +https://github.com/plaurent/gnustep-build
 +cd ubuntu-19.04-clang-8.0-runtime-2.0
 +./GNUstep-buildon-ubuntu1904.sh
 +```
Reference manuals for GNUStep, including available APIs, etc, are available at http://www.gnustep.org/developers/documentation.html Reference manuals for GNUStep, including available APIs, etc, are available at http://www.gnustep.org/developers/documentation.html
- 
-NOTE: Unless you have a need for the above features, its recommended to install from the default repos as often the scripts below have issues. 
- 
-<pre>sudo apt install gnustep</pre> 
- 
- 
-=== Ubuntu 19.04 === 
- 
-In addition to building everything, this script also provides the ability to build the most recent version of four apps: Project Center, Gorm, GWorkspace, and System Preferences.  
- 
-<pre> 
-#!/bin/bash 
- 
-# Show prompt function 
-function showPrompt() 
-{ 
- if [ "$PROMPT" = true ] ; then 
- echo -e "\n\n" 
- read -p "${GREEN}Press enter to continue...${NC}" 
- fi 
-} 
- 
-# Set colors 
-GREEN=`tput setaf 2` 
-NC=`tput sgr0` # No Color 
- 
-# Set to true to also build and install apps 
-APPS=true 
- 
-# Set to true to pause after each build to verify successful build and installation 
-PROMPT=false 
- 
-# Install Requirements 
-sudo apt update 
- 
-echo -e "\n\n${GREEN}Installing dependencies...${NC}" 
- 
-sudo dpkg --add-architecture i386 # Enable 32-bit repos for libx11-dev:i386 
-sudo apt-get update 
-sudo apt -y install clang git cmake libffi-dev libxml2-dev \ 
-libgnutls28-dev libicu-dev libblocksruntime-dev libkqueue-dev libpthread-workqueue-dev autoconf libtool \ 
-libjpeg-dev libtiff-dev libffi-dev libcairo-dev libx11-dev:i386 libxt-dev libxft-dev 
- 
-if [ "$APPS" = true ] ; then 
- sudo apt -y install curl 
-fi 
- 
-# Create build directory 
-mkdir GNUstep-build 
-cd GNUstep-build 
- 
-# Set clang as compiler 
-export CC=clang 
-export CXX=clang++ 
- 
-# Checkout sources 
-echo -e "\n\n${GREEN}Checking out sources...${NC}" 
-#git clone https://github.com/nickhutchinson/libdispatch.git 
-git clone https://github.com/plaurent/libdispatch.git 
-cd libdispatch 
- git checkout fix_major_missing_symbol_for_ubuntu1904 
-cd .. 
-git clone https://github.com/gnustep/libobjc2.git 
-git clone https://github.com/gnustep/tools-make.git 
-git clone https://github.com/gnustep/libs-base.git 
-git clone https://github.com/gnustep/libs-gui.git 
-git clone https://github.com/gnustep/libs-back.git 
- 
-if [ "$APPS" = true ] ; then 
- git clone https://github.com/gnustep/apps-projectcenter.git 
- git clone https://github.com/gnustep/apps-gorm.git 
- git clone https://github.com/gnustep/apps-gworkspace.git 
- git clone https://github.com/gnustep/apps-systempreferences.git 
-fi 
- 
-showPrompt 
- 
-# Build GNUstep make first time 
-echo -e "\n\n" 
-echo -e "${GREEN}Building GNUstep-make for the first time...${NC}" 
-cd tools-make 
-# git checkout `git rev-list -1 --first-parent --before=2017-04-06 master` # fixes segfault, should probably be looked at. 
-./configure --enable-debug-by-default --with-layout=gnustep --enable-objc-arc --with-library-combo=ng-gnu-gnu 
-make -j8 
-sudo -E make install 
- 
-. /usr/GNUstep/System/Library/Makefiles/GNUstep.sh 
-echo ". /usr/GNUstep/System/Library/Makefiles/GNUstep.sh" >> ~/.bashrc 
- 
-showPrompt 
- 
-# Build libdispatch 
-echo -e "\n\n" 
-echo -e "${GREEN}Building libdispatch...${NC}" 
-cd ../libdispatch 
-rm -Rf build 
-mkdir build && cd build 
-../configure --prefix=/usr 
-make 
-sudo make install 
-sudo ldconfig 
- 
-showPrompt 
- 
-# Build libobjc2 
-echo -e "\n\n" 
-echo -e "${GREEN}Building libobjc2...${NC}" 
-cd ../../libobjc2 
-rm -Rf build 
-mkdir build && cd build 
-cmake ../ -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang -DCMAKE_ASM_COMPILER=clang -DTESTS=OFF 
-cmake --build . 
-sudo -E make install 
-sudo ldconfig 
- 
-export LDFLAGS=-ldispatch 
- 
-showPrompt 
- 
-OBJCFLAGS="-fblocks -fobjc-runtime=gnustep-2.0" 
- 
-# Build GNUstep make second time 
-echo -e "\n\n" 
-echo -e "${GREEN}Building GNUstep-make for the second time...${NC}" 
-cd ../../tools-make 
-./configure --enable-debug-by-default --with-layout=gnustep --enable-objc-arc --with-library-combo=ng-gnu-gnu 
-make -j8 
-sudo -E make install 
- 
-. /usr/GNUstep/System/Library/Makefiles/GNUstep.sh 
- 
-showPrompt 
- 
-# Build GNUstep base 
-echo -e "\n\n" 
-echo -e "${GREEN}Building GNUstep-base...${NC}" 
-cd ../libs-base/ 
-./configure 
-make -j8 
-sudo -E make install 
- 
-showPrompt 
- 
-# Build GNUstep GUI 
-echo -e "\n\n" 
-echo -e "${GREEN} Building GNUstep-gui...${NC}" 
-cd ../libs-gui 
-./configure 
-make -j8 
-sudo -E make install 
- 
-showPrompt 
- 
-# Build GNUstep back 
-echo -e "\n\n" 
-echo -e "${GREEN}Building GNUstep-back...${NC}" 
-cd ../libs-back 
-./configure 
-make -j8 
-sudo -E make install 
- 
-showPrompt 
- 
-. /usr/GNUstep/System/Library/Makefiles/GNUstep.sh 
- 
-if [ "$APPS" = true ] ; then 
- echo -e "${GREEN}Building ProjectCenter...${NC}" 
- cd ../apps-projectcenter/ 
- make -j8 
- sudo -E make install 
- 
- showPrompt 
- 
- echo -e "${GREEN}Building Gorm...${NC}" 
- cd ../apps-gorm/ 
- make -j8 
- sudo -E make install 
- 
- showPrompt 
- 
- echo -e "\n\n" 
- echo -e "${GREEN}Building GWorkspace...${NC}" 
- cd ../apps-gworkspace/ 
- ./configure 
- make -j8 
- sudo -E make install 
- 
- showPrompt 
- 
- echo -e "\n\n" 
- echo -e "${GREEN}Building SystemPreferences...${NC}" 
- cd ../apps-systempreferences/ 
- make -j8 
- sudo -E make install 
- 
-fi 
- 
-echo -e "\n\n" 
-echo -e "${GREEN}Install is done. Open a new terminal to start using.${NC}" 
-</pre> 
- 
-=== Older versions of Ubuntu (18.04 or earlier) === 
- 
-On older versions of Ubuntu (including 18.04) you won't have a recent enough clang (-fobjc-runtime=gnustep-2.0 requires Clang 7.0 or later). If you want to build on an older Ubuntu (like 18.04) you should: 
- 
-(1) Set OBJCFLAGS="-fblocks -fobjc-runtime=gnustep-1.9" in the script above 
- 
-(2) git checkout 1.9 on libobjc2 
- 
-OR  
- 
-(1) Build a new clang manually (instead of apt install clang): 
- 
-<pre> 
-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 
-svn co http://llvm.org/svn/llvm-project/lldb/trunk lldb 
-cd ~/llvm 
-rm -rf build 
-mkdir build 
-cd build 
-cmake -D CMAKE_BUILD_TYPE:STRING=Release .. # If you don't choose Release, it defaults to Debug which takes lots more space 
-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 
-export PATH=$PATH:~/llvm/build/bin 
-. ~/.bashrc 
- 
-export CC=clang 
-export CXX=clang++ 
-</pre> 
- 
-== Test Code == 
- 
-The following is some Objective-C source code from the internet.  
-It demonstrates blocks, Grand Central Dispatch, and the use of GNUStep GUI. 
- 
-<pre> 
-#!/bin/bash 
- 
-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 
- 
- 
- 
-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"]; 
- int result = [alert runModal]; 
- if (result == NSAlertFirstButtonReturn) { 
- NSLog(@"First button pressed"); 
- } 
-} 
-EOF 
- 
-# ====================================================================== 
-# COMPILE USING THE FOLLOWING COMMAND LINES, OR CREATE A MAKEFILE 
-# ====================================================================== 
- 
-# Using COMMAND LINE 
- 
-clang `gnustep-config --objc-flags` `gnustep-config --objc-libs` -lobjc blocktest.m 
-./a.out 
- 
-clang `gnustep-config --objc-flags` `gnustep-config --objc-libs` -lobjc -ldispatch -lgnustep-base Fraction.m helloGCD_objc.m 
-./a.out 
- 
-clang `gnustep-config --objc-flags` `gnustep-config --objc-libs` -lobjc -fobjc-arc -ldispatch -lgnustep-base -lgnustep-gui guitest.m 
-./a.out 
- 
-# Using MAKEFILE 
- 
-cat > GNUmakefile << EOF 
-include \$(GNUSTEP_MAKEFILES)/common.make 
- 
-APP_NAME = GUITest 
-GUITest_OBJC_FILES = guitest.m 
- 
-include \$(GNUSTEP_MAKEFILES)/application.make 
-EOF 
- 
-make 
-openapp ./GUITest.app 
-</pre> 
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 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
(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)) (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))

Revision as of 02:15, 13 May 2019

Objective-C under Ubuntu Linux

Compiling Everything from Scratch

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.

For example, to build GNUstep under Ubuntu 19.04, do: ``` https://github.com/plaurent/gnustep-build cd ubuntu-19.04-clang-8.0-runtime-2.0 ./GNUstep-buildon-ubuntu1904.sh ```

Reference manuals for GNUStep, including available APIs, etc, are available at http://www.gnustep.org/developers/documentation.html

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 (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))