Annotation of wikisrc/pkgsrc/gcc.mdwn, revision 1.1

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

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