2
0
mirror of https://github.com/boostorg/build.git synced 2026-01-19 04:02:14 +00:00
This commit is contained in:
Rene Rivera
2024-03-10 10:11:04 -05:00
26 changed files with 246 additions and 21 deletions

View File

@@ -2,7 +2,7 @@
BasedOnStyle: WebKit
IndentWidth: 4
TabWidth: 4
UseTab: ForContinuationAndIndentation
UseTab: Never
---
Language: Cpp
AccessModifierOffset: 0

View File

@@ -1,6 +1,35 @@
[[b2.history]]
= History
== Version 5.1.0
This is mostly a bugfix release to account for issues impacting Boost Libraries.
There is one "big" change though. It can be rather difficult to find build
failures when running larger builds. To facilitate figuring out problems the
brief summary output at the end of a build is now less brief. It now includes
a *sorted* list of the targets that got skipped and failed. The output of those
lists mirrors the general skipped/failed items. Hence it's possible to search
for the same strings in the rest of the output quickly.
* *New*: Add listing of failed and skipped targets to end of build summary to
make it easier to find what fails.
-- _René Ferdinand Rivera Morell_
* *New*: Add `mpi.run-flags` to `mpi` toolset that allows for arbitrary flags
applied to running mpi targets. This allows, for example, adding
`--oversubscribe` flag to make it possible to run tests where the tasks are
more than the nodes available.
-- _René Ferdinand Rivera Morell_
* Fix spurious errors when the header scanning tries to scan empty file names.
-- _René Ferdinand Rivera Morell_
* Make C/C++/ObjC include directive scanning pattern more strict to avoid
trying to scan for empty file names.
-- _Andrey Semashev_
* Fix mingw linker commands to always replace backslashes with forward slashes.
-- _Christian Seiler_
* Fix QCC debug build flag. The QCC toolset was using an old, no longer
supported, debug symbols option.
-- _John McFarlane_
== Version 5.0.1
* Fix compile errors for older versions of GCC and Clang toolset for the engine.

View File

