plucky (7) library-combo.7.gz

Provided by: gnustep-common_2.9.2-6_amd64 bug

NAME

       library-combo - GNUstep Make support for cross-compilation.

DESCRIPTION

       This  manual  page  is  about  cross-compilation and fat binaries. Fat binaries are packages that you can
       supply which contain more the one binary of your program (e.g. your  application).  So  you  can  support
       multiple platforms with a single package.

       To  support this your system has to be built in a non-flattened way. Meaning that during the installation
       of gnustep-make you should have selected --disable-flattened and the types of  library  combinations  you
       want  to  support,  through  the  --with-library-combo  option.  With  library  combinations  we mean the
       Objective-C runtime, the Foundation library and the Application library. For more details about this  see
       the LIBRARY-COMBO section.

       If  you  installed your GNUstep system in a non-flattened way all system dependent binaries are installed
       in subdirectories with cpu/os/library-combo information. That means for instance  that  the  gnustep-base
       library  will  be  installed  in  Library/Libraries/ix86/linux/gnu-gnu-gnu/  when you are on an Intel x86
       system, running linux with the GNU runtime for Objective-C and you installed GNUstep.

       For each and every library-combo that you want to support  you  should  create  the  environment  through
       gnustep-make, because it installs a different config.make to support its own CC, OPTFLAGS, etc. flags.

   LIBRARY-COMBO
       An  important  issue is to let to a package the ability to deal with various libraries and configurations
       available now:

       Objective-C runtimes
              In the Objective-C world there are three major runtimes: the GNUstep runtime,  the  Apple  runtime
              and the GNU runtime. They are different in several respects and a program or library that works at
              the runtime level should be aware of them.

       Foundation libraries
              There are different Foundation libraries an application or tool can be written on top of: gnustep-
              base, libFoundation and Apple Cocoa system.

       Graphical interfaces
              Until  now  three  libraries provide or try to provide OpenStep compliant systems: the AppKit from
              NeXT, gnustep-gui and Cocoa from Apple.

       If a program wants to work with all the possible combinations it will have to provide different  binaries
       for each combination because it's not possible to have a tool compiled for NeXT Foundation that runs with
       gnustep-base or vice-versa. To summarize, a program can be compiled for these combinations:

       Objective-C runtime
              ng (for GNUstep Next Generation with nonfragile API and ARC support etc), gnu (for GNU  ,  or  for
              GNUstep without latest language features), apple (for Apple), nx (for NeXT)

       Foundation library
              gnu (for gnustep-base), fd (for libFoundation), apple (for Apple Cocoa), nx (for NeXT Foundation)

       GUI library
              gnu (for gnustep-gui), apple (for Apple Cocoa), nx (for NeXT GUI)

       We'll  denote  the fact that an application was compiled for a certain combination of the above values by
       using the abbreviations of the different subsystems and placing  dashes  between  them.  For  example  an
       application  compiled  for NeXT Foundation using NeXT AppKit will have the compile attribute nx-nx-nx. An
       application compiled for Apple Cocoa with the GNU compiler for Objective-C  gnu-apple-apple  and  another
       one compiled for gnustep-base using gnustep-gui under Unix will be denoted by gnu-gnu-gnu. Here is a list
       of some of the possible combinations:

          Runtime     Foundation     GUI
            nx            nx         nx
            nx            fd         gnu
            gnu           gnu        gnu
            ng            gnu        gnu
            gnu           fd         gnu
           apple         apple       apple
           apple          gnu        gnu

       Note that one can choose his/her own packages to build; it is not  required  to  have  all  the  packages
       installed on the system. Not having all of them installed limits only the ability to build and distribute
       binaries for those missing combinations.

   DIRECTORY STRUCTURE
       For cross-compilation in a non-flattened directory structure is recommended, so that you can store on the
       same  directory  structure  binaries  for  different machines.  The standard GNUstep filesystem layout is
       normally used when a non-flattened directory structure is being used; this is obtained with  the  --with-
       layout=gnustep  option  when  configuring  gnustep-make.  The entire GNUstep installation is then created
       inside /usr/GNUstep (or another directory if you use the --prefix=...  option when  configuring  gnustep-
       make).   Directories that contain binaries (such as the Libraries directory) inside /usr/GNUstep are then
       set up to support fat binaries as follows:

       Libraries/
         ix86/
           linux-gnu/
             gnu-gnu-gnu/
                 libgnustep-base.so
                 libgnustep-gui.so
             gnu-fd-gnu/
                 libFoundation.so
                 libgnustep-gui.so

       To allow the right libraries to be found, you need to source GNUstep.sh before  using  GNUstep,  and  you
       need  to  start up your application by using openapp, which will locate the right binary for your library
       combo.

   BUILDING FOR A LIBRARY-COMBO
       The makefile package will allow the user to choose between different library combinations. To  specify  a
       combination you want to compile for just type:

         $ make library_combo=library-combo

       For  instance  if you want to choose to compile using the GNUstep's Foundation implementation and use the
       GNUstep GUI library on a GNU/Linux machine you can do like this:

         $ make library_combo=gnu-gnu-gnu

       If your project requires running configure before compiling there are two issues  you  have  to  keep  in
       mind.  'configure'  is used to determine the existence of particular header files and/or of some specific
       functionality in the system header files. This thing is usually done by creating a  config.h  file  which
       contains a couple of defines like HAVE_... which say if the checked functionality is present or not.

       Another  usage  of  configure  is  to  determine  some  specific libraries to link against to and/or some
       specific tools. A typical GNUstep program is not required to check for additional libraries because  this
       step  is  done  by  the  time  the makefile package is installed. If the project still needs to check for
       additional libraries and/or tools, the recommended way is to output a config.mak file which  is  included
       by  the main GNUmakefile, instead of using Makefile.in files which are modified by configure.  The reason
       for not doing this is to avoid having the makefiles contain target  dependencies  like  above,  this  way
       keeping only one makefile instead of several for each target machine.

       The  makefile  package  is written for GNU make because it provides some very powerful features that save
       time both in writing the package but also at runtime, when you compile a project.

   BUILDING FOR AN ARCHITECTURE
       In order to build a project for multiple architectures you'll need the development  environment  for  the
       target machine installed on your machine. This includes a cross-compiler together with all the additional
       tools like the assembler and linker, the target header files and all the libraries you need.

       The GNUstep makefile package should be able to compile and link an application for another  machine  just
       by typing

         $ make target=target-triplet

       where target-triplet is the canonical system name as reported by config.guess.

   USING A LIBRARY-COMBO
       When  you use library-combos, you must always source GNUstep.sh.  That allows you to switch library paths
       on the fly. If you want to switch to a different library-combo in your shell, and if you are using  bash,
       it's  common  to  first  source  GNUstep-reset.sh to reset all shell variables, then to source GNUstep.sh
       again. Let's assume we use gnu-gnu-gnu as our current LIBRARY_COMBO and we want to switch to  ng-gnu-gnu,
       then we would use:

         . /usr/GNUstep/System/Library/Makefiles/GNUstep-reset.sh
         export LIBRARY_COMBO=ng-gnu-gnu
         . /usr/GNUstep/System/Library/Makefiles/GNUstep.sh

SEE ALSO

       debugapp(1), GNUstep(7), gnustep-config(1), openapp(1)

HISTORY

       Work on gnustep-make started in 1997 by Scott Christley <scottc@net-community.com>.

       Version  2.0.0  of gnustep-make introduced many changes with previous releases, which was mainly the work
       of Nicola Pero <nicola.pero@meta-innovation.com>

AUTHORS

       This man-page was written by Dennis Leeuw <dleeuw@made-it.com> based on  the  DESIGN  document  from  the
       gnustep-make source tree.

CREDITS

       The DESIGN document was written by Ovidiu Predescu.

       This  work  could  only  be  as  is  due  to  the  notes and corrects from Nicola Pero <nicola.pero@meta-
       innovation.com>.

       Copyright (C) 2007 Free Software Foundation, Inc.

       Copying and distribution of this file, with or without modification, are permitted in any medium  without
       royalty provided the copyright notice and this notice are preserved.