mirror of
https://github.com/Zeckmathederg/glfs.git
synced 2025-01-24 15:12:11 +08:00
Start to document some of the differences in cmake and ninja.
git-svn-id: svn://svn.linuxfromscratch.org/BLFS/trunk/BOOK@21415 af4574ff-66df-0310-9fd7-8a98e5e911e0
This commit is contained in:
parent
5a8f4f1e63
commit
ab8c10c897
@ -1,12 +1,12 @@
|
|||||||
<!-- $LastChangedBy$ $Date$ -->
|
<!-- $LastChangedBy$ $Date$ -->
|
||||||
|
|
||||||
<!ENTITY day "29"> <!-- Always 2 digits -->
|
<!ENTITY day "30"> <!-- Always 2 digits -->
|
||||||
<!ENTITY month "03"> <!-- Always 2 digits -->
|
<!ENTITY month "03"> <!-- Always 2 digits -->
|
||||||
<!ENTITY year "2019">
|
<!ENTITY year "2019">
|
||||||
<!ENTITY copyrightdate "2001-&year;">
|
<!ENTITY copyrightdate "2001-&year;">
|
||||||
<!ENTITY copyholder "The BLFS Development Team">
|
<!ENTITY copyholder "The BLFS Development Team">
|
||||||
<!ENTITY version "&year;-&month;-&day;">
|
<!ENTITY version "&year;-&month;-&day;">
|
||||||
<!ENTITY releasedate "March 29th, &year;">
|
<!ENTITY releasedate "March 30th, &year;">
|
||||||
<!ENTITY pubdate "&year;-&month;-&day;"> <!-- metadata req. by TLDP -->
|
<!ENTITY pubdate "&year;-&month;-&day;"> <!-- metadata req. by TLDP -->
|
||||||
<!ENTITY blfs-version "svn"> <!-- svn|[release #] -->
|
<!ENTITY blfs-version "svn"> <!-- svn|[release #] -->
|
||||||
<!ENTITY lfs-version "development"> <!-- x.y|development -->
|
<!ENTITY lfs-version "development"> <!-- x.y|development -->
|
||||||
|
@ -453,4 +453,190 @@ chmod 755 blfs-yes-test2</userinput></screen>
|
|||||||
|
|
||||||
</sect2>
|
</sect2>
|
||||||
-->
|
-->
|
||||||
|
<sect2 id="buildsystems">
|
||||||
|
<title>Working with different build systems</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
There are now three different build systems in common use for
|
||||||
|
converting C or C++ source code into compiled programs or
|
||||||
|
libraries, and their details (particularly, finding out about available
|
||||||
|
options and their default values) differ. It may be easiest to understand
|
||||||
|
the issues caused by some choices (typically, slow execution, or
|
||||||
|
unexpected use of, or omission of, optimizatons) by starting with the item
|
||||||
|
which drew attention to this, the CFLAGS and CXXFLAGS.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Most LFS and BLFS builders are probably aware of the basics of CFLAGS
|
||||||
|
and CXXFLAGS for altering how a program is compiled. Typically, some
|
||||||
|
form of optimization is used for a released program (-O2 or -O3),
|
||||||
|
sometimes with the creation of debug symbols (-g) when using -O2.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
If there are contradictory flags (e.g. multiple different -O values),
|
||||||
|
the <emphasis>last</emphasis> value will be used. Sometimes this means
|
||||||
|
that flags specifiedi in environment variables will be picked up before
|
||||||
|
values hardcoded in the Makefile, and therefore ignored. For example,
|
||||||
|
where a user specifies '-O2' and that is followed by '-O3' the build will
|
||||||
|
use '-O3'.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
There are various other things which can be passed in CFLAGS or
|
||||||
|
CXXFLAGS, such as forcing compilation for a specific microarchitecture
|
||||||
|
(e.g. -march=amdfam10, -march=native) or specifying a specific standard
|
||||||
|
for C or C++ (-std=c++17 for example). But one thing which has now come
|
||||||
|
to light is that programmers might include debug assertions in their
|
||||||
|
code, expecting them to be disabled in releases by using -DNDEBUG.
|
||||||
|
Specifically, if <xref linkend="mesa"/> is built with these assertions
|
||||||
|
enabled, some activities such as loading levels of games can take
|
||||||
|
extremely long times, even on high-class video cards.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<bridgehead renderas="sect3">Autotools with Make</bridgehead>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
This combination is often described as 'CMMI' (configure, make, make
|
||||||
|
install) and is used here to also cover the few packages which have a
|
||||||
|
configure script that is not generated by autotools.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Sometimes, running <command>./configure --help</command> will produce
|
||||||
|
useful options about switches which might be used. At other times,
|
||||||
|
after looking at the output from a run of configure you may need to look
|
||||||
|
at the details of the script to find out what it was actually searching
|
||||||
|
for.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Many configure scripts will pick up any CFLAGS or CXXFLAGS from the
|
||||||
|
environment, but CMMI packages vary about how these will be mixed with
|
||||||
|
any flags which would otherwise be used (<emphasis>variously</emphasis>:
|
||||||
|
ignored, used to replace the programmer's suggestion, used before the
|
||||||
|
programmer's suggestion, used after the programmer's suggestion).
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
In most CMMI packages, running 'make' will list each command and run
|
||||||
|
it, interspersed with any warnings. But some packages try to be 'silent'
|
||||||
|
and only show which file they are compiling or linking instead of showing
|
||||||
|
the command line. If you need to inspect the command, either because of
|
||||||
|
an error, or just to see what options and flags are being used, adding
|
||||||
|
'V=1' to the make invocation may help.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<bridgehead renderas="sect3">CMake</bridgehead>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
CMake works in a very different way, and it has two backends which can
|
||||||
|
be used on BLFS: 'make' and 'ninja'. The default backend is make, but
|
||||||
|
ninja can be faster on large packages with multiple processors. To
|
||||||
|
use ninja, specify '-G Ninja' in the cmake command.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
The hardest part of using CMake is knowing what options you might wish
|
||||||
|
to specify. The only way to get a list of what the package knows about
|
||||||
|
is to run <command>cmake -LAH</command> and look at the output for that
|
||||||
|
default configuration.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Perhaps the most-important thing about CMake is that it has a variety
|
||||||
|
of CMAKE_BUILD_TYPE values, and these affect the flags. The default
|
||||||
|
is that this is not set and no flags are generated. Any CFLAGS or
|
||||||
|
CXXFLAGS in the environment will be used. If the programmer has coded
|
||||||
|
any debug assertions, those will be enabled unless -DNDEBUG is used.
|
||||||
|
The following CMAKE_BUILD_TYPE values will generate the flags shown,
|
||||||
|
and these will come <emphasis>after</emphasis> any flags in the
|
||||||
|
environment and therefore take precedence.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>Debug : '-g'</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>Release : '-O3 -DNDEBUG'</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>RelWithDebInfo : '-O2 -g -DNDEBUG'</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>MinSizeRel : '-Os -DNDEBUG'</para>
|
||||||
|
</listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
CMake tries to produce quiet builds. To see the details of the commands
|
||||||
|
which are being run, use 'make VERBOSE=1' or 'ninja -v'.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<bridgehead renderas="sect3">Meson</bridgehead>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Meson has some similarities to CMake, but many differences. To get
|
||||||
|
details of the definesthat you may wish to change is slightly involved
|
||||||
|
using meson-0.49.2:
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<screen><userinput>meson ..
|
||||||
|
meson configure | less</userinput></screen>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
After identifying what to set, meson then needs to be reconfigured:
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<screen><userinput>meson --prefix=/usr -Dsome_option=true -Dother_option=false --reconfigure</userinput></screen>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Alternatively, you could remove the build directory where you did this,
|
||||||
|
recreate it, and then run meson with the desired switches.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Meson provides the following buildtype values, and the flags they enable
|
||||||
|
come <emphasis>after</emphasis> any flags supplied in the environment and
|
||||||
|
therefore take precedence.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>plain : no added flags. This is for distributors to supply their
|
||||||
|
own CLFAGS, CXXFLAGS and LDFLAGS. There is no obvious reason to use
|
||||||
|
this in BLFS.</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>debug : '-g'</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>debugoptimized : '-O2 -g' - this is the default if nothing is
|
||||||
|
specified, it leaves assertions enabled.</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>release : '-O3 -DNDEBUG'</para>
|
||||||
|
</listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Although the release buildtype is described as enabling -DNDEBUG, and all
|
||||||
|
CMake Release builds pass that, it has so far only been observed (in
|
||||||
|
verbose builds) for <xref linkend="mesa"/>. That suggests that it might
|
||||||
|
only be used when there are debug assertions present.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
The -DNDEBUG flag can also be provided by passing
|
||||||
|
<command>-Db_ndebug=true</command>.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
To see the details of the commands which are being run in a package using
|
||||||
|
meson, again use 'ninja -v'.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
</sect2>
|
||||||
|
|
||||||
</sect1>
|
</sect1>
|
||||||
|
@ -41,6 +41,17 @@
|
|||||||
</itemizedlist>
|
</itemizedlist>
|
||||||
</listitem>
|
</listitem>
|
||||||
-->
|
-->
|
||||||
|
<listitem>
|
||||||
|
<para>March 29th, 2019</para>
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>[ken] - Add "Working with different build systems" to the end of
|
||||||
|
"Notes on Building Software", to start to document some of the
|
||||||
|
differences in CMake and Meson.</para>
|
||||||
|
</listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
</listitem>
|
||||||
|
|
||||||
<listitem>
|
<listitem>
|
||||||
<para>March 29th, 2019</para>
|
<para>March 29th, 2019</para>
|
||||||
<itemizedlist>
|
<itemizedlist>
|
||||||
|
Loading…
Reference in New Issue
Block a user