@@ -248,6 +248,16 @@ rule search ( name )
{
if [ path.is-rooted $(name) ]
{
# Check for a regular B2 project at an exactly matched registered
# search path location.
for local dir in "$(.search-path.$(name))"
{
local jamfile = [ path.glob $(dir) : $(JAMROOT) $(JAMFILE) ] ;
if $(jamfile)
{
return $(dir) ;
}
}
# Check for a regular B2 project relative to the search path and
# project subdir.
for local dir in "$(.search-path./)"

View File

@@ -9,8 +9,8 @@ import numbers ;
# Mirror engine JAM_VERSION
.major = 5 ;
.minor = 0 ;
.patch = 1 ;
.minor = 1 ;
.patch = 0 ;
rule build ( )

View File

@@ -188,6 +188,7 @@ set B2_SOURCES=%B2_SOURCES% mod_regex.cpp
set B2_SOURCES=%B2_SOURCES% mod_sequence.cpp
set B2_SOURCES=%B2_SOURCES% mod_set.cpp
set B2_SOURCES=%B2_SOURCES% mod_string.cpp
set B2_SOURCES=%B2_SOURCES% mod_summary.cpp
set B2_SOURCES=%B2_SOURCES% mod_sysinfo.cpp
set B2_SOURCES=%B2_SOURCES% mod_version.cpp

View File

@@ -498,6 +498,7 @@ mod_regex.cpp \
mod_sequence.cpp \
mod_set.cpp \
mod_string.cpp \
mod_summary.cpp \
mod_sysinfo.cpp \
mod_version.cpp \
"

View File

@@ -135,6 +135,12 @@ LIST * headers1( LIST * l, OBJECT * file, int rec, b2::regex::program re[] )
}
#endif
if ( file->as_string().size == 0 )
{
/* If the scanning was fed empty file names we just ignore them. */
return l;
}
if ( !( f = fopen( object_str( file ), "r" ) ) )
{
/* No source files will be generated when -n flag is passed */

View File

@@ -53,8 +53,11 @@
#include "output.h"
#include "startup.h"
#include "mod_summary.h"
#include <assert.h>
#include <stdlib.h>
#include <memory>
#if !defined( NT ) || defined( __GNUC__ )
#include <unistd.h> /* for unlink */
@@ -81,6 +84,10 @@ static struct
int32_t made;
} counts[ 1 ];
static std::unique_ptr<b2::summary> make_summary;
static const char * targets_failed = "targets failed";
static const char * targets_skipped = "targets skipped";
/* Target state. */
#define T_STATE_MAKE1A 0 /* make1a() should be called */
#define T_STATE_MAKE1B 1 /* make1b() should be called */
@@ -207,6 +214,9 @@ int32_t make1( LIST * targets )
int32_t status = 0;
memset( (char *)counts, 0, sizeof( *counts ) );
make_summary.reset(new b2::summary);
make_summary->group(targets_failed);
make_summary->group(targets_skipped);
{
LISTITER iter, end;
@@ -247,15 +257,25 @@ int32_t make1( LIST * targets )
clear_state_freelist();
/* Talk about it. */
if ( counts->failed )
out_printf( "...failed updating %d target%s...\n", counts->failed,
counts->failed > 1 ? "s" : "" );
if ( DEBUG_MAKE && counts->skipped )
out_printf( "...skipped %d target%s...\n", counts->skipped,
counts->skipped > 1 ? "s" : "" );
if ( DEBUG_MAKE && counts->made )
out_printf( "...updated %d target%s...\n", counts->made,
{
out_printf( "\n...updated %d target%s...\n", counts->made,
counts->made > 1 ? "s" : "" );
}
if ( DEBUG_MAKE && counts->skipped )
{
out_printf( "\n...skipped %d target%s...\n",
make_summary->count(targets_skipped),
make_summary->count(targets_skipped) > 1 ? "s" : "" );
make_summary->print(targets_skipped, " %s\n");
}
if ( counts->failed )
{
out_printf( "\n...failed updating %d target%s...\n",
make_summary->count(targets_failed),
make_summary->count(targets_failed) > 1 ? "s" : "" );
make_summary->print(targets_failed, " %s\n");
}
/* If we were interrupted, exit now that all child processes
have finished. */
@@ -425,6 +445,7 @@ static void make1b( state * const pState )
if ( ( t->status == EXEC_CMD_FAIL ) && t->actions )
{
++counts->skipped;
make_summary->message(targets_skipped, object_str( t->name ));
if ( ( t->flags & ( T_FLAG_RMOLD | T_FLAG_NOTFILE ) ) == T_FLAG_RMOLD )
{
if ( !unlink( object_str( t->boundname ) ) )
@@ -432,8 +453,10 @@ static void make1b( state * const pState )
);
}
else
{
out_printf( "...skipped %s for lack of %s...\n", object_str( t->name ),
failed_name );
}
}
if ( t->status == EXEC_CMD_OK )
@@ -941,6 +964,13 @@ static void make1c_closure
out_printf( "...failed %s ", object_str( cmd->rule->name ) );
list_print( lol_get( (LOL *)&cmd->args, 0 ) );
out_printf( "...\n" );
std::string m = object_str( cmd->rule->name );
for (auto i: b2::list_cref(lol_get( (LOL *)&cmd->args, 0 )))
{
m += " ";
m += i->str();
}
make_summary->message(targets_failed, m.c_str());
}
/* On interrupt, set quit so _everything_ fails. Do the same for failed

View File

@@ -0,0 +1,40 @@
/*
Copyright 2024 René Ferdinand Rivera Morell
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE.txt or https://www.bfgroup.xyz/b2/LICENSE.txt)
*/
#include "mod_summary.h"
#include "output.h"
namespace b2 {
void summary::group(value_ref group)
{
group_order.push_back(group);
groups.emplace(group, group_t(new group_t::element_type));
}
void summary::message(value_ref group, value_ref message)
{
groups[group]->push_back(message);
}
int summary::count(value_ref group) { return (int)(groups[group]->size()); }
void summary::print(value_ref group, value_ref format)
{
std::string format_str = format;
auto & g = groups[group];
std::sort(g->begin(), g->end(), [](value_ref a, value_ref b) -> bool {
return std::strcmp(a->str(), b->str()) < 0;
});
for (auto const & m : *g)
{
std::string m_str = m;
out_printf(format->str(), m_str.c_str());
}
}
} // namespace b2

60
src/engine/mod_summary.h Normal file
View File

@@ -0,0 +1,60 @@
/*
Copyright 2024 René Ferdinand Rivera Morell
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE.txt or https://www.bfgroup.xyz/b2/LICENSE.txt)
*/
#ifndef B2_MOD_SUMMARY_H
#define B2_MOD_SUMMARY_H
#include "config.h"
#include "bind.h"
#include "value.h"
#include <memory>
#include <unordered_map>
#include <vector>
namespace b2 {
class summary : public object
{
public:
void group(value_ref group);
void message(value_ref group, value_ref message);
int count(value_ref group);
void print(value_ref group, value_ref format);
private:
using group_t = std::unique_ptr<std::vector<value_ref>>;
using groups_t = std::unordered_map<value_ref,
group_t,
value_ref::hash_function,
value_ref::equal_function>;
groups_t groups;
std::vector<value_ref> group_order;
};
struct summary_module : b2::bind::module_<summary_module>
{
const char * module_name = "summary";
template <class Binder>
void def(Binder & binder)
{
binder.def_class("summary", type_<summary>())
.def(init_<>())
.def(&summary::group, "group", "group" * _1)
.def(&summary::message, "message", "group" * _1,
"message" * _1n)
.def(&summary::count, "count", "group" * _1)
.def(&summary::print, "print", "group" * _1,
"format" * _1);
}
};
} // namespace b2
#endif

View File

@@ -13,5 +13,5 @@ https://www.bfgroup.xyz/b2/LICENSE.txt)
*/
#define VERSION_MAJOR 5
#define VERSION_MINOR 0
#define VERSION_PATCH 1
#define VERSION_MINOR 1
#define VERSION_PATCH 0

View File

@@ -1033,12 +1033,12 @@ rule link.dll ( targets * : sources * : properties * )
actions link bind LIBRARIES
{
"$(CONFIG_COMMAND)" @($(<[1]:T).rsp:O=FC:<=@":>=":E=-L"$(LINKPATH)" -Wl,$(RPATH_OPTION)$(SPACE)-Wl,$(RPATH) -Wl,-rpath-link$(SPACE)-Wl,"$(RPATH_LINK)" -o "$(<)" $(START-GROUP) "$(>:T)" "$(LIBRARIES)" $(FINDLIBS-ST-PFX) -l$(FINDLIBS-ST) $(FINDLIBS-SA-PFX) -l$(FINDLIBS-SA) $(END-GROUP) $(OPTIONS) $(USER_OPTIONS))
"$(CONFIG_COMMAND)" @($(<[1]:T).rsp:O=FC:<=@":>=":E=-L"$(LINKPATH)" -Wl,$(RPATH_OPTION)$(SPACE)-Wl,$(RPATH) -Wl,-rpath-link$(SPACE)-Wl,"$(RPATH_LINK)" -o "$(<:T)" $(START-GROUP) "$(>:T)" "$(LIBRARIES)" $(FINDLIBS-ST-PFX) -l$(FINDLIBS-ST) $(FINDLIBS-SA-PFX) -l$(FINDLIBS-SA) $(END-GROUP) $(OPTIONS) $(USER_OPTIONS))
}
actions link.dll bind LIBRARIES
{
"$(CONFIG_COMMAND)" @($(<[1]:T).rsp:O=FC:<=@":>=":E=-L"$(LINKPATH)" -Wl,$(RPATH_OPTION)$(SPACE)-Wl,$(RPATH) -Wl,$(IMPLIB_OPTION:E=--out-implib),"$(<[2])" -o "$(<[1])" $(HAVE_SONAME)-Wl,$(SONAME_OPTION)$(SPACE)-Wl,"$(SONAME_PREFIX:E=)$(<[1]:D=)" $(SHARED_OPTION:E=-shared) $(START-GROUP) "$(>:T)" "$(LIBRARIES)" $(FINDLIBS-ST-PFX) -l$(FINDLIBS-ST) $(FINDLIBS-SA-PFX) -l$(FINDLIBS-SA) $(END-GROUP) $(OPTIONS) $(USER_OPTIONS))
"$(CONFIG_COMMAND)" @($(<[1]:T).rsp:O=FC:<=@":>=":E=-L"$(LINKPATH)" -Wl,$(RPATH_OPTION)$(SPACE)-Wl,$(RPATH) -Wl,$(IMPLIB_OPTION:E=--out-implib),"$(<[2]:T)" -o "$(<[1]:T)" $(HAVE_SONAME)-Wl,$(SONAME_OPTION)$(SPACE)-Wl,"$(SONAME_PREFIX:E=)$(<[1]:D=)" $(SHARED_OPTION:E=-shared) $(START-GROUP) "$(>:T)" "$(LIBRARIES)" $(FINDLIBS-ST-PFX) -l$(FINDLIBS-ST) $(FINDLIBS-SA-PFX) -l$(FINDLIBS-SA) $(END-GROUP) $(OPTIONS) $(USER_OPTIONS))
}
###

View File

@@ -66,6 +66,8 @@ import toolset ;
import type ;
import path ;
feature mpi.run-flags : : free incidental ;
# Make this module a project
project.initialize $(__name__) ;
project mpi ;
@@ -622,6 +624,8 @@ toolset.uses-features mpi.capture-output :
<testing.launcher> <testing.execute> <dll-path> <xdll-path> <target-os>
<mpi:processes> ;
toolset.flags mpi.capture-output RUN_FLAGS <mpi.run-flags> ;
rule capture-output ( target : sources * : properties * )
{
# Use the standard capture-output rule to run the tests
@@ -636,7 +640,7 @@ rule capture-output ( target : sources * : properties * )
# We launch MPI processes using the "mpirun" equivalent specified by the user.
LAUNCHER on $(target) =
[ on $(target) return $(.mpirun) $(.mpirun_flags) $(num_processes) ] ;
[ on $(target) return $(.mpirun) $(RUN_FLAGS) $(.mpirun_flags) $(num_processes) ] ;
}
# Creates a set of test cases to be run through the MPI launcher. The name, sources,

View File

@@ -88,7 +88,7 @@ local rule check-target-platform
}
# Declare flags for compilation.
toolset.flags qcc.compile OPTIONS <debug-symbols>on : -gstabs+ ;
toolset.flags qcc.compile OPTIONS <debug-symbols>on : -g ;
# Declare flags and action for compilation.
toolset.flags qcc.compile OPTIONS <optimization>off : -O0 ;
@@ -215,7 +215,7 @@ generators.register [ new qcc-linking-generator qcc.link.dll : LIB OBJ
# Declare flags for linking.
# First, the common flags.
toolset.flags qcc.link OPTIONS <debug-symbols>on : -gstabs+ ;
toolset.flags qcc.link OPTIONS <debug-symbols>on : -g ;
toolset.flags qcc.link OPTIONS <profiling>on : -p ;
toolset.flags qcc.link OPTIONS <linkflags> ;
toolset.flags qcc.link LINKPATH <library-path> ;

View File

@@ -30,7 +30,7 @@ class c-scanner : scanner
rule pattern ( )
{
return "#[ \t]*include[ \t]*(<(.*)>|\"(.*)\")" ;
return "^[ \t]*#[ \t]*include[ \t]*(<(.+)>|\"(.+)\")" ;
}
rule process ( target : matches * : binding )

View File

@@ -14,7 +14,7 @@ class objc-scanner : c-scanner
rule pattern ( )
{
return "#[ \t]*include|import[ ]*(<(.*)>|\"(.*)\")" ;
return "^[ \t]*#[ \t]*include|import[ ]*(<(.+)>|\"(.+)\")" ;
}
}

