--- wikisrc/pkgsrc/gcc.mdwn 2017/12/30 02:01:59 1.8 +++ wikisrc/pkgsrc/gcc.mdwn 2018/01/01 23:27:13 1.11 @@ -18,7 +18,7 @@ build gcc versions (typically newer vers in a compiler within ${PREFIX}, e.g. /usr/pkg/gcc6/bin/gcc. This compiler can then be used to compile other packages. -The Issue with using base system gcc is typically that it is too old, +The issue with using base system gcc is typically that it is too old, such as gcc 4.5 with NetBSD 6, which cannot compile c++11. Another example is gcc 4.8 with NetBSD 7. While this can compile most c++11 programs, it cannot be used for firefox or glibmm (and therefore any @@ -26,6 +26,7 @@ package that links against glibmm). Issues when using pkgsrc gcc are that + - on some platforms, pkgsrc gcc does not build and work - it must be bootstrapped, requiring compiling a number of packages with the system compiler - C++ packages that are linked together should be built with the @@ -65,6 +66,9 @@ This section attempts to gather all the clang, when set to use GCC, at least as well as the current scheme. It is desirable for this logic to work on NetBSD 5. + - All systems should work at least as well as they do before + implementation of new compiler selection logic. + - The compiler selection logic should be understandable and not brittle. ## Design @@ -84,14 +88,20 @@ sound while mimimizing complexity. 4.9. - A user-settable variable PKGSRC_GCC_VERSION will declare the - version of gcc to be used for C programs, with an OS- and - version--specific default. + version of gcc to be used for C programs, with an OS-, + version- and architeture- specific default. - A user-settable variable PKGSRC_GXX_VERSION will declare the - version of gcc to be used for all C++ programs, again with an OS- - and version-specific default. It must be at least + version of gcc to be used for all C++ programs, again with an OS-, + version- and architeture-specific default. It must be at least PKGSRC_GCC_VERSION. + - If PKGSRC_GCC_VERSION and PKGSRC_GXX_VERSION are not set, the + system will behave much as before. As a possible exception, + builds may still fail if the required version is greater than the + base system version. So far the only known reason to avoid + setting these variable is if pkgsrc gcc cannot be built. + - Each of c99, c++, c++11, and c++14 will be associated with a minimum gcc version, such that almost all programs declaring that language can be built with that version. (This avoids issues of @@ -132,6 +142,13 @@ sound while mimimizing complexity. approach is possible inconsistency with gcc's dependencies being built with the base compiler and used later. + As an alternative, we store lists of bootstrap packages in a + variable, because it will vary with OS and version, and with + PREFER_PKGSRC settings. + + As a third alternative, we pass a GCC_BOOTSTRAPPING variable + recursively. This is easier but less consistent. + - We hope that the chosen version can be built using the base system version, and hope to avoid multi-stage bootstrapping. @@ -149,7 +166,9 @@ For now, we defer worrying about these p will be less serious than the current situation where all c++11 programs fail to build on NetBSD 6). -\todo: Change gcc 4.8 and 4.9 to enable gcc-inplace-math by default. +\todo: Perhaps change gcc 4.8 and 4.9 to enable gcc-inplace-math by +default. Perhaps decide that if we want to build gcc, we want to +build 5 or 6, and 4.9 is no longer of interest as a bootstrap target. \todo: Analyze what build-time and install-time dependencies actually exist. Include old GNU/Linux in this analysis. @@ -212,16 +231,21 @@ A gcc version that is too old will not b 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. -\todo Check this with Jason Bacon. - ### Default versions for various systems Note that if for any particular system's set of installed packages (or @@ -231,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 @@ -245,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. @@ -280,7 +302,7 @@ fortran, we should require a single vers \todo Discuss. -### C++ programs 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 @@ -294,6 +316,9 @@ to really just have one compiler version ## Path forward +(This assumes per-package marking of bootstrap packages, but is +reasonably obviously extended to the other schemes.) + - Modify all gcc packages to have minimal dependencies, and to add PKGSRC_GCC_BOOTSTRAP. @@ -303,14 +328,16 @@ to really just have one compiler version - Modify the compiler selection logic for LANGUAGES= to fail if PKGSRC_GCC_VERSION/PKGSRC_GXX_VERSION is not new enough. - - Modify the compiler selection logic for GCC_REQD to fail if the - version of GCC/GXX is not new enough. + - Modify the compiler selection logic for GCC_REQD to fail if + PKGSRC_GCC_VERSION/PKGSRC_GXX_VERSION is not new enough. - Decide on defaults. The straw proposal is that PKGSRC_GCC_VERSION is the base system version if >= 4.5 (or 4.4?), and otherwise 5, and that PKGSRC_GXX_VERSION is the base system version if >= 5, and - otherwise 5. + otherwise 5. Implement these in platform.mk as they are tested. ### Later steps - - Address fortran. + - Address fortran. Probably add PKGSRC_GFORTRAN_VERSION, after + determining how Fortran, C and C++ interact with library ABI + compatibility.