tech-pkg archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: Using modern gcc from pkgsrc on old systems for c++



On 2019-04-04 12:01, Greg Troxel wrote:
I am occasionally trying to work on the compiler selection issues a bit.
As part of that, I'm trying to build a c++ program on netbsd-5, which is
ancient, as a difficult test case.  The native compiler is gcc 4.1.3.

Following Jason Bacon's lead, I have built gcc7 from pkgsrc, and am
using that via GCC_REQD=7.  (Yes, I get it that this can't be used to
bootstrap 7; I added it after 7 was built to avoid that.)

Building devel/re2c fails with messages about c++11 things not being
defined at link time.  re2c is declared to be "c++", and checks for and
passes --std=c++98 on every compile and link.  The .o file -- built with
-std=c++98 -- indeed refers to a number of c++11 looking things.

After some investigation, I found that the invocation of c++ for final
linking results in /usr/lib/libstdc++.so.6.0 being referenced (atime
update), and that's the 4.1.3 version.  If I add
/usr/pkg/gcc7/lib/libstdc++.a at the end, it links ok.  This is without
wrappers, with me running the link command cut and pasted from the build
log.  I conclude that

   - the use of functions with cxx11 in them is an internal
     implementation detail of gcc7 (which is perfectly ok, even if it
     surprised me at first that this happens on c++98 builds)

   - somehow, gcc7 is linking the system libstdc++, instead of its own,
     despite what the search paths seem to say

The second thing I don't understand, because all of the commands show -L
for the right lib first, and the default lib path in gcc has that
earlier as well.

My question is thus: Am I understanding this correctly?  Is it
reasonable to expect "/usr/pkg/gcc7/bin/c++ -o foo foo.o" to link with
the stdc++ that belongs with that compiler?

Do I need to mark the package with USE_PKGSRC_GCC_RUNTIME?   But
doesn't every c++ program depend on libstdc++, and doesn't that have to
be the one that came with the compiler (r ABI compatible with it)?

Some data points (with GCC_REQD=7)

make USE_NATIVE_GCC=yes package: succeeds, but uses old compiler (which
   works for this package, but of course not for things in newer C++)

make package: fails to link

make USE_PKGSRC_GCC=yes package: fails to link.  seems to be exactly as
   previous (ccache reports all hits)

make USE_PKGSRC_GCC_RUNTIME=yes package: added a dependency on
   gcc7-libs.  Resulted in all ccache misses.  But still failure to link.


Here is an example of the failures when using gcc7 and not manually
inserting gcc7's libstdc++.a at the end of the link line.

=> Bootstrap dependency digest>=20010302: found digest-20190127
===> Building for re2c-1.1.1
/usr/pkg/bin/gmake  all-am
gmake[1]: Entering directory '/n0/ANONCVS/pkgsrc/devel/re2c/work/re2c-1.1.1'
   CXXLD    re2c