View File

@@ -49,12 +49,14 @@ echo [subtest_b] 2
[subtest_b] 0
[subtest_b] 1
[subtest_b] 2
...updated 2 targets...
""")
t.run_build_system(["-ffile.jam", "-d1"], stdout="""\
...found 4 targets...
...updating 2 targets...
...updated 2 targets...
""")

View File

@@ -49,7 +49,10 @@ t.run_build_system(["-ffile.jam", "-d1", "-sPYTHON=" + sys.executable], status=1
t.expect_output_lines([
"...failed run test-raw-fail...",
"0,1,2",
"",
"...updated 2 targets...",
"",
"...failed updating 1 target...",
"...updated 2 targets..."])
" run test-raw-fail"])
t.cleanup()

View File

@@ -40,6 +40,7 @@ update x1
updating x1 x2
update x2
updating x2 x3
...updated 3 targets...
""")
@@ -59,6 +60,7 @@ update x1
updating x1 x2
update x2
updating x2 x3
...updated 3 targets...
""")
@@ -96,8 +98,11 @@ failed x1
...failed fail x1...
update x2
updating x2
...failed updating 2 targets...
...updated 1 target...
...failed updating 1 target...
fail x1
""")
# Make sure that dependencies of targets that are
@@ -124,6 +129,7 @@ update x2
updating x2
update x2
updating x2 x3
...updated 3 targets...
""")
@@ -147,6 +153,7 @@ t.run_build_system(["-ffile.jam", "x1"], stdout="""\
...updating 2 targets...
update x1
updating x1 x2
...updated 2 targets...
""")
@@ -164,6 +171,7 @@ t.run_build_system(["-ffile.jam", "x1"], stdout="""\
...updating 1 target...
update x1
updating x1 x1
...updated 1 target...
""")
@@ -194,6 +202,7 @@ update x3
updating x3 x4 : s4
update x4
updating x4 x3 : s5
...updated 4 targets...
""")

