tech-pkg archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Support GCC runtime
Hi,
Background
==========
SmartOS, and possibly other systems, do not provide a native GCC,
and instead rely on pkgsrc to provide it. Packages which rely on
the GCC runtime (libgcc/libstdc++ etc) thus need to depend upon the
entire GCC package, which is much larger than necessary if all you
want to do is run binaries. This is exacerbated when devel/binutils
is pulled in as well, as is again the case on SmartOS.
Additionally, we would like to support building with an external
compiler but using the pkgsrc runtime. This aids in bulk builds,
when you do not want to depend upon a full gcc package for every
single build (USE_PKGSRC_GCC is broken anyway in this use-case).
Proposal
========
We split gcc47 into separate -compiler and -runtime packages, and
retain a meta package for gcc47 which includes both. Packages can
now depend upon just the -runtime package for _GCC_USE_SHLIB.
In order for an external compiler to be used in conjunction with the
pkgsrc runtime, we introduce a new USE_PKGSRC_GCC_RUNTIME user
variable, which instruments a -specs override to ensure the pkgsrc
runtime is used. It is left to the user to ensure that the external
compiler and the pkgsrc runtime are compatible.
Finally, we add logic to ensure that _USE_GCC_SHLIB=yes is set only
when necessary - previously this was set unconditionally on Solaris,
resulting in the runtime being a dependency even when it wasn't
required. Currently, this is triggered either when USE_LIBTOOL is
enabled, or a new USE_GCC_RUNTIME package variable is set.
The rationale for the above is that we need to cover the case where
shared libraries are being produced. pkgsrc already enables the
runtime based on USE_LANGUAGES, but there is no detection currently
for C-based shared libraries. Thus, USE_LIBTOOL is an easy way to
get the majority of coverage, and USE_GCC_RUNTIME can be set by
packages which produce shared libraries, but do not use libtool (of
which I can only find a handful).
Caveats
=======
This means two builds of gcc, as there doesn't seem to be an easy
way to just build the parts necessary. Multi-packages would be a
huge win here as we are duplicating the entire build twice only to
remove certain bits from the install, is anyone working on this? :)
The USE_LIBTOOL/USE_GCC_RUNTIME stuff isn't particularly clean, but
I don't know of a better way - any ideas?
We need to special case the dependency on the runtime to avoid
packages which themselves are dependencies of the runtime.
Currently this is devel/libtool-base and devel/binutils. The
hardcoding of package paths in mk/compiler/gcc.mk isn't something
I'm proud of, but again I don't know of a better way.
Related to the above, we really could do with fixing USE_PKGSRC_GCC,
as currently it is pretty much useless, given there are many
packages which are dependent of gcc itself, leading to immediate
circular dependencies. Adding a list of dependent packages to an
exclusion would fix it, but even more ugly than above.
Code
====
The current diff is available here:
https://github.com/joyent/pkgsrc/compare/jsonn:trunk...joyent:joyent_gccruntime
Or you can view the files directly via the interface:
https://github.com/joyent/pkgsrc/tree/joyent_gccruntime/lang/gcc47
https://github.com/joyent/pkgsrc/tree/joyent_gccruntime/lang/gcc47-compiler
https://github.com/joyent/pkgsrc/tree/joyent_gccruntime/lang/gcc47-runtime
We've used the above patch (and variations on it) for a while, and it
seems to work well.
Thanks,
--
Jonathan Perkin - Joyent, Inc. - www.joyent.com
Home |
Main Index |
Thread Index |
Old Index