src/code/emit_action.o: In function `_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPKcEEvT_S8_St20forward_iterator_tag.isra.51':
emit_action.cc:(.text+0x62): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_create(unsigned int&, unsigned int)'
src/code/emit_action.o: In function `_ZN4re2cL4needERNS_10OutputFileEjj':
emit_action.cc:(.text+0x1f0): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_assign(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
emit_action.cc:(.text+0x2ce): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_assign(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
src/code/emit_action.o: In function `_ZN4re2c7tagnameB5cxx11ERKNS_3TagE':
emit_action.cc:(.text+0x436): undefined reference to `VTT for std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >'
emit_action.cc:(.text+0x44d): undefined reference to `VTT for std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >'
emit_action.cc:(.text+0x463): undefined reference to `vtable for std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >'
emit_action.cc:(.text+0x46d): undefined reference to `vtable for std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >'
emit_action.cc:(.text+0x4cb): undefined reference to `vtable for std::__cxx11::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >'
emit_action.cc:(.text+0x594): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_assign(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
emit_action.cc:(.text+0x5bb): undefined reference to `vtable for std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >'
emit_action.cc:(.text+0x5c5): undefined reference to `vtable for std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >'
emit_action.cc:(.text+0x5cf): undefined reference to `vtable for std::__cxx11::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >'
emit_action.cc:(.text+0x609): undefined reference to `VTT for std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >'
emit_action.cc:(.text+0x618): undefined reference to `VTT for std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >'
emit_action.cc:(.text+0x67e): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_append(char const*, unsigned int)'
emit_action.cc:(.text+0x707): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_assign(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
emit_action.cc:(.text+0x74c): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_assign(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
emit_action.cc:(.text+0x83e): undefined reference to `std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >::~basic_ostringstream()'
emit_action.cc:(.text+0x85f): undefined reference to `VTT for std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >'
emit_action.cc:(.text+0x86d): undefined reference to `VTT for std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >'
src/code/emit_action.o: In function `re2c::gen_settags(std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&, re2c::DFA const&, unsigned int, re2c::opt_t const*)':
emit_action.cc:(.text+0x9cc): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_append(char const*, unsigned int)'
emit_action.cc:(.text+0xa27): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_append(char const*, unsigned int)'
emit_action.cc:(.text+0xba0): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_append(char const*, unsigned int)'
emit_action.cc:(.text+0xc00): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_append(char const*, unsigned int)'
emit_action.cc:(.text+0xd0e): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_append(char const*, unsigned int)'
src/code/emit_action.o:emit_action.cc:(.text+0xd6c): more undefined references to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_append(char const*, unsigned int)' follow
src/code/emit_action.o: In function `_ZN4re2cL8gen_gotoERSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS6_EEPKNS_5StateERKNS_3DFAEjPKNS_5opt_tEb':
emit_action.cc:(.text+0x1e2f): undefined reference to `VTT for std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >'
emit_action.cc:(.text+0x1e44): undefined reference to `VTT for std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >'
emit_action.cc:(.text+0x1e5a): undefined reference to `vtable for std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >'
emit_action.cc:(.text+0x1e64): undefined reference to `vtable for std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >'
emit_action.cc:(.text+0x1ec2): undefined reference to `vtable for std::__cxx11::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >'
emit_action.cc:(.text+0x1fd3): undefined reference to `VTT for std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >'
emit_action.cc:(.text+0x1fe9): undefined reference to `vtable for std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >'
emit_action.cc:(.text+0x1ff3): undefined reference to `vtable for std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >'
emit_action.cc:(.text+0x2051): undefined reference to `vtable for std::__cxx11::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >'
emit_action.cc:(.text+0x211f): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_assign(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
emit_action.cc:(.text+0x2146): undefined reference to `vtable for std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >'
emit_action.cc:(.text+0x2150): undefined reference to `vtable for std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >'
emit_action.cc:(.text+0x215a): undefined reference to `vtable for std::__cxx11::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >'
emit_action.cc:(.text+0x219e): undefined reference to `VTT for std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >'
emit_action.cc:(.text+0x223a): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_append(char const*, unsigned int)'
emit_action.cc:(.text+0x22f4): undefined reference to `vtable for std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >'
emit_action.cc:(.text+0x22fe): undefined reference to `vtable for std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >'
emit_action.cc:(.text+0x2308): undefined reference to `vtable for std::__cxx11::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >'
emit_action.cc:(.text+0x234c): undefined reference to `VTT for std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >'
emit_action.cc:(.text+0x23bd): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_assign(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
emit_action.cc:(.text+0x2458): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_assign(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
emit_action.cc:(.text+0x2568): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_assign(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
emit_action.cc:(.text+0x2602): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_assign(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
emit_action.cc:(.text+0x265f): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_assign(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
src/code/emit_action.o:emit_action.cc:(.text+0x269f): more undefined references to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_assign(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' follow
src/code/emit_action.o: In function `_ZN4re2cL8gen_gotoERSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS6_EEPKNS_5StateERKNS_3DFAEjPKNS_5opt_tEb':
emit_action.cc:(.text+0x27b4): undefined reference to `std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >::~basic_ostringstream()'
emit_action.cc:(.text+0x2878): undefined reference to `VTT for std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >'
emit_action.cc:(.text+0x28d0): undefined reference to `std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >::~basic_ostringstream()'
emit_action.cc:(.text+0x2917): undefined reference to `VTT for std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >'
src/code/emit_action.o: In function `re2c::emit_action(re2c::OutputFile&, unsigned int, re2c::DFA const&, re2c::State const*, std::set<re2c::label_t, std::less<re2c::label_t>, std::allocator<re2c::label_t> > const&)':
emit_action.cc:(.text+0x3499): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_assign(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
emit_action.cc:(.text+0x35b6): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_assign(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
emit_action.cc:(.text+0x37a7): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_assign(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
emit_action.cc:(.text+0x3895): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_assign(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
src/code/emit_action.o: In function `std::__cxx11::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::~basic_stringbuf()':
emit_action.cc:(.text._ZNSt7__cxx1115basic_stringbufIcSt11char_traitsIcESaIcEED2Ev[_ZNSt7__cxx1115basic_stringbufIcSt11char_traitsIcESaIcEED5Ev]+0xa): undefined reference to `vtable for std::__cxx11::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >'
src/code/emit_action.o: In function `std::__cxx11::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::~basic_stringbuf()':
emit_action.cc:(.text._ZNSt7__cxx1115basic_stringbufIcSt11char_traitsIcESaIcEED0Ev[_ZNSt7__cxx1115basic_stringbufIcSt11char_traitsIcESaIcEED5Ev]+0xa): undefined reference to `vtable for std::__cxx11::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >'
src/code/emit_action.o: In function `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > std::operator+<char, std::char_traits<char>, std::allocator<char> >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
emit_action.cc:(.text._ZStplIcSt11char_traitsIcESaIcEENSt7__cxx1112basic_stringIT_T0_T1_EERKS8_SA_[_ZStplIcSt11char_traitsIcESaIcEENSt7__cxx1112basic_stringIT_T0_T1_EERKS8_SA_]+0x2f): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_append(char const*, unsigned int)'
src/code/emit_action.o: In function `void re2c::strrreplace<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
emit_action.cc:(.text._ZN4re2c11strrreplaceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEvRS6_RKS6_RKT_[_ZN4re2c11strrreplaceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEvRS6_RKS6_RKT_]+0x54): undefined reference to `VTT for std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >'
emit_action.cc:(.text._ZN4re2c11strrreplaceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEvRS6_RKS6_RKT_[_ZN4re2c11strrreplaceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEvRS6_RKS6_RKT_]+0x6b): undefined reference to `VTT for std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >'
emit_action.cc:(.text._ZN4re2c11strrreplaceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEvRS6_RKS6_RKT_[_ZN4re2c11strrreplaceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEvRS6_RKS6_RKT_]+0x81): undefined reference to `vtable for std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >'
emit_action.cc:(.text._ZN4re2c11strrreplaceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEvRS6_RKS6_RKT_[_ZN4re2c11strrreplaceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEvRS6_RKS6_RKT_]+0x8b): undefined reference to `vtable for std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >'
emit_action.cc:(.text._ZN4re2c11strrreplaceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEvRS6_RKS6_RKT_[_ZN4re2c11strrreplaceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEvRS6_RKS6_RKT_]+0xe9): undefined reference to `vtable for std::__cxx11::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >'
emit_action.cc:(.text._ZN4re2c11strrreplaceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEvRS6_RKS6_RKT_[_ZN4re2c11strrreplaceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEvRS6_RKS6_RKT_]+0x1a6): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_assign(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
emit_action.cc:(.text._ZN4re2c11strrreplaceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEvRS6_RKS6_RKT_[_ZN4re2c11strrreplaceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEvRS6_RKS6_RKT_]+0x1f3): undefined reference to `vtable for std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >'
emit_action.cc:(.text._ZN4re2c11strrreplaceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEvRS6_RKS6_RKT_[_ZN4re2c11strrreplaceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEvRS6_RKS6_RKT_]+0x1fd): undefined reference to `vtable for std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >'
emit_action.cc:(.text._ZN4re2c11strrreplaceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEvRS6_RKS6_RKT_[_ZN4re2c11strrreplaceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEvRS6_RKS6_RKT_]+0x207): undefined reference to `vtable for std::__cxx11::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >'
emit_action.cc:(.text._ZN4re2c11strrreplaceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEvRS6_RKS6_RKT_[_ZN4re2c11strrreplaceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEvRS6_RKS6_RKT_]+0x241): undefined reference to `VTT for std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >'
emit_action.cc:(.text._ZN4re2c11strrreplaceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEvRS6_RKS6_RKT_[_ZN4re2c11strrreplaceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEvRS6_RKS6_RKT_]+0x250): undefined reference to `VTT for std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >'
emit_action.cc:(.text._ZN4re2c11strrreplaceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEvRS6_RKS6_RKT_[_ZN4re2c11strrreplaceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEvRS6_RKS6_RKT_]+0x295): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_assign(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
emit_action.cc:(.text._ZN4re2c11strrreplaceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEvRS6_RKS6_RKT_[_ZN4re2c11strrreplaceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEvRS6_RKS6_RKT_]+0x2b7): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::find(char const*, unsigned int, unsigned int) const'
emit_action.cc:(.text._ZN4re2c11strrreplaceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEvRS6_RKS6_RKT_[_ZN4re2c11strrreplaceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEvRS6_RKS6_RKT_]+0x2cf): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_replace(unsigned int, unsigned int, char const*, unsigned int)'
emit_action.cc:(.text._ZN4re2c11strrreplaceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEvRS6_RKS6_RKT_[_ZN4re2c11strrreplaceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEvRS6_RKS6_RKT_]+0x2e9): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::find(char const*, unsigned int, unsigned int) const'
emit_action.cc:(.text._ZN4re2c11strrreplaceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEvRS6_RKS6_RKT_[_ZN4re2c11strrreplaceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEvRS6_RKS6_RKT_]+0x342): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_assign(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
emit_action.cc:(.text._ZN4re2c11strrreplaceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEvRS6_RKS6_RKT_[_ZN4re2c11strrreplaceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEvRS6_RKS6_RKT_]+0x377): undefined reference to `std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >::~basic_ostringstream()'
emit_action.cc:(.text._ZN4re2c11strrreplaceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEvRS6_RKS6_RKT_[_ZN4re2c11strrreplaceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEvRS6_RKS6_RKT_]+0x3cd): undefined reference to `VTT for std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >'
emit_action.cc:(.text._ZN4re2c11strrreplaceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEvRS6_RKS6_RKT_[_ZN4re2c11strrreplaceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEvRS6_RKS6_RKT_]+0x3dc): undefined reference to `VTT for std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >'
src/code/emit_action.o: In function `void re2c::strrreplace<unsigned int>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&)':
emit_action.cc:(.text._ZN4re2c11strrreplaceIjEEvRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKS6_RKT_[_ZN4re2c11strrreplaceIjEEvRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKS6_RKT_]+0x51): undefined reference to `VTT for std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >'
emit_action.cc:(.text._ZN4re2c11strrreplaceIjEEvRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKS6_RKT_[_ZN4re2c11strrreplaceIjEEvRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKS6_RKT_]+0x68): undefined reference to `VTT for std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >'
emit_action.cc:(.text._ZN4re2c11strrreplaceIjEEvRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKS6_RKT_[_ZN4re2c11strrreplaceIjEEvRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKS6_RKT_]+0x7e): undefined reference to `vtable for std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >'
emit_action.cc:(.text._ZN4re2c11strrreplaceIjEEvRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKS6_RKT_[_ZN4re2c11strrreplaceIjEEvRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKS6_RKT_]+0x88): undefined reference to `vtable for std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >'
emit_action.cc:(.text._ZN4re2c11strrreplaceIjEEvRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKS6_RKT_[_ZN4re2c11strrreplaceIjEEvRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKS6_RKT_]+0xe6): undefined reference to `vtable for std::__cxx11::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >'
emit_action.cc:(.text._ZN4re2c11strrreplaceIjEEvRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKS6_RKT_[_ZN4re2c11strrreplaceIjEEvRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKS6_RKT_]+0x1a1): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_assign(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
emit_action.cc:(.text._ZN4re2c11strrreplaceIjEEvRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKS6_RKT_[_ZN4re2c11strrreplaceIjEEvRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKS6_RKT_]+0x1ee): undefined reference to `vtable for std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >'
emit_action.cc:(.text._ZN4re2c11strrreplaceIjEEvRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKS6_RKT_[_ZN4re2c11strrreplaceIjEEvRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKS6_RKT_]+0x1f8): undefined reference to `vtable for std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >'
emit_action.cc:(.text._ZN4re2c11strrreplaceIjEEvRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKS6_RKT_[_ZN4re2c11strrreplaceIjEEvRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKS6_RKT_]+0x202): undefined reference to `vtable for std::__cxx11::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >'
emit_action.cc:(.text._ZN4re2c11strrreplaceIjEEvRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKS6_RKT_[_ZN4re2c11strrreplaceIjEEvRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKS6_RKT_]+0x23c): undefined reference to `VTT for std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >'
emit_action.cc:(.text._ZN4re2c11strrreplaceIjEEvRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKS6_RKT_[_ZN4re2c11strrreplaceIjEEvRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKS6_RKT_]+0x24b): undefined reference to `VTT for std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >'
emit_action.cc:(.text._ZN4re2c11strrreplaceIjEEvRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKS6_RKT_[_ZN4re2c11strrreplaceIjEEvRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKS6_RKT_]+0x295): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_assign(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
emit_action.cc:(.text._ZN4re2c11strrreplaceIjEEvRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKS6_RKT_[_ZN4re2c11strrreplaceIjEEvRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKS6_RKT_]+0x2b7): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::find(char const*, unsigned int, unsigned int) const'
emit_action.cc:(.text._ZN4re2c11strrreplaceIjEEvRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKS6_RKT_[_ZN4re2c11strrreplaceIjEEvRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKS6_RKT_]+0x2cf): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_replace(unsigned int, unsigned int, char const*, unsigned int)'
emit_action.cc:(.text._ZN4re2c11strrreplaceIjEEvRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKS6_RKT_[_ZN4re2c11strrreplaceIjEEvRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKS6_RKT_]+0x2e9): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::find(char const*, unsigned int, unsigned int) const'
emit_action.cc:(.text._ZN4re2c11strrreplaceIjEEvRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKS6_RKT_[_ZN4re2c11strrreplaceIjEEvRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKS6_RKT_]+0x342): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_assign(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
emit_action.cc:(.text._ZN4re2c11strrreplaceIjEEvRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKS6_RKT_[_ZN4re2c11strrreplaceIjEEvRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKS6_RKT_]+0x377): undefined reference to `std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >::~basic_ostringstream()'
emit_action.cc:(.text._ZN4re2c11strrreplaceIjEEvRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKS6_RKT_[_ZN4re2c11strrreplaceIjEEvRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKS6_RKT_]+0x3cd): undefined reference to `VTT for std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >'
emit_action.cc:(.text._ZN4re2c11strrreplaceIjEEvRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKS6_RKT_[_ZN4re2c11strrreplaceIjEEvRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKS6_RKT_]+0x3dc): undefined reference to `VTT for std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >'
src/code/emit_action.o: In function `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > std::operator+<char, std::char_traits<char>, std::allocator<char> >(char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
emit_action.cc:(.text._ZStplIcSt11char_traitsIcESaIcEENSt7__cxx1112basic_stringIT_T0_T1_EEPKS5_RKS8_[_ZStplIcSt11char_traitsIcESaIcEENSt7__cxx1112basic_stringIT_T0_T1_EEPKS5_RKS8_]+0x37): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::reserve(unsigned int)'
emit_action.cc:(.text._ZStplIcSt11char_traitsIcESaIcEENSt7__cxx1112basic_stringIT_T0_T1_EEPKS5_RKS8_[_ZStplIcSt11char_traitsIcESaIcEENSt7__cxx1112basic_stringIT_T0_T1_EEPKS5_RKS8_]+0x52): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_append(char const*, unsigned int)'
emit_action.cc:(.text._ZStplIcSt11char_traitsIcESaIcEENSt7__cxx1112basic_stringIT_T0_T1_EEPKS5_RKS8_[_ZStplIcSt11char_traitsIcESaIcEENSt7__cxx1112basic_stringIT_T0_T1_EEPKS5_RKS8_]+0x62): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_append(char const*, unsigned int)'
src/code/emit_action.o: In function `void std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::_M_range_insert<std::reverse_iterator<__gnu_cxx::__normal_iterator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > >(__gnu_cxx::__normal_iterator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::reverse_iterator<__gnu_cxx::__normal_iterator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >, std::reverse_iterator<__gnu_cxx::__normal_iterator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >, std::forward_iterator_tag)':
emit_action.cc:(.text._ZNSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE15_M_range_insertISt16reverse_iteratorIN9__gnu_cxx17__normal_iteratorIPS5_S7_EEEEEvSD_T_SF_St20forward_iterator_tag[_ZNSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE15_M_range_insertISt16reverse_iteratorIN9__gnu_cxx17__normal_iteratorIPS5_S7_EEEEEvSD_T_SF_St20forward_iterator_tag]+0x15c): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_assign(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
emit_action.cc:(.text._ZNSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE15_M_range_insertISt16reverse_iteratorIN9__gnu_cxx17__normal_iteratorIPS5_S7_EEEEEvSD_T_SF_St20forward_iterator_tag[_ZNSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE15_M_range_insertISt16reverse_iteratorIN9__gnu_cxx17__normal_iteratorIPS5_S7_EEEEEvSD_T_SF_St20forward_iterator_tag]+0x1a6): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_assign(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
emit_action.cc:(.text._ZNSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE15_M_range_insertISt16reverse_iteratorIN9__gnu_cxx17__normal_iteratorIPS5_S7_EEEEEvSD_T_SF_St20forward_iterator_tag[_ZNSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE15_M_range_insertISt16reverse_iteratorIN9__gnu_cxx17__normal_iteratorIPS5_S7_EEEEEvSD_T_SF_St20forward_iterator_tag]+0x486): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_assign(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
[many more omitted]
Can you try bootstrapping a tree on NetBSD 5 with the attached script?

I used it on NetBSD 7.1, choosing gcc7 when prompted, and re2c built fine for me.

There are some pitfalls involved with using a pkgsrc gcc as a minimum compiler and auto-pkgsrc-setup knows how to step around them.  See the attached mk.conf generated by the script.

The massive exception list for gcc dependencies is due largely to the python dep in gcc8, which almost double the number of dependencies over gcc7.

Your errors don't seem to indicate that this is the problem, but you also have to watch out for old binutils installations that can't handle instructions generated by newer gcc code generators.   See the hack for RHEL at the end of my mk.conf.

NetBSD netbsddev.hpc  bacon ~ 1006: cd Pkgsrc/pkgsrc/devel/re2c/
NetBSD netbsddev.hpc  bacon ~/Pkgsrc/pkgsrc/devel/re2c 1007: source ~~/Pkgsrc/pkg/etc/pkgsrc.csh
NetBSD netbsddev.hpc  bacon ~/Pkgsrc/pkgsrc/devel/re2c 1008: bmake install

[ snip ]

=> Creating binary package /home/bacon/Pkgsrc/pkgsrc/devel/re2c/work/.packages/re2c-1.1.1.tgz
===> Building binary package for re2c-1.1.1
=> Creating binary package /home/bacon/Pkgsrc/pkgsrc/packages/All/re2c-1.1.1.tgz
===> Installing binary package of re2c-1.1.1
NetBSD netbsddev.hpc  bacon ~/Pkgsrc/pkgsrc/devel/re2c 1009: ldd ~~/Pkgsrc/pkg/bin/re2c
/home/bacon/Pkgsrc/pkg/bin/re2c:
    -lstdc++.7 => /home/bacon/Pkgsrc/pkg/gcc7/lib/./libstdc++.so.7
    -lm.0 => /usr/lib/libm.so.0
    -lgcc_s.1 => /home/bacon/Pkgsrc/pkg/gcc7/lib/./libgcc_s.so.1
    -lc.12 => /usr/lib/libc.so.12
NetBSD netbsddev.hpc  bacon ~/Pkgsrc/pkgsrc/devel/re2c 1010: re2c
re2c: error: no source file

#!/bin/sh -e

pause()
{
    local junk
    
    printf "Press Enter to continue..."
    read junk
}


##########################################################################
#   Function description:
#       Ask user to select a snapshot
#
#   History:
#   Date        Name        Modification
#   2016-01-04  Jason Bacon Begin
##########################################################################

select_snapshot()
{
    cat << EOM

You must now choose a pkgsrc snapshot to install.

Quarterly snapshots such as "2016Q2" have gone through additional quality
control at the end of each quarter and contain fewer bugs.

The "current" snapshot contains the latest commits of each package.

See ftp://ftp.netbsd.org/pub/pkgsrc/ for a list of available snapshots.

1.. Install a quarterly snapshot
2.. Install current
3.. Install from git -current snapshot (git://unixdev.ceas.uwm.edu/pkgsrc)
4.. Install from a custom source tree

EOM
    
    selected=0
    while [ $selected = 0 ]; do
	printf "Selection? "
	read snapshot
	case $snapshot in
	1)
	    printf "Year? "
	    read year
	    printf "Quarter? "
	    read quarter
	    snapshot=pkgsrc-${year}Q$quarter
	    selected=1
	    ;;
	2)
	    snapshot=current
	    selected=1
	    ;;
	3)
	    snapshot=git
	    selected=1
	    ;;
	4)
	    snapshot=custom
	    selected=1
	    ;;
	*)
	    printf "Error: Valid selections are 1 or 2.\n" >> /dev/stderr
	    ;;
	esac
    done
    return 0
}


##########################################################################
#   Script description:
#       Automatically install and configure pkgsrc.
#
#   History:
#   Date        Name        Modification
#   2014-05-19  Jason Bacon Begin
##########################################################################

usage()
{
    printf "Usage: $0 [--extract-only]\n"
    exit 1
}


##########################################################################
#   Main
##########################################################################

case $# in
0)
    ;;
1)
    if [ $1 = --extract-only ]; then
	EXTRACT_ONLY=yes
    else
	usage
    fi
    ;;
*)
    usage
    ;;
esac

# AD servers might add funky stuff to IDs
if id -gn | fgrep -q ' ' || id -gn | fgrep -q '\'; then
    cat << EOM

Your primary group ID, "`id -gn`", contains white space or special
characters.

This will cause the pkgsrc bootstrap to fail.  Please install as
a different user with no special characters in the user or group names.

EOM
    exit 1
fi

start_dir=`pwd`

# RHEL / CentOS base
if [ -e /etc/redhat-release ] && [ ! -e /usr/bin/gcc ]; then
    if [ `whoami` = root ]; then
	printf "Installing base development tools via yum...\n"
	yum install -y gcc-gfortran gcc-c++ gcc
    else
	printf "You must run 'yum install gcc-gfortran gcc-c++ gcc' first.\n"
	exit 1
    fi
fi

# Debian dash is not compatible
if [ -e /etc/debian_version ] && [ -e /bin/bash ]; then
    SH=/bin/bash
    export SH
fi

# For OS X, we should install a new base gcc using install-base-gcc
case `uname` in
'Darwin')
    if [ ! -e /usr/bin/gcc ]; then
	cat << EOM

