xenial (7) library-combo.7.gz

Provided by: gnustep-common_2.6.6-3_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 dependend 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 NeXT runtime, the Apple  runtime  and
              the  GNU runtime (both with and without garbage collection enabled). 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 several Foundation libraries an application or tool can  be  written  on  top  of:  NeXT
              Foundation  library which runs on NeXTStep/OPENSTEP systems, 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
              nx  (for NeXT), gnu (for GNU without garbage collection), gnugc (for GNU with garbage collection),
              apple (for Apple)

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

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

       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
            gnu           fd         gnu
           gnugc          gnu        gnu
           gnugc          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
       gnugc-gnu-gnu, then we would use:

         . /usr/GNUstep/System/Library/Makefiles/GNUstep-reset.sh
         export LIBRARY_COMBO=gnugc-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.