16d0b033ca
libstdc++-v3/ChangeLog: * doc/xml/book.txml: Remove trailing whitespace. * doc/xml/chapter.txml: Likewise. * doc/xml/class.txml: Likewise. * doc/xml/gnu/fdl-1.3.xml: Likewise. * doc/xml/gnu/gpl-3.0.xml: Likewise. * doc/xml/manual/abi.xml: Likewise. * doc/xml/manual/algorithms.xml: Likewise. * doc/xml/manual/allocator.xml: Likewise. * doc/xml/manual/appendix_contributing.xml: Likewise. * doc/xml/manual/appendix_free.xml: Likewise. * doc/xml/manual/appendix_porting.xml: Likewise. * doc/xml/manual/atomics.xml: Likewise. * doc/xml/manual/auto_ptr.xml: Likewise. * doc/xml/manual/backwards_compatibility.xml: Likewise. * doc/xml/manual/bitmap_allocator.xml: Likewise. * doc/xml/manual/build_hacking.xml: Likewise. * doc/xml/manual/codecvt.xml: Likewise. * doc/xml/manual/concurrency.xml: Likewise. * doc/xml/manual/concurrency_extensions.xml: Likewise. * doc/xml/manual/configure.xml: Likewise. * doc/xml/manual/containers.xml: Likewise. * doc/xml/manual/ctype.xml: Likewise. * doc/xml/manual/debug.xml: Likewise. * doc/xml/manual/debug_mode.xml: Likewise. * doc/xml/manual/diagnostics.xml: Likewise. * doc/xml/manual/documentation_hacking.xml: Likewise. * doc/xml/manual/evolution.xml: Likewise. * doc/xml/manual/internals.xml: Likewise. * doc/xml/manual/intro.xml: Likewise. * doc/xml/manual/io.xml: Likewise. * doc/xml/manual/iterators.xml: Likewise. * doc/xml/manual/locale.xml: Likewise. * doc/xml/manual/localization.xml: Likewise. * doc/xml/manual/messages.xml: Likewise. * doc/xml/manual/mt_allocator.xml: Likewise. * doc/xml/manual/numerics.xml: Likewise. * doc/xml/manual/parallel_mode.xml: Likewise. * doc/xml/manual/policy_data_structures.xml: Likewise. * doc/xml/manual/prerequisites.xml: Likewise. * doc/xml/manual/shared_ptr.xml: Likewise. * doc/xml/manual/spine.xml: Likewise. * doc/xml/manual/status_cxxtr1.xml: Likewise. * doc/xml/manual/status_cxxtr24733.xml: Likewise. * doc/xml/manual/strings.xml: Likewise. * doc/xml/manual/support.xml: Likewise. * doc/xml/manual/test.xml: Likewise. * doc/xml/manual/test_policy_data_structures.xml: Likewise. * doc/xml/manual/using.xml: Likewise. * doc/xml/manual/using_exceptions.xml: Likewise. * doc/xml/manual/utilities.xml: Likewise. * doc/html/*: Regenerate.
608 lines
21 KiB
XML
608 lines
21 KiB
XML
<section xmlns="http://docbook.org/ns/docbook" version="5.0"
|
|
xml:id="appendix.porting.build_hacking" xreflabel="Build Hacking">
|
|
<?dbhtml filename="build_hacking.html"?>
|
|
|
|
<info><title>Configure and Build Hacking</title>
|
|
<keywordset>
|
|
<keyword>C++</keyword>
|
|
<keyword>build</keyword>
|
|
<keyword>configure</keyword>
|
|
<keyword>hacking</keyword>
|
|
<keyword>version</keyword>
|
|
<keyword>dynamic</keyword>
|
|
<keyword>shared</keyword>
|
|
</keywordset>
|
|
</info>
|
|
|
|
<section xml:id="build_hacking.prereq"><info><title>Prerequisites</title></info>
|
|
|
|
<para>
|
|
As noted <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://gcc.gnu.org/install/prerequisites.html">previously</link>,
|
|
certain other tools are necessary for hacking on files that
|
|
control configure (<code>configure.ac</code>,
|
|
<code>acinclude.m4</code>) and make
|
|
(<code>Makefile.am</code>). These additional tools
|
|
(<code>automake</code>, and <code>autoconf</code>) are further
|
|
described in detail in their respective manuals. All the libraries
|
|
in GCC try to stay in sync with each other in terms of versions of
|
|
the auto-tools used, so please try to play nicely with the
|
|
neighbors.
|
|
</para>
|
|
</section>
|
|
|
|
<section xml:id="build_hacking.overview">
|
|
<info><title>Overview</title></info>
|
|
|
|
<section xml:id="build_hacking.overview.basic">
|
|
<info><title>General Process</title></info>
|
|
|
|
<para>
|
|
The configure process begins the act of building libstdc++, and is
|
|
started via:
|
|
</para>
|
|
|
|
<screen>
|
|
<computeroutput>
|
|
configure
|
|
</computeroutput>
|
|
</screen>
|
|
|
|
<para>
|
|
The <filename>configure</filename> file is a script generated (via
|
|
<command>autoconf</command>) from the file
|
|
<filename>configure.ac</filename>.
|
|
</para>
|
|
|
|
|
|
<para>
|
|
After the configure process is complete,
|
|
</para>
|
|
|
|
<screen>
|
|
<computeroutput>
|
|
make all
|
|
</computeroutput>
|
|
</screen>
|
|
|
|
<para>
|
|
in the build directory starts the build process. The <literal>all</literal> target comes from the <filename>Makefile</filename> file, which is generated via <command>configure</command> from the <filename>Makefile.in</filename> file, which is in turn generated (via
|
|
<command>automake</command>) from the file
|
|
<filename>Makefile.am</filename>.
|
|
</para>
|
|
|
|
</section>
|
|
|
|
|
|
<section xml:id="build_hacking.overview.map"><info><title>What Comes from Where</title></info>
|
|
|
|
|
|
<figure xml:id="fig.build_hacking.deps">
|
|
<title>Configure and Build File Dependencies</title>
|
|
<mediaobject>
|
|
<imageobject>
|
|
<imagedata align="center" format="PDF" scale="75" fileref="../images/confdeps.pdf"/>
|
|
</imageobject>
|
|
<imageobject>
|
|
<imagedata align="center" format="PNG" scale="100" fileref="../images/confdeps.png"/>
|
|
</imageobject>
|
|
<textobject>
|
|
<phrase>Dependency Graph for Configure and Build Files</phrase>
|
|
</textobject>
|
|
</mediaobject>
|
|
</figure>
|
|
|
|
<para>
|
|
Regenerate all generated files by using the command
|
|
<command>autoreconf</command> at the top level of the libstdc++ source
|
|
directory.
|
|
</para>
|
|
</section>
|
|
|
|
</section> <!-- overview -->
|
|
|
|
|
|
<section xml:id="build_hacking.configure">
|
|
<info><title>Configure</title></info>
|
|
|
|
<section xml:id="build_hacking.configure.scripts"><info><title>Storing Information in non-AC files (like configure.host)</title></info>
|
|
|
|
|
|
<para>
|
|
Until that glorious day when we can use <literal>AC_TRY_LINK</literal>
|
|
with a cross-compiler, we have to hardcode the results of what the tests
|
|
would have shown if they could be run. So we have an inflexible
|
|
mess like <filename>crossconfig.m4</filename>.
|
|
</para>
|
|
|
|
<para>
|
|
Wouldn't it be nice if we could store that information in files
|
|
like configure.host, which can be modified without needing to
|
|
regenerate anything, and can even be tweaked without really
|
|
knowing how the configury all works? Perhaps break the pieces of
|
|
<filename>crossconfig.m4</filename> out and place them in their appropriate
|
|
<filename class="directory">config/{cpu,os}</filename> directory.
|
|
</para>
|
|
|
|
<para>
|
|
Alas, writing macros like
|
|
"<code>AC_DEFINE(HAVE_A_NICE_DAY)</code>" can only be done inside
|
|
files which are passed through autoconf. Files which are pure
|
|
shell script can be source'd at configure time. Files which
|
|
contain autoconf macros must be processed with autoconf. We could
|
|
still try breaking the pieces out into "config/*/cross.m4" bits,
|
|
for instance, but then we would need arguments to aclocal/autoconf
|
|
to properly find them all when generating configure. I would
|
|
discourage that.
|
|
</para>
|
|
</section>
|
|
|
|
<section xml:id="build_hacking.configure.conventions"><info><title>Coding and Commenting Conventions</title></info>
|
|
|
|
|
|
<para>
|
|
Most comments should use {octothorpes, shibboleths, hash marks,
|
|
pound signs, whatever} rather than "<literal>dnl</literal>".
|
|
Nearly all comments in <filename>configure.ac</filename> should.
|
|
Comments inside macros written in ancillary
|
|
<filename class="extension">.m4</filename> files should.
|
|
About the only comments which should <emphasis>not</emphasis>
|
|
use <literal>#</literal>, but use <literal>dnl</literal> instead,
|
|
are comments <emphasis>outside</emphasis> our own macros in the ancillary
|
|
files. The difference is that <literal>#</literal> comments show up in
|
|
<filename>configure</filename> (which is most helpful for debugging),
|
|
while <literal>dnl</literal>'d lines just vanish. Since the macros
|
|
in ancillary files generate code which appears in odd places,
|
|
their "outside" comments tend to not be useful while reading
|
|
<filename>configure</filename>.
|
|
</para>
|
|
|
|
<para>
|
|
Do not use any <code>$target*</code> variables, such as
|
|
<varname>$target_alias</varname>. The single exception is in
|
|
<filename>configure.ac</filename>, for automake+dejagnu's sake.
|
|
</para>
|
|
</section>
|
|
|
|
<section xml:id="build_hacking.configure.acinclude"><info><title>The acinclude.m4 layout</title></info>
|
|
|
|
<para>
|
|
The nice thing about
|
|
<filename>acinclude.m4</filename>/<filename>aclocal.m4</filename>
|
|
is that macros aren't
|
|
actually performed/called/expanded/whatever here, just loaded. So
|
|
we can arrange the contents however we like. As of this writing,
|
|
<filename>acinclude.m4</filename> is arranged as follows:
|
|
</para>
|
|
<programlisting>
|
|
GLIBCXX_CHECK_HOST
|
|
GLIBCXX_TOPREL_CONFIGURE
|
|
GLIBCXX_CONFIGURE
|
|
</programlisting>
|
|
<para>
|
|
All the major variable "discovery" is done here.
|
|
<varname>CXX</varname>, multilibs,
|
|
etc.
|
|
</para>
|
|
<programlisting>
|
|
fragments included from elsewhere
|
|
</programlisting>
|
|
<para>
|
|
Right now, "fragments" == "the math/linkage bits".
|
|
</para>
|
|
<programlisting>
|
|
GLIBCXX_CHECK_COMPILER_FEATURES
|
|
GLIBCXX_CHECK_LINKER_FEATURES
|
|
GLIBCXX_CHECK_WCHAR_T_SUPPORT
|
|
</programlisting>
|
|
<para>
|
|
Next come extra compiler/linker feature tests. Wide character
|
|
support was placed here because I couldn't think of another place
|
|
for it. It will probably get broken apart like the math tests,
|
|
because we're still disabling wchars on systems which could actually
|
|
support them.
|
|
</para>
|
|
<programlisting>
|
|
GLIBCXX_CHECK_SETRLIMIT_ancilliary
|
|
GLIBCXX_CHECK_SETRLIMIT
|
|
GLIBCXX_CHECK_S_ISREG_OR_S_IFREG
|
|
GLIBCXX_CHECK_POLL
|
|
GLIBCXX_CHECK_WRITEV
|
|
|
|
GLIBCXX_CONFIGURE_TESTSUITE
|
|
</programlisting>
|
|
<para>
|
|
Feature tests which only get used in one place. Here, things used
|
|
only in the testsuite, plus a couple bits used in the guts of I/O.
|
|
</para>
|
|
<programlisting>
|
|
GLIBCXX_EXPORT_INCLUDES
|
|
GLIBCXX_EXPORT_FLAGS
|
|
GLIBCXX_EXPORT_INSTALL_INFO
|
|
</programlisting>
|
|
<para>
|
|
Installation variables, multilibs, working with the rest of the
|
|
compiler. Many of the critical variables used in the makefiles are
|
|
set here.
|
|
</para>
|
|
<programlisting>
|
|
GLIBGCC_ENABLE
|
|
GLIBCXX_ENABLE_C99
|
|
GLIBCXX_ENABLE_CHEADERS
|
|
GLIBCXX_ENABLE_CLOCALE
|
|
GLIBCXX_ENABLE_CONCEPT_CHECKS
|
|
GLIBCXX_ENABLE_CSTDIO
|
|
GLIBCXX_ENABLE_CXX_FLAGS
|
|
GLIBCXX_ENABLE_C_MBCHAR
|
|
GLIBCXX_ENABLE_DEBUG
|
|
GLIBCXX_ENABLE_DEBUG_FLAGS
|
|
GLIBCXX_ENABLE_LONG_LONG
|
|
GLIBCXX_ENABLE_PCH
|
|
GLIBCXX_ENABLE_SYMVERS
|
|
GLIBCXX_ENABLE_THREADS
|
|
</programlisting>
|
|
<para>
|
|
All the features which can be controlled with enable/disable
|
|
configure options. Note how they're alphabetized now? Keep them
|
|
like that. :-)
|
|
</para>
|
|
<programlisting>
|
|
AC_LC_MESSAGES
|
|
libtool bits
|
|
</programlisting>
|
|
<para>
|
|
Things which we don't seem to use directly, but just has to be
|
|
present otherwise stuff magically goes wonky.
|
|
</para>
|
|
|
|
</section>
|
|
|
|
<section xml:id="build_hacking.configure.enable"><info><title><constant>GLIBCXX_ENABLE</constant>, the <literal>--enable</literal> maker</title></info>
|
|
|
|
|
|
<para>
|
|
All the <literal>GLIBCXX_ENABLE_FOO</literal> macros use a common
|
|
helper, <literal>GLIBCXX_ENABLE</literal>. (You don't have to use
|
|
it, but it's easy.) The helper does two things for us:
|
|
</para>
|
|
|
|
<orderedlist>
|
|
<listitem>
|
|
<para>
|
|
Builds the call to the <literal>AC_ARG_ENABLE</literal> macro, with
|
|
<option>--help</option> text
|
|
properly quoted and aligned. (Death to changequote!)
|
|
</para>
|
|
</listitem>
|
|
<listitem>
|
|
<para>
|
|
Checks the result against a list of allowed possibilities, and
|
|
signals a fatal error if there's no match. This means that the
|
|
rest of the <literal>GLIBCXX_ENABLE_FOO</literal> macro doesn't need to test for
|
|
strange arguments, nor do we need to protect against
|
|
empty/whitespace strings with the <code>"x$foo" = "xbar"</code>
|
|
idiom.
|
|
</para>
|
|
</listitem>
|
|
</orderedlist>
|
|
|
|
<para>Doing these things correctly takes some extra autoconf/autom4te code,
|
|
which made our macros nearly illegible. So all the ugliness is factored
|
|
out into this one helper macro.
|
|
</para>
|
|
|
|
<para>Many of the macros take an argument, passed from when they are expanded
|
|
in configure.ac. The argument controls the default value of the
|
|
enable/disable switch. Previously, the arguments themselves had defaults.
|
|
Now they don't, because that's extra complexity with zero gain for us.
|
|
</para>
|
|
|
|
<para>There are three "overloaded signatures". When reading the descriptions
|
|
below, keep in mind that the brackets are autoconf's quotation characters,
|
|
and that they will be stripped. Examples of just about everything occur
|
|
in acinclude.m4, if you want to look.
|
|
</para>
|
|
|
|
<programlisting>
|
|
GLIBCXX_ENABLE (FEATURE, DEFAULT, HELP-ARG, HELP-STRING)
|
|
GLIBCXX_ENABLE (FEATURE, DEFAULT, HELP-ARG, HELP-STRING, permit a|b|c)
|
|
GLIBCXX_ENABLE (FEATURE, DEFAULT, HELP-ARG, HELP-STRING, SHELL-CODE-HANDLER)
|
|
</programlisting>
|
|
|
|
<itemizedlist>
|
|
<listitem>
|
|
<para>
|
|
<literal>FEATURE</literal> is the string that follows
|
|
<option>--enable</option>. The results of the
|
|
test (such as it is) will be in the variable
|
|
<varname>$enable_FEATURE</varname>,
|
|
where <literal>FEATURE</literal> has been squashed. Example:
|
|
<code>[extra-foo]</code>, controlled by the
|
|
<option>--enable-extra-foo</option>
|
|
option and stored in <varname>$enable_extra_foo</varname>.
|
|
</para>
|
|
</listitem>
|
|
<listitem>
|
|
<para>
|
|
<literal>DEFAULT</literal> is the value to store in
|
|
<varname>$enable_FEATURE</varname> if the user does
|
|
not pass <option>--enable</option>/<option>--disable</option>.
|
|
It should be one of the permitted values passed later.
|
|
Examples: <code>[yes]</code>, or <code>[bar]</code>, or
|
|
<code>[$1]</code> (which passes the argument given to the
|
|
<literal>GLIBCXX_ENABLE_FOO</literal> macro as the default).
|
|
</para>
|
|
<para>
|
|
For cases where we need to probe for particular models of things,
|
|
it is useful to have an undocumented "auto" value here (see
|
|
<literal>GLIBCXX_ENABLE_CLOCALE</literal> for an example).
|
|
</para>
|
|
</listitem>
|
|
<listitem>
|
|
<para>
|
|
<literal>HELP-ARG</literal> is any text to append to the option string
|
|
itself in the <option>--help</option> output. Examples:
|
|
<code>[]</code> (i.e., an empty string, which appends nothing),
|
|
<code>[=BAR]</code>, which produces <code>--enable-extra-foo=BAR</code>,
|
|
and <code>[@<:@=BAR@:>@]</code>, which produces
|
|
<code>--enable-extra-foo[=BAR]</code>. See the difference? See
|
|
what it implies to the user?
|
|
</para>
|
|
<para>
|
|
If you're wondering what that line noise in the last example was,
|
|
that's how you embed autoconf special characters in output text.
|
|
They're called <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.gnu.org/software/autoconf/manual/autoconf.html#Quadrigraphs"><emphasis>quadrigraphs</emphasis></link>
|
|
and you should use them whenever necessary.
|
|
</para>
|
|
</listitem>
|
|
<listitem>
|
|
<para><literal>HELP-STRING</literal> is what you think it is. Do not include the
|
|
"default" text like we used to do; it will be done for you by
|
|
<literal>GLIBCXX_ENABLE</literal>. By convention, these are not full English
|
|
sentences. Example: <literal>[turn on extra foo]</literal>
|
|
</para>
|
|
</listitem>
|
|
</itemizedlist>
|
|
|
|
<para>
|
|
With no other arguments, only the standard autoconf patterns are
|
|
allowed: "<option>--{enable,disable}-foo[={yes,no}]</option>" The
|
|
<varname>$enable_FEATURE</varname> variable is guaranteed to equal
|
|
either "<literal>yes</literal>" or "<literal>no</literal>"
|
|
after the macro. If the user tries to pass something else, an
|
|
explanatory error message will be given, and configure will halt.
|
|
</para>
|
|
|
|
<para>
|
|
The second signature takes a fifth argument, "<code>[permit
|
|
a | b | c | ...]</code>"
|
|
This allows <emphasis>a</emphasis> or <emphasis>b</emphasis> or
|
|
... after the equals sign in the option, and
|
|
<varname>$enable_FEATURE</varname> is
|
|
guaranteed to equal one of them after the macro. Note that if you
|
|
want to allow plain <option>--enable</option>/<option>--disable</option>
|
|
with no "<literal>=whatever</literal>", you must
|
|
include "<literal>yes</literal>" and "<literal>no</literal>" in the
|
|
list of permitted values. Also note that whatever you passed as
|
|
<literal>DEFAULT</literal> must be in the list. If the
|
|
user tries to pass something not on the list, a semi-explanatory
|
|
error message will be given, and configure will halt. Example:
|
|
<code>[permit generic|gnu|ieee_1003.1-2001|yes|no|auto]</code>
|
|
</para>
|
|
|
|
<para>
|
|
The third signature takes a fifth argument. It is arbitrary shell
|
|
code to execute if the user actually passes the enable/disable
|
|
option. (If the user does not, the default is used. Duh.) No
|
|
argument checking at all is done in this signature. See
|
|
<literal>GLIBCXX_ENABLE_CXX_FLAGS</literal> for an example of handling,
|
|
and an error message.
|
|
</para>
|
|
|
|
</section>
|
|
|
|
<section xml:id="build_hacking.configure.version"><info><title>Shared Library Versioning</title></info>
|
|
|
|
<para>
|
|
The <filename class="library">libstdc++.so</filename> shared library must
|
|
be carefully managed to maintain binary compatible with older versions
|
|
of the library. This ensures a new version of the library is still usable by
|
|
programs that were linked against an older version.
|
|
</para>
|
|
|
|
<para>
|
|
Dependent on the target supporting it, the library uses <link
|
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
xlink:href="https://www.akkadia.org/drepper/symbol-versioning">ELF
|
|
symbol versioning</link> for all exported symbols. The symbol versions
|
|
are defined by a <link xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
xlink:href="https://sourceware.org/binutils/docs/ld/VERSION.html">linker
|
|
script</link> that assigns a version to every symbol.
|
|
The set of symbols in each version is fixed when a GCC
|
|
release is made, and must not change after that.
|
|
</para>
|
|
|
|
<para> When new symbols are added to the library they must be added
|
|
to a new symbol version, which must be created the first time new symbols
|
|
are added after a release. Adding a new symbol version involves the
|
|
following steps:
|
|
</para>
|
|
|
|
<itemizedlist>
|
|
<listitem><para>
|
|
Edit <filename>acinclude.m4</filename> to update the "revision" value of
|
|
<varname>libtool_VERSION</varname>, e.g. from <literal>6:22:0</literal>
|
|
to <literal>6:23:0</literal>, which will cause the shared library to be
|
|
built as <filename class="library">libstdc++.so.6.0.23</filename>.
|
|
</para>
|
|
</listitem>
|
|
<listitem><para>
|
|
Regenerate the <filename>configure</filename> script by running the
|
|
<command>autoreconf</command> tool from the correct version of the Autoconf
|
|
package (as dictated by the <link xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
xlink:href="https://gcc.gnu.org/install/prerequisites.html">GCC
|
|
prerequisites</link>).
|
|
</para>
|
|
</listitem>
|
|
<listitem><para>
|
|
Edit the file <filename>config/abi/pre/gnu.ver</filename> to
|
|
add a new version node after the last new node. The node name should be
|
|
<literal>GLIBCXX_3.4.X</literal> where <literal>X</literal> is the new
|
|
revision set in <filename>acinclude.m4</filename>, and the node should
|
|
depend on the previous version e.g.
|
|
<programlisting>
|
|
GLIBCXX_3.4.23 {
|
|
|
|
} GLIBCXX_3.4.22;
|
|
</programlisting>
|
|
For symbols in the ABI runtime, libsupc++, the symbol version naming uses
|
|
<literal>CXXABI_1.3.Y</literal> where <literal>Y</literal> increases
|
|
monotonically with each new version. Again, the new node must depend on the
|
|
previous version node e.g.
|
|
<programlisting>
|
|
CXXABI_1.3.11 {
|
|
|
|
} CXXABI_1.3.10;
|
|
</programlisting>
|
|
</para>
|
|
</listitem>
|
|
<listitem><para>
|
|
In order for the <link linkend="test.run.variations">check-abi</link> test
|
|
target to pass the testsuite must be updated to know about the new symbol
|
|
version(s). Edit the file <filename>testsuite/util/testsuite_abi.cc</filename>
|
|
file to add the new versions to the <varname>known_versions</varname> list,
|
|
and update the checks for the latest versions that set the
|
|
<varname>latestp</varname> variable).
|
|
</para>
|
|
</listitem>
|
|
<listitem><para>
|
|
Add the library (<filename class="library">libstdc++.so.6.0.X</filename>)
|
|
and symbols versions
|
|
(<literal>GLIBCXX_3.4.X</literal> and <literal>CXXABI_1.3.Y</literal>)
|
|
to the <link linkend="abi.versioning.history">History</link> section in
|
|
<filename>doc/xml/manual/abi.xml</filename> at the relevant places.
|
|
</para>
|
|
</listitem>
|
|
</itemizedlist>
|
|
|
|
<para>
|
|
Once the new symbol version has been added you can add the names of your new
|
|
symbols in the new version node:
|
|
<programlisting>
|
|
GLIBCXX_3.4.23 {
|
|
|
|
# basic_string<C, T, A>::_Alloc_hider::_Alloc_hider(C*, A&&)
|
|
_ZNSt7__cxx1112basic_stringI[cw]St11char_traitsI[cw]ESaI[cw]EE12_Alloc_hiderC[12]EP[cw]OS3_;
|
|
|
|
} GLIBCXX_3.4.22;
|
|
</programlisting>
|
|
You can either use mangled names, or demangled names inside an
|
|
<literal>extern "C++"</literal> block. You might find that the new symbol
|
|
matches an existing pattern in an old symbol version (causing the
|
|
<literal>check-abi</literal> test target to fail). If that happens then the
|
|
existing pattern must be adjusted to be more specific so that it doesn't
|
|
match the new symbol.
|
|
</para>
|
|
|
|
<para>
|
|
For an example of these steps, including adjusting old patterns to be less
|
|
greedy, see <link xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
xlink:href="https://gcc.gnu.org/ml/gcc-patches/2016-07/msg01926.html">https://gcc.gnu.org/ml/gcc-patches/2016-07/msg01926.html</link>
|
|
and the attached patch.
|
|
</para>
|
|
|
|
<para>
|
|
If it wasn't done for the last release, you might also need to regenerate
|
|
the <filename>baseline_symbols.txt</filename> file that defines the set
|
|
of expected symbols for old symbol versions. A new baseline file can be
|
|
generated by running <userinput>make new-abi-baseline</userinput> in the
|
|
<filename class="directory"><replaceable>libbuilddir</replaceable>/testsuite</filename>
|
|
directory. Be sure to generate the baseline from a clean build using
|
|
unmodified sources, or you will incorporate your local changes into the
|
|
baseline file.
|
|
</para>
|
|
|
|
</section>
|
|
</section> <!-- configure -->
|
|
|
|
<section xml:id="build_hacking.make"><info><title>Make</title></info>
|
|
|
|
<para>
|
|
The build process has to make all of object files needed for
|
|
static or shared libraries, but first it has to generate some
|
|
include files. The general order is as follows:
|
|
</para>
|
|
|
|
<orderedlist>
|
|
<listitem>
|
|
<para>
|
|
make include files, make pre-compiled headers
|
|
</para>
|
|
</listitem>
|
|
<listitem>
|
|
<para>
|
|
make libsupc++
|
|
</para>
|
|
<para>
|
|
Generates a libtool convenience library,
|
|
<filename>libsupc++convenience</filename> with language-support
|
|
routines. Also generates a freestanding static library,
|
|
<filename>libsupc++.a</filename>.
|
|
</para>
|
|
</listitem>
|
|
<listitem>
|
|
<para>
|
|
make src
|
|
</para>
|
|
<para>
|
|
Generates two convenience libraries, one for C++98 and one for
|
|
C++11, various compatibility files for shared and static
|
|
libraries, and then collects all the generated bits and creates
|
|
the final libstdc++ libraries.
|
|
</para>
|
|
<orderedlist>
|
|
<listitem>
|
|
<para>
|
|
make src/c++98
|
|
</para>
|
|
<para>
|
|
Generates a libtool convenience library,
|
|
<filename>libc++98convenience</filename> with language-support
|
|
routines. Uses the <option>-std=gnu++98</option> dialect.
|
|
</para>
|
|
</listitem>
|
|
<listitem>
|
|
<para>
|
|
make src/c++11
|
|
</para>
|
|
<para>
|
|
Generates a libtool convenience library,
|
|
<filename>libc++11convenience</filename> with language-support
|
|
routines. Uses the <option>-std=gnu++11</option> dialect.
|
|
</para>
|
|
</listitem>
|
|
<listitem>
|
|
<para>
|
|
make src
|
|
</para>
|
|
<para>
|
|
Generates needed compatibility objects for shared and static
|
|
libraries. Shared-only code is seggregated at compile-time via
|
|
the macro <literal>_GLIBCXX_SHARED</literal>.
|
|
</para>
|
|
|
|
<para>
|
|
Then, collects all the generated convenience libraries, adds in
|
|
any required compatibility objects, and creates the final shared
|
|
and static libraries: <filename>libstdc++.so</filename> and
|
|
<filename>libstdc++.a</filename>.
|
|
</para>
|
|
|
|
</listitem>
|
|
</orderedlist>
|
|
</listitem>
|
|
</orderedlist>
|
|
|
|
</section> <!-- make -->
|
|
|
|
</section>
|