You must install Xcode command-line tools in order to use pkgsrc.

EOM
	exit 1
    fi
    os_major=`uname -r | cut -d . -f 1`
    ;;

CYGWIN*)
    cat << EOM

You MUST have the following Cygwin packages installed:

    devel/gcc4
    devel/g++4
    devel/gfortran4
    devel/make
    lib/mpfr4 (required by gcc4, but not installed automatically)
    net/curl or web/wget

Ideally, no other Cygwin packages should be installed.  Libraries and tools
installed by Cygwin could be found and used by configure scripts in pkgsrc
packages.  As with all package systems, It is better if all pkgsrc
dependencies are installed by pkgsrc.  Pkgsrc does its best to ensure that
this happens, but configure scripts have minds of their own and pkgsrc cannot
control them completely.

EOM
    pause
    ;;
esac

if [ -e /opt/local/bin/port ]; then
    cat << EOM

============================================================================
You appear to be using MacPorts.  MacPorts and pkgsrc can coexist, but you
must ensure that your environment is configured to avoid mixing them.  Your
PATH, LD_LIBRARY_PATH, and any other variables that select components of
MacPorts or pkgsrc must be configured at all times to use one or the other,
but never both (unless you know what you're doing).
============================================================================
EOM
    pause
fi

if [ -e /sw/bin ]; then
    cat << EOM

============================================================================
You appear to be using Fink.  Fink and pkgsrc can coexist, but you
must ensure that your environment is configured to avoid mixing them.  Your
PATH, LD_LIBRARY_PATH, and any other variables that select components of
MacPorts or pkgsrc must be configured at all times to use one or the other,
but never both (unless you know what you're doing).
============================================================================
EOM
    pause
fi

cat << EOM

============================================================================
Default responses are shown in [].  Simple press Enter to accept defaults.

Type Ctrl+c at any time to stop installation.
============================================================================
EOM

if [ `whoami` != 'root' ]; then
    cat << EOM

============================================================================
Not running as root.  Installing as user $(whoami).  This is fine, but
is typically only used to install pkgsrc for your own exclusive use
on a system for which you don't have administrator rights.  If you want
to install pkgsrc for multiple users, you may prefer to cancel now and
re-run this script as root.
============================================================================

EOM
    default_prefix="$HOME/Pkgsrc"
else
    cat << EOM
    
============================================================================
Running as root.  Installing globally.
============================================================================

EOM
    if [ `uname` = Darwin ]; then
	default_prefix="/opt"
    else
	default_prefix="/usr"
    fi
fi
printf "OK to proceed? [y]/n "
read proceed
if [ "0$proceed" = "0n" ]; then
    exit
fi

cat << EOM

============================================================================
Binary packages are available for CentOS 6 and 7 if you choose a quarterly
snapshot and install under /sharedapps, e.g. /sharedapps/pkg-2017Q1.

This will allow packages to be installed using a simple command like

    pkg_add hmmer

instead of building from source with

    cd biology/hmmer
    bmake install

To use this feature, enter /sharedapps for the prefix below and choose a
quarterly snapshot of 2017Q1 or later.
============================================================================

EOM

printf "Installation prefix? [$default_prefix] "
read prefix
if [ 0"$prefix" = 0 ]; then
    prefix=$default_prefix
fi

select_snapshot

if [ $snapshot = current ]; then
    dist_suffix="-`date +%Y-%m-%d`"
else
    dist_suffix="${snapshot#pkgsrc}"
fi

cat << EOM
============================================================================
Pkgsrc supports multiple installations on the same computer.  Pkgsrc-setup
handles multiple installations under the same prefix by appending the date
of a current snapshot or the name of a quarterly snapshot.

It is recommended that you use an install suffix unless you are sure that
you will not need another pkgsrc tree under 

    $prefix
    
It also helps identify the version of each tree.
============================================================================
EOM

if [ $snapshot = custom ] || [ $snapshot = git ]; then
    use_install_suffix=n
else
    printf "Add $dist_suffix to installation directories? [y]/n "
    read use_install_suffix
fi
if [ 0$use_install_suffix != 0n ]; then
    install_suffix="$dist_suffix"
else
    install_suffix=''
fi

install_prefix=$prefix/pkg$install_suffix
frameworks_prefix=$prefix/pkgsrc$install_suffix
sys_prefix=$prefix/pkg$install_suffix
mk_conf=$sys_prefix/etc/mk.conf

cat << EOM

============================================================================
Packages will be installed under

    $install_prefix
    
Frameworks for building and installing will be under

    $frameworks_prefix

System files will be under

    $sys_prefix
============================================================================

EOM

pause

# Base compiler setup
cat << EOM

============================================================================
You will need at least a C compiler and a C++ compiler to build most
pkgsrc packages.  Many packages also require a Fortran compiler.  On
many systems, such as NetBSD, pkgsrc can build its own Fortran compilers.
On RHEL/CentOS, using the gfortran compiler provided via Yum works well.

If pkgsrc is bootstrapped to use the GCC compiler collection,
it will look for gfortran in the PATH when building certain packages.
============================================================================
EOM

# Avoid software from other package managers or cave-man installs
# This may need alteration on some platforms, but it works on CentOS,
# FreeBSD, NetBSD, and OS X.
PATH=/usr/bin:/usr/sbin:/bin:/sbin
export PATH
unset CC CFLAGS CXX CXXFLAGS CPP CPPFLAGS FC FFLAGS LD LDFLAGS LD_LIBRARY_PATH

printf "Compilers in your current PATH include:\n\n"
if ! which cc; then
    if ! which gcc; then
	printf "No C compiler found.  Aborting...\n"
	exit 1
    fi
fi
if ! which c++; then
    if ! which g++; then
	printf "No C++ compiler found.  Aborting...\n"
	exit 1
    fi
fi

if ! which gfortran; then
    printf "Warning: No gfortran compiler found.\n"
fi

if [ `uname` != NetBSD ] && [ `uname` != SunOS ] && \
    [ `uname` != FreeBSD ] && [ `uname` != DragonFly ] && ! which java; then
    cat << EOM

Warning: No Java installation detected and the openjdk packages only build
on certain BSD and SunOS systems.  On Linux, Mac OS X, and other platforms,
you should install a Java JDK before bootstrapping pkgsrc.

EOM
    printf "Continue without Java? y/[n] "
    read continue
    if [ 0$continue != 0y ]; then
	exit
    fi
fi

printf "\nThese same compilers must be first in PATH when building packages.\n"
printf "\nProceed? [y]/n "
read proceed
if [ 0$proceed = 0n ]; then
    exit 0
fi

if ! which gfortran; then
    cat << EOM

============================================================================
No Fortran compiler was found in your PATH.

On RHEL compatible systems, it's best to install gfortran with

    yum install gcc-gfortran

before bootstrapping pkgsrc.

Otherwise, pkgsrc will attempt to install a Fortran compiler when needed,
using g95 as the default.  For better performance and support of newer Fortran
code, you may want to use one of the GCC packages instead of g95.

Note that the GCC packages are much larger than g95 and may not build on
all platforms.

You can change this later by setting

    PKGSRC_FORTRAN=gfortran

or

    PKGSRC_FORTRAN=g95

in $install_prefix/etc/mk.conf.
============================================================================

EOM
    printf "Continue without Fortran in the base compiler suite? [y]/n "
    read resp
    if [ 0$resp = 0n ]; then
	exit 1
    fi
    
    printf "Use GCC packages instead of g95? [y]/n "
    read use_gfortran

fi

cat << EOM

============================================================================
Compiling with -march=native can result in executables that run up to 30%
faster in many cases, sometimes even more.  The binary packages created
will not be portable, however, and will only run on CPUs with all the
features of this one.

If you are using this system to generate binary packages for use on other
systems, answer 'n' here.

If you want executables optimized for maximum speed on this system, answer
'y'.  This will append -march=native to CFLAGS, CXXFLAGS, and FFLAGS in

    $install_prefix/etc/mk.conf

You can add additional compiler flags here as well, all of which will be
applied to every pkgsrc build.

EOM
printf "Build all compiled packages with -march=native? y/[n] "
read march_native

if which curl > /dev/null; then
    fetch_cmd='curl -O'
elif which wget > /dev/null; then
    fetch_cmd=wget
elif which fetch > /dev/null; then
    fetch_cmd=fetch
elif [ -e /usr/pkg/bin/fetch ]; then
    fetch_cmd=/usr/pkg/bin/fetch
elif which ftp > /dev/null; then
    fetch_cmd=ftp
else
    printf "No fetch command found.\n"
    exit 1
fi

# Download new pkgsrc dist if a new install number was provided
if [ $snapshot = git ]; then
    save_cwd=`pwd`
    mkdir -p $prefix
    cd $prefix
    git clone git://unixdev.ceas.uwm.edu/pkgsrc pkgsrc
    cd $save_cwd
elif [ $snapshot = custom ]; then
    download='n'
    cat << EOM

===========================================================================
Place your custom source tree in $frameworks_prefix now.
===========================================================================

EOM
    pause
elif [ -e $prefix/Dist/pkgsrc$dist_suffix.tar.gz ]; then
    printf "pkgsrc$dist_suffix.tar.gz already exists.  Replace? y/[n] "
    read download
else
    download='y'
fi

if [ 0$download = 0y ]; then
    printf "Downloading dist...\n\n"
    # Replace everything after new download
    rm -rf $frameworks_prefix $install_prefix $sys_prefix
    mkdir -p $prefix/Dist
    cd $prefix/Dist
    rm -f pkgsrc.tar.gz

    fetched=no
    for dist in \
	ftp://ftp.netbsd.org/pub/pkgsrc/$snapshot/pkgsrc.tar.gz \
	http://mirror1.hpc.uwm.edu/pkgsrc/dist-archive/$snapshot.tar.gz \
	http://mirror2.hpc.uwm.edu/pkgsrc/dist-archive/$snapshot.tar.gz; do
	
	echo $dist
	if $fetch_cmd $dist; then
	    fetched=yes
	    break
	fi
    done
    if [ $fetched = no ]; then
	printf "Unable to fetch $snapshot from any mirror.  Giving up...\n"
	exit 1
    fi
    # Make sure dist is in the form pkgsrc-yearQquarter.tar.gz
    if echo $dist | fgrep ftp.netbsd.org; then
	mv pkgsrc.tar.gz pkgsrc$dist_suffix.tar.gz
    fi
fi

if [ $snapshot = custom ] || [ $snapshot = git ]; then
    unpack='n'
elif [ -e $frameworks_prefix ]; then
    printf "$frameworks_prefix already exists.  Replace? y/[n] "
    read unpack
else
    unpack='y'
fi

# Make sure everything from here on is world-readable
umask 022

# Create a new package tree for this installation
if [ 0$unpack = 0y ]; then
    # Replace everything if unpacking again
    rm -rf $frameworks_prefix $install_prefix $sys_prefix
    cd $prefix/Dist
    printf "Unpacking frameworks...\n"
    # Use of -o and --no-same-permissions is a security requirement.  It
    # prevents root from installing a tree owned by an ordinary user.
    if [ `uname` = NetBSD ]; then
	tar -zxf pkgsrc$dist_suffix.tar.gz
    else
	tar --no-same-permissions -zoxf pkgsrc$dist_suffix.tar.gz
    fi
    rm -rf $frameworks_prefix $sys_prefix $install_prefix
    mv pkgsrc $frameworks_prefix
    if [ 0$EXTRACT_ONLY != 0 ]; then
	exit 0
    fi
fi

if [ -e $install_prefix/bin/bmake ]; then
    printf "$install_prefix already exists.  Rebuild? y/[n] "
    read bootstrap
else
    bootstrap='y'
fi

# Snow Leopard uname reports i386, even on 64-bit Core 2 Duo machines,
# so check the hardware and force 64-bit ABI if needed
# Idea:
#    gcc -v |& grep Target
#        i386: --abi 32
#        x86_64: --abi 64

if [ `uname` = 'Darwin' ] && \
	sysctl -n machdep.cpu.brand_string | grep 'Core(TM)2' ; then
    abi_flags='-abi 64'
else
    abi_flags=''
fi

# Bootstrap the installation
if [ 0$bootstrap = '0y' ]; then
    # Keep old frameworks, but rebuild installation dir and system files
    rm -rf $sys_prefix $install_prefix
    cd $frameworks_prefix/bootstrap
    
    # Scrub env to prevent leakage of nonstandard tools into pkgsrc
    unset CFLAGS CXXFLAGS CPPFLAGS FC FFLAGS LD LDFLAGS LD_LIBRARY_PATH
    CC=cc
    CXX=c++
    # OS X 10.12.6 needs full path for bmake build
    CPP=`which cpp`
    # PKGSRC_USE_FORTIFY causes some breakage, including cwrappers on CentOS
    # Enable it in the future if/when most of the issues are resolved
    # PKGSRC_USE_FORTIFY=no
    # Leave fortify on and just disable -Werror.  Sufficient for cwrappers.
    # NOGCCERROR=yes
    # export CC CXX CPP NOGCCERROR # PKGSRC_USE_FORTIFY
    export CC CXX CPP

    if [ `whoami` = root ]; then
	./bootstrap \
	    ${abi_flags} \
	    --prefix ${install_prefix} \
	    --pkgdbdir ${sys_prefix}/pkgdb \
	    --sysconfdir ${sys_prefix}/etc \
	    --varbase ${sys_prefix}/var \
	    --workdir ${sys_prefix}/work 2>&1 | tee bootstrap$dist_suffix.log
    else
	./bootstrap \
	    ${abi_flags} \
	    --unprivileged \
	    --prefix ${install_prefix} \
	    --pkgdbdir ${sys_prefix}/pkgdb \
	    --sysconfdir ${sys_prefix}/etc \
	    --varbase ${sys_prefix}/var \
	    --workdir ${sys_prefix}/work 2>&1 | tee bootstrap$dist_suffix.log
    fi
 
    # Separate bootstrap settings
    printf "\n.ifdef BSD_PKG_MK       # Begin auto-pkgsrc-setup customizations\n\n" >> $mk_conf

    # PKGSRC_USE_FORTIFY causes some breakage, including cwrappers on CentOS
    # Enable it in the future if/when most of the issues are resolved
    # printf "PKGSRC_USE_FORTIFY=\tno\n" >> $mk_conf
    # Leave fortify on and just disable -Werror
    # gcc49,5,6 fail on CentOS 7 with just this
    # gcc49,5 on CentOS 6
    # printf "NOGCCERROR=\t\tyes\n" >> $mk_conf

    # Configure pkgsrc options in mk.conf
    # Add X11_TYPE=modular tells pkgsrc to use its own X11 packages
    # PREFER_PKGSRC tells pkgsrc to install depdencies from its own
    # packages instead of using native tools
    # RHEL packages tend to be out of date (enterprise Linux values
    # stability above features)
    if ! fgrep X11_TYPE $mk_conf; then
	printf "X11_TYPE=\t\tmodular\n" >> $mk_conf
	printf "PREFER_NATIVE=\t\tno\n" >> $mk_conf
	printf "PREFER_PKGSRC=\t\tyes\n" >> $mk_conf
    fi

    if [ 0$use_gfortran != 0n ]; then
	printf "PKGSRC_FORTRAN=\t\tgfortran\n" >> $mk_conf
    fi
    
    printf "Will you be using this installation for package development? y/[n] "
    read developer
    if [ 0$developer = 0y ]; then
	if ! fgrep PKG_DEVELOPER $mk_conf; then
	    printf "PKG_DEVELOPER=\t\tyes\n" >> $mk_conf
	fi
    fi
    
    # Github and some other sites are inaccessible via ftp on Linux
    # Try to use a native tool rather than one that pkgsrc has to install
    # as a dependency
    case `uname` in
    FreeBSD)
	printf "FETCH_USING=\t\tfetch\n" >> $mk_conf
	;;
    Linux)
	printf "FETCH_USING=\t\tcurl\n" >> $mk_conf
	;;
    NetBSD)
	printf "FETCH_USING=\t\tftp\n" >> $mk_conf
	;;
    *)
	;;
    esac
    
    cat << EOM

