--- wikisrc/pkgsrc/gcc.mdwn 2017/12/31 17:15:37 1.9 +++ wikisrc/pkgsrc/gcc.mdwn 2018/01/04 20:37:58 1.12 @@ -10,7 +10,7 @@ be converted into historical design rati freely takes content from extensive mailinglist discussions, and attempts to follow the rough consensus that has emerged. -## Base system gcc vs pkgsrc gcc +# Base system gcc vs pkgsrc gcc Systems using gcc (e.g. NetBSD) have a compiler as /usr/bin/gcc, and this is usable by pkgsrc without any bootstrapping activity. One can @@ -36,7 +36,7 @@ Issues when using pkgsrc gcc are that should be linked with the higher version because the support library is backwards compatible but not forward compatible. -## Specific constraints and requirements +# Specific constraints and requirements This section attempts to gather all the requirements. @@ -71,7 +71,7 @@ This section attempts to gather all the - The compiler selection logic should be understandable and not brittle. -## Design +# Design The above requirements could in theory be satisfied in many ways, but most of them are too complicated. We present a design that aims to be @@ -156,9 +156,9 @@ sound while mimimizing complexity. linking with a C++ compiler. This is not a change from the current situation. -## Remaining issues +# Remaining issues -### gcc dependencies introduction +## gcc dependencies introduction Because gcc can have dependencies, there could be packages built with the system compiler that are then later used with the chosen version. @@ -179,14 +179,14 @@ base system libraries are used, so it wo \todo: Consider failing if optins that we want one way are another, when bootstrapping. -### managing gcc dependencies +## managing gcc dependencies There are multiple paths forward. \todo Choose one. Straw proposal is "Don't worry" and recursive variable for the initial implementation. -#### Separate prefix +### Separate prefix Build compilers in a separate prefix, or a subprefix, so that the compiler and the packages needed to build it will not be used by any @@ -194,7 +194,7 @@ normal packages. This completely avoids package one way in bootstrap and another not in bootstrap, at the cost of two builds and writing the separate-prefix code. -#### Don't worry +### Don't worry Don't worry that packages used to bootstrap the needed compiler are compiled with an older compiler. Don't worry that they might be @@ -202,7 +202,7 @@ different depending on build order. If deal with it. This requires choosing an approach to omit compiler selection logic when building the compiler: -##### Mark bootstrap packages +#### Mark bootstrap packages Mark packages used to build gcc as PKGSRC_GCC_BOOTSTRAP=yes. Conditionalize this on OPSYS if necessary. Don't force the compiler @@ -210,14 +210,14 @@ if this is set. Alternatively, manage a per-OS list of packages in a central mk file. -##### Pass a recursive variable +#### Pass a recursive variable As above, but set PKGSRC_GCC_BOOTSTRAP=yes in the evniroment of the call to build the compiler, so that all dependencies inherit permission to skip compiler selection logic. (Alternatively, use some other mechanism such as passing a make variable explicitly.) -### Differing GCC and GXX versions +## Differing GCC and GXX versions Perhaps it is a mistake to allow the chosen GCC and GXX versions to differ. If we require them to be the same, then essentially all @@ -225,21 +225,28 @@ systems with a base system compiler olde bootstrap the compiler. For now, we allow them to differ and will permit the defaults to differ. -### gcc versions and number of buildable packages +## gcc versions and number of buildable packages A gcc version that is too old will not build a number of packages. Anything older than 4.8 fails for c++11. 4.8 fails on some c++11 packages, such as firefox and glibmm. -A version that is too new also fails to build packages. Analyses -posted to tech-pkg indicate that 5 is close to 4.9 in the number of -packages built, and that moving to 6 causes hundreds of additional -failures. +A version that is too new also fails to build packages. Jason Bacon +posted counts to tech-pkg indicate that 5 is close to 4.8 in the +number of packages built, and that moving to 6 causes hundreds of +additional failures. (Keep in mind that currently, building with 4.8 +will build 4.9 for firefox, but in the future will not.) + + www/pkgsrc/packages/sharedapps/pkg-2017Q3/RHEL6-gcc48/All 16461 + www/pkgsrc/packages/sharedapps/pkg-2017Q3/RHEL6-gcc6/All 15849 + + www/pkgsrc/packages/sharedapps/pkg-2017Q3/RHEL7-gcc48/All 16414 + www/pkgsrc/packages/sharedapps/pkg-2017Q3/RHEL7-gcc5/All 16338 Therefore, the current answer to "What is the best version to use" is 5. -### Default versions for various systems +## Default versions for various systems Note that if for any particular system's set of installed packages (or bulk build), a newer gcc has to be built, it does not hurt to have @@ -248,12 +255,10 @@ built it earlier. When the base system is old (e.g., gcc 4.5 in NetBSD 6, or 4.1, in NetBSD 5), then it is clear that a newer version must be built. For these, PKGSRC_GXX_VERSION should default to a newish gcc, avoiding -being so new as to cause building issues. Currently, gcc5 is probably -a good choice, with gcc6 compiling significantly but not vastly fewer -packages. PKGSRC_GCC_VERSION should probably default to the system -version if it can build all C99 programs, or match PKGSRC_GXX_VERSION, -if the system version is too old. Perhaps gcc 4.5 would be used, but -4.1 not used. \todo Discuss. +being so new as to cause building issues. PKGSRC_GCC_VERSION should +probably default to the system version if it can build all C99 +programs, or match PKGSRC_GXX_VERSION, if the system version is too +old. Perhaps gcc 4.5 would be used, but 4.1 not used. \todo Discuss. When the base system is almost new enough, the decision about the default is more complicated. A key example is gcc 4.8, found in @@ -262,7 +267,7 @@ need a newer version. One options is to firefox failing, as well as all c++14 programs. Another is to choose 4.9, but this makes little sense because c++14 programs will still fail, and the general rule of moving to the most recent -generally-acceptable version applies, which currently leads to gcc6. +generally-acceptable version applies, which currently leads to gcc5. This is in effect a declaration that "almost new enough" does not count as new enough. Thus the plan for NetBSD 7 is to set PKGSRC_GCC_VERSION to 4.8 and PKGSRC_GXX_VERSION to 5. @@ -273,7 +278,7 @@ pkgsrc fail to build with it (because it that it supports (almost all) C++14 programs. Our current definiton of new enough is gcc 5. -### Limited mixed versions +## Limited mixed versions One approach would be to allow limited mixed versions, where individual programs could force a specific version to be bootstrapped @@ -285,7 +290,7 @@ unsound with a library rather than an en too much complexity for avoiding building a newer compiler in limited situations. -### Fortran +## Fortran Fortran support is currently somewhat troubled.. It seems obvious to extend to PGKSRC_GFORTRAN_VERSION, and have that match @@ -297,7 +302,7 @@ fortran, we should require a single vers \todo Discuss. -### C++ libraries used by C programs +## C++ libraries used by C programs The choice of one version for C++ and one for C (e.g. 5, 4.8 on netbsd-7) breaks down if a C program links against a library that is @@ -309,7 +314,7 @@ which will not add c++ to USE_LANGUAGES PKGSRC_GXX_VERSION to be used. Or decide that this is a good reason to really just have one compiler version. -## Path forward +# Path forward (This assumes per-package marking of bootstrap packages, but is reasonably obviously extended to the other schemes.) @@ -331,8 +336,22 @@ reasonably obviously extended to the oth and that PKGSRC_GXX_VERSION is the base system version if >= 5, and otherwise 5. Implement these in platform.mk as they are tested. -### Later steps +## Later steps - Address fortran. Probably add PKGSRC_GFORTRAN_VERSION, after determining how Fortran, C and C++ interact with library ABI compatibility. + +# Data + +This section has data points that are relevant to the discussion. + +## amd64/i386 + +It is believed that pkgsrc gcc generally builds on these systems. +gcc6 builds on netbsd-5/i386. + +## macppc + +On macppc, [lang/gcc5 fails on netsbd-6 and netbsd-7, but succeeds on +netbsd-8](https://mail-index.netbsd.org/tech-pkg/2018/01/03/msg019260.html).