File:  [NetBSD Developer Wiki] / wikisrc / pkgsrc / gcc.mdwn
Revision 1.2: download - view: text, annotated - select for diffs
Sun Nov 26 01:20:23 2017 UTC (6 months, 3 weeks ago) by gdt
Branches: MAIN
CVS tags: HEAD
General edit/fix pass

    1: On many systems pkgsrc supports, gcc is the standard compiler.  In
    2: general, different versions of each OS have different gcc versions,
    3: and some packages require newer gcc versions, in order to support
    4: newer language standards (e.g. c++11, written in the style of
    5: USE_LANGUAGES), or because older versions don't work (infrequently).
    6: 
    7: This page discusses issues related to version selection, and intends
    8: to be a design document for how pkgsrc should address this problem, to
    9: be converted into historical design rationale once implemented.  It
   10: freely takes content from extensive mailinglist discussions, and
   11: attempts to follow the rough consensus that has emerged.
   12: 
   13: ## Base system gcc vs pkgsrc gcc
   14: 
   15: Systems using gcc (e.g. NetBSD) have a compiler as /usr/bin/gcc, and
   16: this is usable by pkgsrc without any bootstrapping activity.  One can
   17: build gcc versions (typically newer versions) from pkgsrc, resulting
   18: in a compiler within ${PREFIX}, e.g. /usr/pkg/gcc6/bin/gcc.  This
   19: compiler can then be used to compile other packages.
   20: 
   21: Issues with using base system gcc are typically that it is too old,
   22: such as gcc 4.5 with NetBSD 6, which cannot compile c++11.
   23: 
   24: Issues when using pkgsrc gcc are that
   25: 
   26:   - it must be bootstrapped, requiring compiling a number of packages
   27:     with the system compiler
   28:   - C++ packages that are linked together should be built with the
   29:     same compiler, because the standard library ABI is not necessarily
   30:     the same for each compiler version
   31:   - While C packages can be built with mixed versions, the binary
   32:     should be linked with the higher version because the support
   33:     library is backwards compatible but not forward compatible.
   34: 
   35: ## Specific constraints and requirements
   36: 
   37: This section attempts to gather all the requirements.
   38: 
   39:   - By default, pkgsrc should be able to build working packages, even
   40:     for packages that need a newer compiler than that provided in the
   41:     base system.
   42: 
   43:   - The set of packages that are needed when building a bootstrap
   44:     compiler should be minimized.
   45: 
   46:   - All packages that use C should have final linking with the highest
   47:     version used in any included library.
   48: 
   49:   - All packages that use C++ should be built with the same compiler
   50:     version.  Because these typically also include C, the version used
   51:     for C++ must be at least as new as the version used for any used C
   52:     package.
   53: 
   54:   - pkgsrc should avoid building gcc unless it is more or less
   55:     necessary to build packges.  (As an example, if the base system
   56:     gcc can build c99 but not c++11, building a c99-only program
   57:     should not trigger building a gcc version adequate for c++11.)
   58: 
   59:   - The compiler selection logic should work on NetBSD 6 and newer,
   60:     and other systems currently supported by pkgsrc, including in-use
   61:     LTS GNU/Linux systems.  It should work on systems that default to
   62:     clang, when set to use GCC, at least as well as the current
   63:     scheme.  It is desirable for this logic to work on NetBSD 5.
   64: 
   65:   - The compiler selection logic should be understandable and not brittle.
   66: 
   67: ## Design
   68: 
   69: The above requirements could in theory be satisfied in many ways, but
   70: most of them are too complicated.  We present a design that aims to be
   71: sound while mimimizing complexity.
   72: 
   73:   - Packages declare what languages they need, with c++, c++11, and
   74:     c++14 being expressed differently.  (This is exactly current
   75:     practice and just noted for completeness.)
   76: 
   77:   - The package-settable variable GCC_REQD will be used only when a
   78:     compiler that generally can compile the declared language version
   79:     is insufficient.  These cases are expected to be relatively rare;
   80:     an example is firefox that is in c++ (but not c+11) and needs gcc
   81:     4.9.
   82: 
   83:   - A user-settable variable PKGSRC_GCC_VERSION will declare the
   84:     version of gcc to be used for C programs, with an OS- and
   85:     version--specific default.
   86: 
   87:   - A user-settable variable PKGSRC_GXX_VERSION will declare the version of gcc to
   88:     be used for all C++ programs, again with an OS- and
   89:     version-specific default.  It must be at least PKGSRC_GCC_VERSION.
   90: 
   91:   - Each of c99, c++, c++11, and c++14 will be associated with a
   92:     minimum gcc version, such that almost all programs declaring that
   93:     language can be built with that version.  (This avoids issues of
   94:     strict compliance with c++11, which requires a far higher version
   95:     of gcc than the version required to compile almost all actual
   96:     programs in c++11.)
   97: 
   98:   - The minimum version inferred from the language tag will be
   99:     combined with any GCC_REQD declarations to find a minimum version
  100:     for a specific package.  If that is greater than
  101:     PKGSRC_GCC_VERSION (programs using only C) or PKGSRC_GXX_VERSION,
  102:     package building will fail.  We call the resulting
  103:     PKGSRC_GCC_VERSION or PKGSRC_GXX_VERSION the chosen version.
  104: 
  105:   - When building a program using C or C++, the chosen version is not
  106:     provided by the base system, and the chosen version is not
  107:     installed via pkgsrc, then it (and its dependencies) will be built
  108:     from pkgsrc in a special bootstrap mode.  When building in
  109:     bootstrap mode, the version selection logic is ignored and the
  110:     base system compiler is used.  Consistency and reproducible builds
  111:     require that a package built with the normal prefix must be the
  112:     same whether built because of compiler bootstrapping or normal
  113:     use.
  114: 
  115:     There are thus two choices for dealing with bootstrapping.  One is
  116:     to use a distinct prefix, which will ensure that all packages that
  117:     are part of the compiler bootstrap will not be linked into normal
  118:     pkgsrc programs.  This implies that any dependencies of gcc may
  119:     exist twice, once in bootstrap mode and once if built normally.  A
  120:     gcc version itself will be built twice, if it is desired for
  121:     regular use.  This double building and the complexity of a second
  122:     prefix are the negatives of this approach.
  123: 
  124:     The other choice is to mark gcc and all depending packages as used
  125:     for compiler bootstrapping, and to always build those with the
  126:     base compiler.  We use the package-settable variable
  127:     PKGSRC_GCC_BOOTSTRAP=yes to denote this.  The negative with this
  128:     approach is possible inconsistency with gcc's dependencies being
  129:     built with the base compiler and used later.
  130: 
  131:   - We hope that the chosen version can be built using the base system
  132:     version, and hope to avoid multi-stage bootstrapping.
  133: 
  134:   - We expect that any program containing C++ will undergo final
  135:     linking with a C++ compiler.  This is not a change from the
  136:     current situation.
  137: 
  138: ## Remaining issues
  139: 
  140: ### gcc dependencies
  141: 
  142: Because gcc can have dependencies, there could be packages built with
  143: the system compiler that are then later used with the chosen version.
  144: For now, we defer worrying about these problems (judging that they
  145: will be less serious than the current situation where all c++11
  146: programs fail to build on NetBSD 6).
  147: 
  148: \todo: Analyze what build-time and install-time dependencies actually
  149: exist.
  150: 
  151: \todo: Discuss adjusting options to minimize dependencies, including
  152: gcc-inplace-math and nls.
  153: 
  154: ### Default versions for various systems
  155: 
  156: Note that if any particular system (or bulk build), a newer gcc has to
  157: be built, it does not hurt incrementally to have built it earlier.
  158: 
  159: When the base system is old (e.g., gcc 4.5 in NetBSD 6, or 4.1, in
  160: NetBSD 5), then it is clear that a newer version must be built.  For
  161: these, PKGSRC_GXX_VERSION should default to a newish gcc, avoiding
  162: being so new as to cause building issues.  Currently, gcc6 is probably
  163: a good choice.  PKGSRC_GCC_VERSION should probably default to the
  164: system version if it can build C99, or match PKGSRC_GXX_VERSION, if
  165: the system version is too old.  Perhaps gcc 4.5 would be used, but 4.1
  166: not used.  \todo Discuss.
  167: 
  168: When the base system is almost new enough, the decision about the
  169: default is more complicated.  A key example is gcc 4.8, found in
  170: NetBSD 7.  Firefox requires gcc 4.9, and all programs using c++14 also
  171: need a newer version.  One options is to choose 4.8, resulting in
  172: firefox failing, as well as all c++14 programs.  Another is to choose
  173: 4.9, but this makes little sense because c++14 programs will still
  174: fail, and the general rule of moving to the most recent
  175: generally-acceptable version applies, which currently leads to gcc6.
  176: This is in effect a declaration that "almost new enough" does not
  177: count as new enough.  Thus the plan for NetBSD 7 is to set
  178: PKGSRC_GCC_VERSION to 4.8 and PKGSRC_GXX_VERSION to 6.
  179: 
  180: When the base system is new, e.g. gcc 5 or gcc 6 it should simply be
  181: used.  By "new enough", we mean that almost no programs in pkgsrc fail
  182: to build with it, which implies that it supports (almost all) C++14
  183: programs.   Our current definiton of new enough is gcc 5.
  184: 
  185: ### Limited mixed versions
  186: 
  187: One approach would be to allow limited mixed versions, where
  188: individual programs could force a specific version to be bootstrapped
  189: and used, so that e.g. firefox could use 4.9 even though most programs
  190: use 4.8, which is what happens now on NetBSD 7.  This would rely on
  191: being able to link c++ with 4.9 including some things built with 4.8
  192: (which is done presently).  However, this approach would become
  193: unsound with a library rather than an end program.  We reject this as
  194: too much complexity for avoiding building a newer compiler in limited
  195: situations.
  196: 
  197: ### Fortran
  198: 
  199: Fortran support is currently somewhat troubled..  It seems obvious to
  200: extend to PGKSRC_GFORTRAN_VERSION, and have that match
  201: PKGSRC_GCC_VERSION or PKGSRC_GXX_VERSION, but the Fortran situation is
  202: not worsened by the above design.  \todo Discuss.
  203: 
  204: ## Path forward
  205: 
  206:  - Modify all gcc packages to have minimal dependencies, and to add
  207:    PKGSRC_GCC_BOOTSTRAP.
  208: 
  209:  - Modify the compiler selection logic to do nothing if
  210:    PKGSRC_GCC_BOOTSTRAP is set.
  211: 
  212:  - Modify the compiler selection logic for LANGUAGES= to fail if
  213:    PKGSRC_GCC_VERSION/PKGSRC_GXX_VERSION is not new enough.
  214: 
  215:  - Modify the compiler selection logic for GCC_REQD to fail if the
  216:    version of GCC/GXX is not new enough.
  217: 
  218:  - Decide on defaults.  The straw proposal is that PKGSRC_GCC_VERSION
  219:    is the base system version if >= 4.5 (or 4.4?), and otherwise 6,
  220:    and that PKGSRC_GXX_VERSION is the base system version if >= 5, and
  221:    otherwise 6.

CVSweb for NetBSD wikisrc <wikimaster@NetBSD.org> software: FreeBSD-CVSweb