============================================================================
You can configure pkgsrc to install any package regardless of the license
type.  Do this only if you are certain that your organization has no
restrictions on the allowable types of licenses.

EOM
    printf "Accept all software licenses? [y]/n "
    read skip_license_check
    if [ 0$skip_license_check != 0n ]; then
	printf "SKIP_LICENSE_CHECK=\tyes\n" >> $mk_conf
    else
	tmpfile=auto-pkgsrc-setup-license-list
	awk '{
	if ( $1 == "DEFAULT_ACCEPTABLE_LICENSES=" )
	    while ( $NF == "\\" )
	    {
		getline;
		for (c=1; c<NF; ++c) printf("%s ", $c);
	    }
	}' $frameworks_prefix/mk/license.mk > $tmpfile
	licenses=`cat $tmpfile`
	rm -f $tmpfile
    
	for license in $licenses; do
	    printf "Allow packages with license $license? [y]/n "
	    read accepted
	    if [ 0$accepted != '0n' ]; then
		printf "ACCEPTABLE_LICENSES+=\t$license\n" >> $mk_conf
	    fi
	done
    fi
    
    cat << EOM
Allow installation of packages with known security vulnerabilities?

Not recommended on systems with untrusted users or systems on public
networks.

If you answer NO here, you can still install individual vulnerable
packages by running

    env ALLOW_VULNERABLE_PACKAGES=yes bmake install

