version 1.1, 2017/11/26 01:07:36
|
version 1.2, 2017/11/26 01:20:23
|
Line 1
|
Line 1
|
Using gcc in pkgsrc |
|
|
|
On many systems pkgsrc supports, gcc is the standard compiler. In |
On many systems pkgsrc supports, gcc is the standard compiler. In |
general, different versions of each OS have different gcc versions, |
general, different versions of each OS have different gcc versions, |
and some packages require newer GCC versions, in order to support |
and some packages require newer gcc versions, in order to support |
newer language standards (e.g. c++11, written in the style of |
newer language standards (e.g. c++11, written in the style of |
USE_LANGUAGES), or because older versions don't work (infrequently). |
USE_LANGUAGES), or because older versions don't work (infrequently). |
|
|
Line 45 This section attempts to gather all the
|
Line 43 This section attempts to gather all the
|
- The set of packages that are needed when building a bootstrap |
- The set of packages that are needed when building a bootstrap |
compiler should be minimized. |
compiler should be minimized. |
|
|
- All packages that use C++ should be built with the same compiler version. |
|
|
|
- All packages that use C should have final linking with the highest |
- All packages that use C should have final linking with the highest |
version used in any included library. |
version used in any included library. |
|
|
|
- All packages that use C++ should be built with the same compiler |
|
version. Because these typically also include C, the version used |
|
for C++ must be at least as new as the version used for any used C |
|
package. |
|
|
- pkgsrc should avoid building gcc unless it is more or less |
- pkgsrc should avoid building gcc unless it is more or less |
necessary to build packges. (As an example, if the base system |
necessary to build packges. (As an example, if the base system |
gcc can build c99 but not c++11, building a c99-only program |
gcc can build c99 but not c++11, building a c99-only program |
should not trigger building a gcc version adequate for c++11.) |
should not trigger building a gcc version adequate for c++11.) |
|
|
- The compiler selection logic should work on NetBSD 6, and in-use |
- The compiler selection logic should work on NetBSD 6 and newer, |
(including LTS) GNU/Linux systems. It is desirable for this logic |
and other systems currently supported by pkgsrc, including in-use |
to work on NetBSD 5. |
LTS GNU/Linux systems. It should work on systems that default to |
|
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. |
|
|
- The compiler selection logic should be understandable and not brittle. |
- The compiler selection logic should be understandable and not brittle. |
|
|
## Design |
## Design |
|
|
The above requirements could in theory be satisfied in many ways, but |
The above requirements could in theory be satisfied in many ways, but |
most of them are too complicated. |
most of them are too complicated. We present a design that aims to be |
|
sound while mimimizing complexity. |
|
|
- Packages declare what languages they need, with c++, c++11, and |
- Packages declare what languages they need, with c++, c++11, and |
c++14 being expressed differently. |
c++14 being expressed differently. (This is exactly current |
|
practice and just noted for completeness.) |
|
|
- The package-settable variable GCC_REQD will be used only when a |
- The package-settable variable GCC_REQD will be used only when a |
compiler that generally can compile the declared language version |
compiler that generally can compile the declared language version |
is insufficient. These cases are expected to be relatively rare. |
is insufficient. These cases are expected to be relatively rare; |
|
an example is firefox that is in c++ (but not c+11) and needs gcc |
|
4.9. |
|
|
- A user-settable variable PKGSRC_GCC_VERSION will declare the |
- A user-settable variable PKGSRC_GCC_VERSION will declare the |
version of gcc to be used for C programs, with an OS- and |
version of gcc to be used for C programs, with an OS- and |
Line 121 most of them are too complicated.
|
Line 128 most of them are too complicated.
|
approach is possible inconsistency with gcc's dependencies being |
approach is possible inconsistency with gcc's dependencies being |
built with the base compiler and used later. |
built with the base compiler and used later. |
|
|
|
- We hope that the chosen version can be built using the base system |
|
version, and hope to avoid multi-stage bootstrapping. |
|
|
- We expect that any program containing C++ will undergo final |
- We expect that any program containing C++ will undergo final |
linking with a C++ compiler. This is not a change from the |
linking with a C++ compiler. This is not a change from the |
current situation. |
current situation. |
Line 157 not used. \todo Discuss.
|
Line 167 not used. \todo Discuss.
|
|
|
When the base system is almost new enough, the decision about the |
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 |
default is more complicated. A key example is gcc 4.8, found in |
NetBSD 7. Firefox requires gcc 4.9 (\todo because the c++11 support |
NetBSD 7. Firefox requires gcc 4.9, and all programs using c++14 also |
in 4.8 is not quite good enough), and all programs using c++14 also |
|
need a newer version. One options is to choose 4.8, resulting in |
need a newer version. One options is to choose 4.8, resulting in |
firefox failing, as well as all c++14 programs. Another is to choose |
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 |
4.9, but this makes little sense because c++14 programs will still |
Line 173 used. By "new enough", we mean that alm
|
Line 182 used. By "new enough", we mean that alm
|
to build with it, which implies that it supports (almost all) C++14 |
to build with it, which implies that it supports (almost all) C++14 |
programs. Our current definiton of new enough is gcc 5. |
programs. Our current definiton of new enough is gcc 5. |
|
|
|
### Limited mixed versions |
|
|
|
One approach would be to allow limited mixed versions, where |
|
individual programs could force a specific version to be bootstrapped |
|
and used, so that e.g. firefox could use 4.9 even though most programs |
|
use 4.8, which is what happens now on NetBSD 7. This would rely on |
|
being able to link c++ with 4.9 including some things built with 4.8 |
|
(which is done presently). However, this approach would become |
|
unsound with a library rather than an end program. We reject this as |
|
too much complexity for avoiding building a newer compiler in limited |
|
situations. |
|
|
### Fortran |
### Fortran |
|
|
Fortran support is currently somewhat troubled.. It seems obvious to |
Fortran support is currently somewhat troubled.. It seems obvious to |