Age | Commit message (Collapse) | Author | Files | Lines |
|
This, for example, can be used to link for ARM64EC instead of the
default ARM64:
"config.cxx=cl.exe /arm64EC" config.cc.loptions=/MACHINE:ARM64EC
|
|
|
|
|
|
It is now possible to specify compile option (*.poptions and *.coptions) on
the exe/lib{} targets (we call them "binary-specific compile options"). Such
options are propagated to obj/bmi{} targets that are synthesized for source
prerequisites of the binary. Note that this propagation does not apply to
obj/bmi{} prerequisites. For example:
exe{foo}: cxx{foo} obj{common}
{
cxx.poptions += -DFOO
}
exe{bar}: cxx{bar} obj{common}
{
cxx.poptions += -DBAR
}
obj{common}: cxx{common}
{
cxx.poptions += -DCOMMON
}
In this example, cxx{foo} will be compiled with -DFOO, cxx{bar} -- with
-DBAR, and cxx{common} -- with -DCOMMON.
Note that if a source prerequisite is shared between several binaries, then
the values of the propagated compile options (or their absence) must match.
For instance, the following variant of the above example would result in an
error since cxx{common} would have contradictory cxx.poptions values:
exe{foo}: cxx{foo common}
{
cxx.poptions += -DFOO
}
exe{bar}: cxx{bar common}
{
cxx.poptions += -DBAR
}
As another example, here is how we can rewrite a typical library buildfile
(which requires different macros to distinguish between shared/static builds)
using this mechanism, in this case, to build two libraries in the same scope:
./: lib{foo}: {hxx cxx}{*-foo}
./: lib{bar}: {hxx cxx}{*-bar}
cxx.poptions =+ "-I$out_root" "-I$src_root"
lib{foo}:
{
cxx.poptions += -DFOO
cxx.export.poptions = "-I$out_root" "-I$src_root"
}
liba{foo}:
{
cxx.poptions += -DLIBFOO_STATIC_BUILD
cxx.export.poptions += -DLIBFOO_STATIC
}
libs{foo}:
{
cxx.poptions += -DLIBFOO_SHARED_BUILD
cxx.export.poptions += -DLIBFOO_SHARED
}
lib{bar}:
{
cxx.poptions += -DBAR
cxx.export.poptions = "-I$out_root" "-I$src_root"
}
liba{bar}:
{
cxx.poptions += -DLIBBAR_STATIC_BUILD
cxx.export.poptions += -DLIBBAR_STATIC
}
libs{bar}:
{
cxx.poptions += -DLIBBAR_SHARED_BUILD
cxx.export.poptions += -DLIBBAR_SHARED
}
The exact semantics of this mechanism is as-if the binary-specific compile
options were set on the synthesized obj/bmi{} targets at the end of the
buildfile.
One nuance to keep in mind is that target type/pattern-specific
assign/append/prepend specified for obj/bmi{} will not be in effect for
options specified on lib/exe{}. For example:
cxx.poptions += -DSCOPE
obj{*}: cxx.poptions += -DTARGET
exe{foo}: cxx.poptions += -DFOO
Here the effective cxx.poptions for exe{foo} prerequisites will be
-DSCOPE -DFOO since exe{foo} does not match the obj{*} pattern. As result,
if using this mechanism, remember to include the binary target types in
obj{} patterns. For example:
{obj exe}{*}: cxx.poptions += -DTARGET
|
|
|
|
The split one was just too much of an eye-sore in the logs.
|
|
|
|
|
|
|
|
|
|
Specifically, both the C/C++ compiler and link rules now recognize the
cc.serialize boolean variable which instructs them to compiler/link
serially with regards to any other recipe.
This is primarily useful when compiling large translation units or linking
large binaries that require so much memory that doing that in parallel with
other compilation/linking jobs is likely to summon the OOM killer. For
example:
obj{memory-hog}: cc.serialize = true
|
|
Fixes GH issue #368.
|
|
|
|
|
|
|
|
See comment for the long-term plan.
|
|
This allows us to automatically get the target type-specific behavior
with regards to the out_only semantics (added in the previous commit)
instead of passing it explicitly from each call site.
|
|
Failed that, a C++ link rule cannot match a dependency with S{} prerequisites.
|
|
|
|
|
|
|
|
Specifically, the c module now provides the c.as-cpp submodules which can be
loaded in order to register the S{} target type and enable Assembler with C
Preprocessor compilation in the c compile rule. For details, refer to
"Assembler with C Preprocessor Compilation" in the manual.
|
|
In particular, we were adding -L/usr/local/lib which means it is considered
before built-in directories (/usr/lib, etc) but in our own library search
code we were considering it after (because we were storing it at the end of
sys_lib_dirs).
Now in both sys_{hdr,lib}_dirs we store /usr/local/{include,lib} after mode
and before built-in directories. Note that as part of this fix we now pass
-isystem /usr/local/include instead of -idirafter (which is consistent with
the -L behavior and also the customarily expected semantics).
|
|
This is used by bpkg to detect forwarded configurations without incurring
the full context creation overhead.
|
|
|
|
|
|
If a library does not export any symbols then link.exe skips creating the
import library.
|
|
We used to backlink ad hoc group members both via the group and as individual
members. And for explicit groups it was done only via individual members,
which means it only works correctly if every member is individually updated.
Now both types of groups are backlinked from the group target.
|
|
|
|
|
|
|
|
In particular, we now always print error message on non-0 exit except
in cases where such exit is ignored.
|
|
|
|
|
|
Currently this is implemented for C/C++ compile and link rules.
|
|
|
|
We still always use the public var_pool from context but where required,
all access now goes through scope::var_pool().
|
|
Having -l options for binless (header-only) libraries makes it unusable from
other build systems. But omitting them could make the metadata incomplete (for
example, importable headers), so we omit that as well.
|
|
Specifically, handle the /DEBUG:<value> form in addition to /DEBUG
and recognize /DEBUG:NONE.
|
|
|
|
|
|
|
|
|
|
|
|
For example, this allows a Qt moc rule not to list generated headers
from libQtCore since they are pre-generated by the library.
|
|
Specifically, the output target type may now be omitted for utility
libraries (libul{} and libu[eas]{}). In this case, only "common
interface" options will be returned for lib{} dependencies. This
is primarily useful for obtaining poptions to be passed to tools
other than C/C++ compilers (for example, Qt moc).
|
|
|
|
According to the GNU ld documentation (and painful practical experience),
-rpath does not always imply -rpath-link for cross-linkers.
|
|
|
|
This can be useful for creating "metadata libraries".
|