EOM
    printf "Allow vulnerable packages? y/[n] "
    read allow_vulnerable
    if [ 0$allow_vulnerable = 0y ]; then
	printf "ALLOW_VULNERABLE_PACKAGES=yes\n" >> $mk_conf
    fi
    printf "PKG_OPTIONS.libfetch=\tinet6 openssl\n" >> $mk_conf
    
    if [ 0$march_native = 0y ]; then
	printf "CFLAGS+=\t\t-march=native\n" >> $mk_conf
	printf "CXXFLAGS+=\t\t-march=native\n" >> $mk_conf
	printf "FFLAGS+=\t\t-march=native\n" >> $mk_conf
    fi
    
    case $(uname) in
    Linux)
	make_jobs=$(grep '^processor' /proc/cpuinfo|wc -l)
	;;
    Darwin|FreeBSD|NetBSD)
	make_jobs=$(sysctl -n hw.ncpu)
	;;
    *)
	cat << EOM

Not sure how to determine the number of cores under $(uname).
Set MAKE_JOBS manually in mk.conf if desired and send us a patch if
you know how to fix this.

EOM
	make_jobs=1
	;;
    esac
    printf "MAKE_JOBS=\t\t$make_jobs\n" >> $mk_conf
fi  # bootstrap

# FIXME: Verify that this is the minimal list of $base_gcc deps
# Pkgsrc 2017Q2 assumes a c++11 compiler.  Force CentOS 6 to build everything
# using a pkgsrc GCC instead of its native GCC 4.4.7, which has only partial
# c++11 support and does not support the -std=c++11 flag.
# Hopefully pkgsrc will handle cases like this automatically in the near
# future and this hack will no longer be needed.
#
# gmake, gsed, and libiconv are for NetBSD

if [ `uname` = Linux ] || [ `uname` = NetBSD ]; then

    cat << EOM
    
Select a minimum GCC version.  Many packages will not build with older
GCC suites such as the GCC 4.4 provided by RHEL/CentOS 6.  When you select
a newer compiler here, a pkgsrc gcc will be used to build all packages
except itself.

1.. 4.8
2.. 4.9
3.. 5.0
4.. 6.0
5.. 7.0
6.. 8.0

EOM
    default_minimum=5
    printf "Selection? [$default_minimum] "
    read selection
    if [ 0$selection = 0 ]; then
	selection=$default_minimum
    fi
    case $selection in
    1)
	base_gcc=gcc48
	gcc_version=4.8
	;;
    2)
	base_gcc=gcc49
	gcc_version=4.9
	;;
    3)
	base_gcc=gcc5
	gcc_version=5.0
	;;
    4)
	base_gcc=gcc6
	gcc_version=6.0
	;;
    5)
	base_gcc=gcc7
	gcc_version=7.0
	;;
    6)
	base_gcc=gcc8
	gcc_version=8.0
	;;
    esac

    # Keep this in sync with pbulk-setup for installations that use both
    # binary packages and build from source.
    cat << EOM >> $mk_conf

