--- wikisrc/pkgsrc/gcc.mdwn 2017/11/26 15:43:57 1.5 +++ wikisrc/pkgsrc/gcc.mdwn 2017/12/30 01:29:49 1.7 @@ -19,7 +19,10 @@ in a compiler within ${PREFIX}, e.g. /us compiler can then be used to compile other packages. 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. +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 +package that links against glibmm). Issues when using pkgsrc gcc are that @@ -84,9 +87,10 @@ sound while mimimizing complexity. version of gcc to be used for C programs, with an OS- and version--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 PKGSRC_GCC_VERSION. + - 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 + PKGSRC_GCC_VERSION. - Each of c99, c++, c++11, and c++14 will be associated with a minimum gcc version, such that almost all programs declaring that @@ -137,7 +141,7 @@ sound while mimimizing complexity. ## Remaining issues -### gcc dependencies +### 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. @@ -145,11 +149,52 @@ 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: Analyze what build-time and install-time dependencies actually -exist. +exist. Include old GNU/Linux in this analysis. + +\todo: Consider if dropping nls would help. (On NetBSD, it seems that +base system libraries are used, so it would not help.) + +\todo: Consider failing if optins that we want one way are another, +when bootstrapping. + +### 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 + +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 +normal packages. This completely avoids the issue of building a +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 that packages used to bootstrap the needed compiler are +compiled with an older compiler. Don't worry that they might be +different depending on build order. If we have an actual problem, +deal with it. This requires choosing an approach to omit compiler +selection logic when building the compiler: + +##### 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 +if this is set. -\todo: Discuss adjusting options to minimize dependencies, including -gcc-inplace-math and nls. +##### 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 @@ -159,6 +204,22 @@ 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 + +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. + +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 @@ -189,8 +250,9 @@ PKGSRC_GCC_VERSION to 4.8 and PKGSRC_GXX When the base system is new enough, e.g. gcc 5, 6 or 7 it should simply be used. By "new enough", we mean that almost no programs in -pkgsrc fail to build with it, which implies that it supports (almost -all) C++14 programs. Our current definiton of new enough is gcc 5. +pkgsrc fail to build with it (because it is too old), which implies +that it supports (almost all) C++14 programs. Our current definiton +of new enough is gcc 5. ### Limited mixed versions @@ -209,7 +271,24 @@ situations. Fortran support is currently somewhat troubled.. It seems obvious to extend to PGKSRC_GFORTRAN_VERSION, and have that match PKGSRC_GCC_VERSION or PKGSRC_GXX_VERSION, but the Fortran situation is -not worsened by the above design. \todo Discuss. +not worsened by the above design. + +When building a gcc version, we get gfortran. Perhaps, because of +fortran, we should require a single version, vs a C and a C++ version. + +\todo Discuss. + +### C++ programs 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 +written in C++ but provides a C API, because we still need the C++ +version's stdlib. + +\todo Define a variable for such packages to have in their buildlink3, +which will not add c++ to USE_LANGUAGES but will force +PKGSRC_GXX_VERSION to be used. Or decide that this is a good reason +to really just have one compiler version. ## Path forward