View File

@@ -49,6 +49,7 @@ echo [subtest_b] 2
[subtest_b] 0
[subtest_b] 1
[subtest_b] 2
...updated 2 targets...
""")

View File

@@ -44,6 +44,7 @@ echo [subtest_b] 0
echo [subtest_b] 1
echo [subtest_b] 2
...updated 2 targets...
""")
t.expect_nothing_more()

View File

@@ -97,6 +97,7 @@ sleeper 4.b
[.b] 0
[.b] 1
[.b] 2
...updated 8 targets...
""")

View File

@@ -72,6 +72,7 @@ t.run_build_system(["-ffile.jam", "-j2"], stdout="""\
003
.use.2 u2.user
004
...updated 4 targets...
""")

View File

@@ -65,6 +65,7 @@ link dll
001 - linked
install installed_dll
002 - installed
...updated 3 targets...
""")

View File

@@ -31,6 +31,7 @@ DEPENDS all : target1 ;
...updating 1 target...
do-print target1
updating target1
...updated 1 target...
...found 1 target...
""")
@@ -64,6 +65,7 @@ do-print target1
echo updating target1
updating target1
...updated 1 target...
...found 1 target...
""")
@@ -106,13 +108,16 @@ fail target1
exit 1
...failed fail target1...
...failed updating 1 target...
fail target1
...found 2 targets...
...updating 1 target...
do-print target2
echo updating target2
...updated 1 target...
""")
@@ -181,12 +186,14 @@ do-print target1
echo updating target1
...updated 1 target...
do-print target1
echo updating target1
updating target1
...updated 1 target...
...found 1 target...
""")
@@ -225,7 +232,9 @@ fail target1
exit 1
...failed fail target1...
...failed updating 1 target...
fail target1
update1:
update2:
...found 1 target...
@@ -283,7 +292,10 @@ fail target2
exit 1
...failed fail target2...
...failed updating 2 targets...
fail target1
fail target2
...found 2 targets...
...updating 2 targets...
fail target3
@@ -294,6 +306,7 @@ fail target4
exit 1
...updated 2 targets...
''')
@@ -305,7 +318,9 @@ fail target1
exit 1
...failed fail target1...
...failed updating 1 target...
fail target1
...found 2 targets...
...updating 2 targets...
fail target3
@@ -313,7 +328,9 @@ fail target3
exit 1
...failed fail target3...
...failed updating 1 target...
fail target3
''')
t.run_build_system(['-n', '-sIGNORE_MINUS_Q=1', '-ffile.jam'],
@@ -327,6 +344,7 @@ fail target2
exit 1
...updated 2 targets...
...found 2 targets...
...updating 2 targets...
@@ -338,6 +356,7 @@ fail target4
exit 1
...updated 2 targets...
''')
@@ -354,7 +373,10 @@ fail target2
exit 1
...failed fail target2...
...failed updating 2 targets...
fail target1
fail target2
...found 2 targets...
...updating 2 targets...
fail target3
@@ -362,7 +384,9 @@ fail target3
exit 1
...failed fail target3...
...failed updating 1 target...
fail target3
''')
t.cleanup()

View File

@@ -82,6 +82,7 @@ make bar : baz ;
make bar
time foo
bar +user: [0-9.]+ +system: +[0-9.]+ +clock: +[0-9.]+ *
\\.\\.\\.updated 2 targets\\.\\.\\.$
"""