.if \\
    empty(PKGPATH:Marchivers/bsdtar) && \\
    empty(PKGPATH:Marchivers/bzip2) && \\
    empty(PKGPATH:Marchivers/pax) && \\
    empty(PKGPATH:Marchivers/xz) && \\
    empty(PKGPATH:Mconverters/help2man) && \\
    empty(PKGPATH:Mconverters/libiconv) && \\
    empty(PKGPATH:Mconverters/p5-Unicode-EastAsianWidth) && \\
    empty(PKGPATH:Mdatabases/db4) && \\
    empty(PKGPATH:Mdevel/autoconf) && \\
    empty(PKGPATH:Mdevel/binutils) && \\
    empty(PKGPATH:Mdevel/gettext-lib) && \\
    empty(PKGPATH:Mdevel/gettext-tools) && \\
    empty(PKGPATH:Mdevel/gmake) && \\
    empty(PKGPATH:Mdevel/gmp) && \\
    empty(PKGPATH:Mdevel/gtexinfo) && \\
    empty(PKGPATH:Mdevel/libffi) && \\
    empty(PKGPATH:Mdevel/makedepend) && \\
    empty(PKGPATH:Mdevel/pkgconf) && \\
    empty(PKGPATH:Mdevel/libtool-base) && \\
    empty(PKGPATH:Mdevel/m4) && \\
    empty(PKGPATH:Mdevel/ncurses) && \\
    empty(PKGPATH:Mdevel/nbpatch) && \\
    empty(PKGPATH:Mdevel/p5-CPAN-Meta) && \\
    empty(PKGPATH:Mdevel/p5-Module-Build) && \\
    empty(PKGPATH:Mdevel/p5-Perl4-CoreLibs) && \\
    empty(PKGPATH:Mdevel/p5-Scalar-List-Utils) && \\
    empty(PKGPATH:Mdevel/p5-gettext) && \\
    empty(PKGPATH:Mdevel/p5-inc-latest) && \\
    empty(PKGPATH:Mdevel/readline) && \\
    empty(PKGPATH:Mdevel/zlib) && \\
    empty(PKGPATH:Mlang/$base_gcc) && \\
    empty(PKGPATH:Mlang/$base_gcc-libs) && \\
    empty(PKGPATH:Mlang/perl5) && \\
    empty(PKGPATH:Mlang/python27) && \\
    empty(PKGPATH:Mmath/cloog) && \\
    empty(PKGPATH:Mmath/isl) && \\
    empty(PKGPATH:Mmath/mpcomplex) && \\
    empty(PKGPATH:Mmath/mpfr) && \\
    empty(PKGPATH:Mmisc/p5-Locale-libintl) && \\
    empty(PKGPATH:Mnet/libfetch) && \\
    empty(PKGPATH:Mpkgtools/cwrappers) && \\
    empty(PKGPATH:Mpkgtools/digest) && \\
    empty(PKGPATH:Mpkgtools/pkg_install-info) && \\
    empty(PKGPATH:Mpkgtools/pkgin) && \\
    empty(PKGPATH:Msecurity/mozilla-rootcerts) && \\
    empty(PKGPATH:Msecurity/openssl) && \\
    empty(PKGPATH:Msysutils/checkperms) && \\
    empty(PKGPATH:Mtextproc/gsed) && \\
    empty(PKGPATH:Mtextproc/p5-Text-Unidecode) && \\
    empty(PKGPATH:Mx11/xorgproto)

GCC_REQD+=$gcc_version

.endif  # GCC_REQD

# RHEL systems may have an outdated "as" that cannot translate instructions
# from current GCC code generators, so force pkgsrc binutils.
.if exists(/etc/redhat-release) && !empty(PKGPATH:Mlang/gcc*)
CONFIGURE_ARGS+=        --with-gnu-as --with-as=\${PREFIX}/bin/gas
CONFIGURE_ARGS+=        --with-gnu-ld --with-ld=\${PREFIX}/bin/gld
BUILDLINK_DEPMETHOD.binutils=   full
.  include "../../devel/binutils/buildlink3.mk"
.endif

EOM
    compiler=gcc-$gcc_version
else
    compiler=cc
fi

printf "\n.endif   # Pkgsrc customizations\n" >> $mk_conf

# Install latest security checks
${install_prefix}/sbin/pkg_admin \
    -K ${sys_prefix}/pkgdb fetch-pkg-vulnerabilities

##########################################################################
#   Some improvements to the base installation
##########################################################################

# Scrub PATH and LD_LIBRARY_PATH to prevent leakage.
# If someone wants to shoot themselves in the foot by adding additional
# non-standard directories, they'll have to load their own bullets and
# unlatch the safety themselves.

# Generate startup script segments

cat << EOM > ${sys_prefix}/etc/pkgsrc.sh
# Generated by auto-pkgsrc-setup
if ! echo \$PATH | fgrep -q "${install_prefix}/bin:"; then
    PKGSRC=$install_prefix
    export PKGSRC
    
    # Scrub PATH and LD_LIBRARY_PATH before adding pkgsrc to prevent leakage
    # CentOS 7 /bin/gcc fails with cannot find cc1, so put /usr/bin first
    PATH=/usr/bin:/usr/sbin:/bin:/sbin
    unset CC CFLAGS CXX CXXFLAGS CPP CPPFLAGS FC FFLAGS LD LDFLAGS LD_LIBRARY_PATH
    
    PATH=\$PKGSRC/bin:\$PKGSRC/sbin:\$PATH
    export PATH
    MANPATH=\$PKGSRC/man:/usr/share/man
    export MANPATH
    PKGSRC_INCLUDE=\$PKGSRC/include
    export PKGSRC_INCLUDE
    PKGSRC_LIB=\$PKGSRC/lib
    export PKGSRC_LIB
fi
EOM

# Keep this in sync with the script above.  Just remove the scrub lines.
cat << EOM > ${sys_prefix}/etc/pkgsrc-non-exclusive.sh
# Generated by auto-pkgsrc-setup
if ! echo \$PATH | fgrep -q "${install_prefix}/bin:"; then
    PKGSRC=$install_prefix
    export PKGSRC

    PATH=\$PKGSRC/bin:\$PKGSRC/sbin:\$PATH
    export PATH
    MANPATH=\$PKGSRC/man:/usr/share/man
    export MANPATH
    PKGSRC_INCLUDE=\$PKGSRC/include
    export PKGSRC_INCLUDE
    PKGSRC_LIB=\$PKGSRC/lib
    export PKGSRC_LIB
fi
EOM

cat << EOM > ${sys_prefix}/etc/pkgsrc.csh
# Generated by auto-pkgsrc-setup
echo \$PATH | fgrep -q "${install_prefix}/bin:"
if ( \$status != 0 ) then
    setenv PKGSRC           $install_prefix
    
    # Scrub PATH and LD_LIBRARY_PATH before adding pkgsrc to prevent leakage
    # CentOS 7 /bin/gcc fails with cannot find cc1, so put /usr/bin first
    setenv PATH             /usr/bin:/usr/sbin:/bin:/sbin
    unsetenv CC CFLAGS CXX CXXFLAGS CPP CPPFLAGS FC FFLAGS LD LDFLAGS LD_LIBRARY_PATH

    setenv PATH             \$PKGSRC/bin:\$PKGSRC/sbin:\$PATH
    setenv MANPATH          \$PKGSRC/man:/usr/share/man
    setenv PKGSRC_INCLUDE   \$PKGSRC/include
    setenv PKGSRC_LIB       \$PKGSRC/lib
endif
EOM

# Keep this in sync with the script above.  Just remove the scrub lines.
cat << EOM > ${sys_prefix}/etc/pkgsrc-non-exclusive.csh
# Generated by auto-pkgsrc-setup
echo \$PATH | fgrep -q "${install_prefix}/bin:"
if ( \$status != 0 ) then
    setenv PKGSRC           $install_prefix

    setenv PATH             \$PKGSRC/bin:\$PKGSRC/sbin:\$PATH
    setenv MANPATH          \$PKGSRC/man:/usr/share/man
    setenv PKGSRC_INCLUDE   \$PKGSRC/include
    setenv PKGSRC_LIB       \$PKGSRC/lib
endif
EOM

if [ -e /etc/profile.d ]; then
    printf "Add this pkgsrc installation to default path for all users? y/[n] "
    read add2path
    if [ 0$add2path = 0y ]; then
	cp ${sys_prefix}/etc/pkgsrc.*sh /etc/profile.d
    fi
fi

# Generate module files
mkdir -p ${sys_prefix}/etc/modulefiles/pkgsrc

cat << EOM > ${sys_prefix}/etc/modulefiles/pkgsrc/${dist_suffix#-}
#%Module1.0#####################################################################
proc ModulesHelp { } {
    puts stdout "\n\tAll software installed via the pkgsrc package management"
    puts stdout "\tsystem. This module prepends the pkgsrc directories to"
    puts stdout "\tappropriate environment variable(s)."
}

module-whatis   "All software installed via pkgsrc"

set     version         ${dist_suffix#-}
set     install_prefix  ${install_prefix}

# Scrub PATH before adding pkgsrc to prevent leakage during builds
setenv  PATH    /usr/bin:/usr/sbin:/bin:/sbin
unsetenv        CC
unsetenv        CFLAGS
unsetenv        CXX
unsetenv        CXXFLAGS
unsetenv        CPP
unsetenv        CPPFLAGS
unsetenv        FC
unsetenv        FFLAGS
unsetenv        LD
unsetenv        LDFLAGS
unsetenv        LD_LIBRARY_PATH

prepend-path    PATH    \$install_prefix/bin:\$install_prefix/sbin
prepend-path    MANPATH         \$install_prefix/man:/usr/share/man
prepend-path    MODULEPATH      \$install_prefix/etc/modulefiles

setenv          PKGSRC          \$install_prefix
setenv          PKGSRC_INCLUDE  \$install_prefix/include
setenv          PKGSRC_LIB      \$install_prefix/lib
EOM

# Keep this in sync with the script.  Just remove the scrub lines.
cat << EOM > ${sys_prefix}/etc/modulefiles/pkgsrc/${dist_suffix#-}-non-exclusive
#%Module1.0#####################################################################
proc ModulesHelp { } {
    puts stdout "\n\tAll software installed via the pkgsrc package management"
    puts stdout "\tsystem. This module prepends the pkgsrc directories to"
    puts stdout "\tappropriate environment variable(s)."
}

module-whatis   "All software installed via pkgsrc"

puts stderr "\n======================================================================"
puts stderr "WARNING:\n"
puts stderr "pkgsrc/${dist_suffix#-}-non-exclusive allows programs and libraries"
puts stderr "that are not part of this pkgsrc tree or the base system to remain in"
puts stderr "PATH and LD_LIBRARY_PATH.  This may cause some programs to malfunction."
puts stderr "======================================================================\n"

set     version         ${dist_suffix#-}
set     install_prefix  ${install_prefix}

prepend-path    PATH    \$install_prefix/bin:\$install_prefix/sbin
prepend-path    MANPATH         \$install_prefix/man:/usr/share/man
prepend-path    MODULEPATH      \$install_prefix/etc/modulefiles

setenv          PKGSRC          \$install_prefix
setenv          PKGSRC_INCLUDE  \$install_prefix/include
setenv          PKGSRC_LIB      \$install_prefix/lib
EOM

# GCC scripts and modules
for gcc in 48 49 5 6 7 8; do
    cat << EOM > ${sys_prefix}/etc/gcc$gcc.sh
# Generated by auto-pkgsrc-setup
# Assumes pkgsrc already in path
# Use alone only if you know what you're doing
if ! echo \$PATH | fgrep -q "${install_prefix}/gcc$gcc/bin:"; then
    PKGSRC=$install_prefix
    export PKGSRC
    
    PATH=\$PKGSRC/gcc$gcc/bin:\$PATH
    export PATH
    # pkgsrc gcc man pages broken
    # MANPATH=\$PKGSRC/gcc$gcc/man:\$PKGSRC/man:/usr/share/man
    # export MANPATH
    PKGSRC_GCC_INCLUDE=\$PKGSRC/gcc$gcc/include
    export PKGSRC_INCLUDE
    PKGSRC_GCC_LIB=\$PKGSRC/gcc$gcc/lib
    export PKGSRC_LIB
fi
EOM

    cat << EOM > ${sys_prefix}/etc/gcc$gcc.csh
# Generated by auto-pkgsrc-setup
# Assumes pkgsrc already in path
# Use alone only if you know what you're doing
echo \$PATH | fgrep -q "${install_prefix}/gcc$gcc/bin:"
if ( \$status != 0 ) then
    setenv PKGSRC   $install_prefix
    
    setenv PATH                 \$PKGSRC/gcc$gcc/bin:\$PATH
    # pkgsrc gcc man pages broken
    # setenv MANPATH            \$PKGSRC/gcc$gcc/man:\$PKGSRC/man:/usr/share/man
    setenv PKGSRC_GCC_INCLUDE   \$PKGSRC/gcc$gcc/include
    setenv PKGSRC_GCC_LIB       \$PKGSRC/gcc$gcc/lib
endif
EOM

    cat << EOM > ${sys_prefix}/etc/modulefiles/pkgsrc/gcc$gcc
#%Module1.0#####################################################################
proc ModulesHelp { } {
    puts stdout "\n\tpkgsrc gcc$gcc"
    puts stdout "\tThis module prepends the pkgsrc gcc$gcc directories to"
    puts stdout "\tappropriate environment variable(s)."
}

module-whatis   "pkgsrc gcc$gcc"

set     version         ${dist_suffix#-}
set     install_prefix  ${install_prefix}

prepend-path    PATH    \$install_prefix/gcc$gcc/bin
# pkgsrc gcc man pages broken
# prepend-path    MANPATH \$install_prefix/gcc$gcc/man:\$install_prefix/man:/usr/share/man

setenv          PKGSRC_GCC_INCLUDE  \$install_prefix/gcc$gcc/include
setenv          PKGSRC_GCC_LIB      \$install_prefix/gcc$gcc/lib
EOM

done    # for gcc in
if [ ! -z $base_gcc ]; then
    ln -f ${sys_prefix}/etc/$base_gcc.sh ${sys_prefix}/etc/gcc-base.sh
    ln -f ${sys_prefix}/etc/$base_gcc.csh ${sys_prefix}/etc/gcc-base.csh
    ln -f ${sys_prefix}/etc/modulefiles/pkgsrc/$base_gcc \
	${sys_prefix}/etc/modulefiles/pkgsrc/gcc-base
fi

##########################################################################
#   Generate profile.d scripts for updating MODULEPATH
##########################################################################

profile_dir="$sys_prefix/etc/profile.d"
mkdir -p $profile_dir
# Should come alphabetically after modules.sh and modules.csh
module_path_script=modulez`echo $install_prefix | tr '/' '-'`
cat << EOM > $profile_dir/$module_path_script.sh
MODULEPATH=\${MODULEPATH}:$sys_prefix/etc/modulefiles
export MODULEPATH
EOM
cat << EOM > $profile_dir/$module_path_script.csh
setenv MODULEPATH \${MODULEPATH}:$sys_prefix/etc/modulefiles
EOM
chmod 644 $profile_dir/$module_path_script*

# Update PATH for installing packages below
. ${sys_prefix}/etc/pkgsrc.sh

# Basic instructions on installing a package
make=bmake

# Wrap bmake and pkg_add commands
if ! [ -e $install_prefix/bin/bmake.bin ]; then
    mv $install_prefix/bin/bmake $install_prefix/bin/bmake.bin
fi
cat << EOM2 > $install_prefix/bin/bmake
#!/bin/sh -e

if ! pwd | fgrep -q $frameworks_prefix; then
    cat << EOM
    
			    ===== Error =====

You are running \$(which bmake) from the wrong directory.
It should only be used from within $frameworks_prefix.
Load the correct environment module so that you are using the appropriate
bmake for \$(pwd) or go to $frameworks_prefix.

EOM
    exit 1
fi

# Make sure software installed is world-readable on systems with tighter
# default umask.
umask 022
bmake.bin "\$@"
EOM2
# Save a copy in case bmake gets clobbered by pkgin upgrade
# Should move the check into bmake proper so this wrapper is unnecessary
cp $install_prefix/bin/bmake $install_prefix/bin/bmake-wrapper

if ! [ -e $install_prefix/sbin/pkg_add.bin ]; then
    mv $install_prefix/sbin/pkg_add $install_prefix/sbin/pkg_add.bin
fi
cat << EOM > $install_prefix/sbin/pkg_add
#!/bin/sh -e

# Make sure software installed is world-readable on systems with tighter
# default umask.
umask 022
pkg_add.bin \$@
EOM

chmod 755 $install_prefix/bin/bmake $install_prefix/sbin/pkg_add

cat << EOM

============================================================================
The pkgsrc-wip (work in progress) project is a worldwide centralized
repository of packages currently under development.  You can use the
packages here to test the latest features of software or get access to
packages that don't yet exist in the official pkgsrc collection.

You can also contribute your own packages and bug fixes.

EOM
printf "Install pkgsrc-wip? y/[n] "
read install_wip
if [ 0$install_wip = 0y ]; then
    cd $frameworks_prefix
    
    if ! which git; then
	cat << EOM

No git command found.  Skipping pkgsrc-wip install for now.

See https://pkgsrc.org/wip/ for instructions on installing it later.

EOM
	pause
    else
	# git sometimes returns non-zero status when it succeeded
	set +e
	if [ -d wip ]; then
	    printf "pkgsrc-wip alreading installed.\n"
	else
	    cat << EOM

If you have a pkgsrc-wip account, you can use it to check out pkgsrc-wip,
the work-in-progress category of pkgsrc packages.

If not, you can check it out anonymously.  This is the default if you just
press Enter.

EOM

	    # NOTE: This is a duplicate of auto-pkgsrc-wip-checkout.
	    # It is here so that this script can work as a standalone.
	    # Be sure to keep this in sync with the separate script!
	    printf "pkgsrc-wip username? [none] "
	    read username
	    if [ 0$username = 0 ]; then
		git clone git://wip.pkgsrc.org/pkgsrc-wip.git wip
	    else
		git clone $username%wip.pkgsrc.org@localhost:/pkgsrc-wip wip
	    fi
	fi
	set -e
    fi
fi

# Set up package server if necessary
if [ -e /etc/redhat-release ]; then
    release=`cat /etc/redhat-release`
    release=${release%%.*}
    release=${release##*release }
    os=RHEL$release
elif [ $(uname) = Darwin ]; then
    os=$(uname)$(uname -r | cut -d '.' -f 1)
else
    os=$(uname)-$(uname -r)
fi

cat << EOM

============================================================================

UWM provides binary packages for quarterly snapshots under /sharedapps,
e.g. /sharedapps/pkg-2017Q1.

If you know there are binary packages available for

    $install_prefix
    
on

    $os

enter the full web server URL(s) here, e.g.:

    https://mirror1.hpc.uwm.edu
    https://mirror2.hpc.uwm.edu

The default PKG_PATH will be set to

    <URL>/pkgsrc/packages/$install_prefix/$os/All

Edit

    $install_prefix/etc/pkg_install.conf

if this is incorrect.

EOM

cat << EOM

Enter the binary package server name (include http:// or https://), or
just press enter if you won't be using binary packages.

EOM
read package_server
if [ 0$package_server != 0 ]; then
    pkg_path=${pkg_path}$package_server/pkgsrc/packages$install_prefix/$os/All\;
    pkgin_path="${pkgin_path}$package_server/pkgsrc/packages$install_prefix/$os/All\n"
fi

if [ 0$pkg_path != 0 ]; then
    printf "PKG_PATH=$pkg_path\n" >> $install_prefix/etc/pkg_install.conf

    # Install numerous deps to save time
    # SSL is not enabled yet, so override PKG_PATH to be safe
    PKG_PATH=`echo $pkg_path | sed -e 's|https:|http:|g'`
    export PKG_PATH
    pkg_add pkgin
    unset PKG_PATH
    
    # Reinstall libfetch and pkgin from source to enable SSL.
    # mk.conf should contain "PKG_OPTIONS.libfetch=inet6 openssl" by now
    pkg_delete -f libfetch pkgin
    save_cwd=`pwd`
    cd $frameworks_prefix/pkgtools/pkgin
    bmake clean
    bmake clean-depends
    bmake install
    if [ $? = 0 ]; then
	printf "${pkgin_path}" >> $install_prefix/etc/pkgin/repositories.conf
	pkgin update
	cat << EOM

Pkgin initialized successfully.  You can use pkgin to install and remove
binary packages, list available packages, etc.  Run "man pkgin" for details.

EOM
	if [ ! -z $base_gcc ]; then
	    pkgin install -y $base_gcc
	fi
    else
	printf "Failed to install pkgin.\nCheck $install_prefix/etc/pkg_install.conf.\n"
    fi
    cd $save_cwd
    pause
fi

cat << EOM
============================================================================
Users running sh-compatible shells can use the following to configure the
environment for this installation:

    . ${sys_prefix}/etc/pkgsrc.sh

Users running csh-compatible shells can use the following:

    source ${sys_prefix}/etc/pkgsrc.csh

On systems with the "module" command, users can use the following instead
of one of the commands above:

    module load ${sys_prefix}/etc/modulefiles/pkgsrc/${dist_suffix#-}
============================================================================
EOM
pause

cat << EOM
============================================================================
To install a package, type:

    cd $frameworks_prefix/<category>/<package>
    $make install

Ex.
    cd $frameworks_prefix/math/blas
    $make install
============================================================================
EOM
pause

cat << EOM
============================================================================
After setting the environment using one of the commands above, to compile
and link programs using libraries installed by pkgsrc, use:

    -I\$PKGSRC_INCLUDE
    -L\$PKGSRC_LIB

Ex. Assuming your Makefile uses CFLAGS for compiling and LFLAGS for link:

    make CFLAGS="-Wall -g -I\$PKGSRC_INCLUDE" LFLAGS="-L\$PKGSRC_LIB"
============================================================================
For more information, go to http://www.netbsd.org/docs/pkgsrc/
============================================================================
EOM
pause

# Install pkgsrc guide onto desktop
if [ -e $HOME/Desktop ] && [ ! -e $HOME/Desktop/Guides/pkgsrc.pdf ]; then
    mkdir -p $HOME/Desktop/Guides
    cd $HOME/Desktop/Guides
    printf "Fetching manual...\n"
    $fetch_cmd http://www.netbsd.org/docs/pkgsrc/pkgsrc.pdf
    printf "A copy of the pkgsrc guide has been placed on your desktop.\n"
fi

touch $prefix/pkg$install_suffix/done

# Generate bootstrap kit
cd $start_dir
bootstrap_archive=`echo pkgsrc-$os-$compiler$install_prefix.tgz | tr / -`
printf "Creating bootstrap kit: $bootstrap_archive...\n"
tar zcf $bootstrap_archive $install_prefix $frameworks_prefix $sys_prefix || true
cat << EOM

Bootstrap image saved to $bootstrap_archive.

You can unpack this file to / on other identical `uname` systems in order to
quickly replicate this installation.

EOM
# Example /home/bacon/Pkgsrc/pkg/etc/mk.conf file produced by bootstrap-pkgsrc
# Thu Apr  4 14:10:38 CDT 2019

.ifdef BSD_PKG_MK	# begin pkgsrc settings

ABI=			64

UNPRIVILEGED=		yes
PKG_DBDIR=		/home/bacon/Pkgsrc/pkg/pkgdb
LOCALBASE=		/home/bacon/Pkgsrc/pkg
VARBASE=		/home/bacon/Pkgsrc/pkg/var
PKG_TOOLS_BIN=		/home/bacon/Pkgsrc/pkg/sbin
PKGINFODIR=		info
PKGMANDIR=		man


.endif			# end pkgsrc settings

.ifdef BSD_PKG_MK       # Begin auto-pkgsrc-setup customizations

X11_TYPE=		modular
PREFER_NATIVE=		no
PREFER_PKGSRC=		yes
PKGSRC_FORTRAN=		gfortran
PKG_DEVELOPER=		yes
FETCH_USING=		ftp
SKIP_LICENSE_CHECK=	yes
ALLOW_VULNERABLE_PACKAGES=yes
PKG_OPTIONS.libfetch=	inet6 openssl
MAKE_JOBS=		6

.endif   # Pkgsrc customizations

.if \
    empty(PKGPATH:Marchivers/bsdtar) && \
    empty(PKGPATH:Marchivers/bzip2) && \
    empty(PKGPATH:Marchivers/pax) && \
    empty(PKGPATH:Marchivers/xz) && \
    empty(PKGPATH:Mconverters/help2man) && \
    empty(PKGPATH:Mconverters/libiconv) && \
    empty(PKGPATH:Mconverters/p5-Unicode-EastAsianWidth) && \
    empty(PKGPATH:Mdatabases/db4) && \
    empty(PKGPATH:Mdevel/autoconf) && \
    empty(PKGPATH:Mdevel/binutils) && \
    empty(PKGPATH:Mdevel/gettext-lib) && \
    empty(PKGPATH:Mdevel/gettext-tools) && \
    empty(PKGPATH:Mdevel/gmake) && \
    empty(PKGPATH:Mdevel/gmp) && \
    empty(PKGPATH:Mdevel/gtexinfo) && \
    empty(PKGPATH:Mdevel/libffi) && \
    empty(PKGPATH:Mdevel/makedepend) && \
    empty(PKGPATH:Mdevel/pkgconf) && \
    empty(PKGPATH:Mdevel/libtool-base) && \
    empty(PKGPATH:Mdevel/m4) && \
    empty(PKGPATH:Mdevel/ncurses) && \
    empty(PKGPATH:Mdevel/nbpatch) && \
    empty(PKGPATH:Mdevel/p5-CPAN-Meta) && \
    empty(PKGPATH:Mdevel/p5-Module-Build) && \
    empty(PKGPATH:Mdevel/p5-Perl4-CoreLibs) && \
    empty(PKGPATH:Mdevel/p5-Scalar-List-Utils) && \
    empty(PKGPATH:Mdevel/p5-gettext) && \
    empty(PKGPATH:Mdevel/p5-inc-latest) && \
    empty(PKGPATH:Mdevel/readline) && \
    empty(PKGPATH:Mdevel/zlib) && \
    empty(PKGPATH:Mlang/gcc7) && \
    empty(PKGPATH:Mlang/gcc7-libs) && \
    empty(PKGPATH:Mlang/perl5) && \
    empty(PKGPATH:Mlang/python27) && \
    empty(PKGPATH:Mmath/cloog) && \
    empty(PKGPATH:Mmath/isl) && \
    empty(PKGPATH:Mmath/mpcomplex) && \
    empty(PKGPATH:Mmath/mpfr) && \
    empty(PKGPATH:Mmisc/p5-Locale-libintl) && \
    empty(PKGPATH:Mnet/libfetch) && \
    empty(PKGPATH:Mpkgtools/cwrappers) && \
    empty(PKGPATH:Mpkgtools/digest) && \
    empty(PKGPATH:Mpkgtools/pkg_install-info) && \
    empty(PKGPATH:Mpkgtools/pkgin) && \
    empty(PKGPATH:Msecurity/mozilla-rootcerts) && \
    empty(PKGPATH:Msecurity/openssl) && \
    empty(PKGPATH:Msysutils/checkperms) && \
    empty(PKGPATH:Mtextproc/gsed) && \
    empty(PKGPATH:Mtextproc/p5-Text-Unidecode) && \
    empty(PKGPATH:Mx11/xorgproto)

GCC_REQD+=7.0

.endif  # GCC_REQD

# RHEL systems may have an outdated "as" that cannot translate instructions
# from current GCC code generators, so force pkgsrc binutils.
.if exists(/etc/redhat-release) && !empty(PKGPATH:Mlang/gcc*)
CONFIGURE_ARGS+=        --with-gnu-as --with-as=${PREFIX}/bin/gas
CONFIGURE_ARGS+=        --with-gnu-ld --with-ld=${PREFIX}/bin/gld
BUILDLINK_DEPMETHOD.binutils=   full
.  include "../../devel/binutils/buildlink3.mk"
.endif


Home | Main Index | Thread Index | Old Index