forked from gentoo/gentoo
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
sys-devel/make: Revbump to add upstream fix for bug #583812.
Package-Manager: portage-2.2.28 Signed-off-by: Lars Wendler <[email protected]>
- Loading branch information
Lars Wendler
committed
May 31, 2016
1 parent
a922a26
commit ab5370f
Showing
3 changed files
with
240 additions
and
0 deletions.
There are no files selected for viewing
164 changes: 164 additions & 0 deletions
164
sys-devel/make/files/make-4.2-double_colon_targets.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,164 @@ | ||
From 4762480ae9cb8df4878286411f178d32db14eff0 Mon Sep 17 00:00:00 2001 | ||
From: Paul Smith <[email protected]> | ||
Date: Tue, 31 May 2016 06:56:51 +0000 | ||
Subject: [SV 47995] Ensure forced double-colon rules work with -j. | ||
|
||
The fix for SV 44742 had a side-effect that some double-colon targets | ||
were skipped. This happens because the "considered" facility assumed | ||
that all targets would be visited on each walk through the dependency | ||
graph: we used a bit for considered and toggled it on each pass; if | ||
we didn't walk the entire graph on every pass the bit would get out | ||
of sync. The new behavior after SV 44742 might return early without | ||
walking the entire graph. To fix this I changed the considered value | ||
to an integer which is monotonically increasing: it is then never | ||
possible to incorrectly determine that a previous pass through the | ||
graph already considered the current target. | ||
|
||
* filedef.h (struct file): make CONSIDERED an unsigned int. | ||
* main.c (main): No longer need to reset CONSIDERED. | ||
* remake.c (update_goal_chain): increment CONSIDERED rather than | ||
inverting it between 0<->1. | ||
(update_file_1): Reset CONSIDERED to 0 so it's re-considered. | ||
(check_dep): Ditto. | ||
* tests/scripts/features/double_colon: Add a regression test. | ||
--- | ||
diff --git a/filedef.h b/filedef.h | ||
index 507a027..14b4187 100644 | ||
--- a/filedef.h | ||
+++ b/filedef.h | ||
@@ -58,6 +58,8 @@ struct file | ||
FILE_TIMESTAMP last_mtime; /* File's modtime, if already known. */ | ||
FILE_TIMESTAMP mtime_before_update; /* File's modtime before any updating | ||
has been performed. */ | ||
+ unsigned int considered; /* equal to 'considered' if file has been | ||
+ considered on current scan of goal chain */ | ||
int command_flags; /* Flags OR'd in for cmds; see commands.h. */ | ||
enum update_status /* Status of the last attempt to update. */ | ||
{ | ||
@@ -96,8 +98,6 @@ struct file | ||
unsigned int ignore_vpath:1;/* Nonzero if we threw out VPATH name. */ | ||
unsigned int pat_searched:1;/* Nonzero if we already searched for | ||
pattern-specific variables. */ | ||
- unsigned int considered:1; /* equal to 'considered' if file has been | ||
- considered on current scan of goal chain */ | ||
unsigned int no_diag:1; /* True if the file failed to update and no | ||
diagnostics has been issued (dontcare). */ | ||
}; | ||
diff --git a/main.c b/main.c | ||
index 576f2e9..e606488 100644 | ||
--- a/main.c | ||
+++ b/main.c | ||
@@ -2262,10 +2262,6 @@ main (int argc, char **argv, char **envp) | ||
|
||
for (i = 0, d = read_files; d != 0; ++i, d = d->next) | ||
{ | ||
- /* Reset the considered flag; we may need to look at the file | ||
- again to print an error. */ | ||
- d->file->considered = 0; | ||
- | ||
if (d->file->updated) | ||
{ | ||
/* This makefile was updated. */ | ||
diff --git a/remake.c b/remake.c | ||
index df1a9e0..5d5d67a 100644 | ||
--- a/remake.c | ||
+++ b/remake.c | ||
@@ -57,8 +57,9 @@ unsigned int commands_started = 0; | ||
static struct goaldep *goal_list; | ||
static struct dep *goal_dep; | ||
|
||
-/* Current value for pruning the scan of the goal chain (toggle 0/1). */ | ||
-static unsigned int considered; | ||
+/* Current value for pruning the scan of the goal chain. | ||
+ All files start with considered == 0. */ | ||
+static unsigned int considered = 0; | ||
|
||
static enum update_status update_file (struct file *file, unsigned int depth); | ||
static enum update_status update_file_1 (struct file *file, unsigned int depth); | ||
@@ -90,12 +91,12 @@ update_goal_chain (struct goaldep *goaldeps) | ||
|
||
goal_list = rebuilding_makefiles ? goaldeps : NULL; | ||
|
||
- /* All files start with the considered bit 0, so the global value is 1. */ | ||
- considered = 1; | ||
- | ||
#define MTIME(file) (rebuilding_makefiles ? file_mtime_no_search (file) \ | ||
: file_mtime (file)) | ||
|
||
+ /* Start a fresh batch of consideration. */ | ||
+ ++considered; | ||
+ | ||
/* Update all the goals until they are all finished. */ | ||
|
||
while (goals != 0) | ||
@@ -247,10 +248,10 @@ update_goal_chain (struct goaldep *goaldeps) | ||
} | ||
} | ||
|
||
- /* If we reached the end of the dependency graph toggle the considered | ||
- flag for the next pass. */ | ||
+ /* If we reached the end of the dependency graph update CONSIDERED | ||
+ for the next pass. */ | ||
if (g == 0) | ||
- considered = !considered; | ||
+ ++considered; | ||
} | ||
|
||
if (rebuilding_makefiles) | ||
@@ -615,8 +616,8 @@ update_file_1 (struct file *file, unsigned int depth) | ||
break; | ||
|
||
if (!running) | ||
- /* The prereq is considered changed if the timestamp has changed while | ||
- it was built, OR it doesn't exist. */ | ||
+ /* The prereq is considered changed if the timestamp has changed | ||
+ while it was built, OR it doesn't exist. */ | ||
d->changed = ((file_mtime (d->file) != mtime) | ||
|| (mtime == NONEXISTENT_MTIME)); | ||
|
||
@@ -650,7 +651,7 @@ update_file_1 (struct file *file, unsigned int depth) | ||
/* We may have already considered this file, when we didn't know | ||
we'd need to update it. Force update_file() to consider it and | ||
not prune it. */ | ||
- d->file->considered = !considered; | ||
+ d->file->considered = 0; | ||
|
||
new = update_file (d->file, depth); | ||
if (new > dep_status) | ||
@@ -1087,7 +1088,7 @@ check_dep (struct file *file, unsigned int depth, | ||
/* If the target was waiting for a dependency it has to be | ||
reconsidered, as that dependency might have finished. */ | ||
if (file->command_state == cs_deps_running) | ||
- file->considered = !considered; | ||
+ file->considered = 0; | ||
|
||
set_command_state (file, cs_not_started); | ||
} | ||
diff --git a/tests/scripts/features/double_colon b/tests/scripts/features/double_colon | ||
index 80ddb31..58f126f 100644 | ||
--- a/tests/scripts/features/double_colon | ||
+++ b/tests/scripts/features/double_colon | ||
@@ -197,6 +197,21 @@ all:: 3 | ||
', | ||
'-rs -j2 1 2 root', "all_one\nall_two\nroot\n"); | ||
|
||
+# SV 47995 : Parallel double-colon rules with FORCE | ||
+ | ||
+run_make_test(' | ||
+all:: ; @echo one | ||
+ | ||
+all:: joe ; @echo four | ||
+ | ||
+joe: FORCE ; touch joe-is-forced | ||
+ | ||
+FORCE: | ||
+', | ||
+ '-j5', "one\ntouch joe-is-forced\nfour\n"); | ||
+ | ||
+unlink('joe-is-forced'); | ||
+ | ||
# This tells the test driver that the perl test script executed properly. | ||
1; | ||
|
||
-- | ||
cgit v0.9.0.2 |
25 changes: 25 additions & 0 deletions
25
sys-devel/make/files/make-4.2-reset_stack_limit_for_re-exec.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
From a3d8c086d54c112fecfa2b9026a32a14f741f5f5 Mon Sep 17 00:00:00 2001 | ||
From: Jeremy Devenport <[email protected]> | ||
Date: Tue, 31 May 2016 07:09:24 +0000 | ||
Subject: * main.c (main): [SV 48009] Reset stack limit for make re-exec. | ||
|
||
Copyright-paperwork-exempt: yes | ||
--- | ||
diff --git a/main.c b/main.c | ||
index e606488..fa8045f 100644 | ||
--- a/main.c | ||
+++ b/main.c | ||
@@ -2454,6 +2454,11 @@ main (int argc, char **argv, char **envp) | ||
exit (WIFEXITED(r) ? WEXITSTATUS(r) : EXIT_FAILURE); | ||
} | ||
#else | ||
+#ifdef SET_STACK_SIZE | ||
+ /* Reset limits, if necessary. */ | ||
+ if (stack_limit.rlim_cur) | ||
+ setrlimit (RLIMIT_STACK, &stack_limit); | ||
+#endif | ||
exec_command ((char **)nargv, environ); | ||
#endif | ||
free (aargv); | ||
-- | ||
cgit v0.9.0.2 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
# Copyright 1999-2016 Gentoo Foundation | ||
# Distributed under the terms of the GNU General Public License v2 | ||
# $Id$ | ||
|
||
EAPI=5 | ||
|
||
inherit flag-o-matic eutils | ||
|
||
DESCRIPTION="Standard tool to compile source trees" | ||
HOMEPAGE="https://www.gnu.org/software/make/make.html" | ||
SRC_URI="mirror://gnu//make/${P}.tar.bz2" | ||
|
||
LICENSE="GPL-3+" | ||
SLOT="0" | ||
KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~m68k ~mips ~ppc ~ppc64 ~s390 ~sh ~sparc ~x86 ~ppc-aix ~amd64-fbsd ~sparc-fbsd ~x86-fbsd ~x64-freebsd ~x86-freebsd ~hppa-hpux ~ia64-hpux ~x86-interix ~amd64-linux ~arm-linux ~ia64-linux ~x86-linux ~ppc-macos ~x64-macos ~x86-macos ~m68k-mint ~sparc-solaris ~sparc64-solaris ~x64-solaris ~x86-solaris" | ||
IUSE="guile nls static" | ||
|
||
CDEPEND="guile? ( >=dev-scheme/guile-1.8:= )" | ||
DEPEND="${CDEPEND} | ||
nls? ( sys-devel/gettext )" | ||
RDEPEND="${CDEPEND} | ||
nls? ( virtual/libintl )" | ||
|
||
PATCHES=( | ||
"${FILESDIR}"/${PN}-3.82-darwin-library_search-dylib.patch | ||
"${FILESDIR}"/${PN}-4.2-double_colon_targets.patch | ||
"${FILESDIR}"/${PN}-4.2-reset_stack_limit_for_re-exec.patch | ||
) | ||
|
||
src_prepare() { | ||
epatch "${PATCHES[@]}" | ||
} | ||
|
||
src_configure() { | ||
use static && append-ldflags -static | ||
econf \ | ||
--program-prefix=g \ | ||
$(use_with guile) \ | ||
$(use_enable nls) | ||
} | ||
|
||
src_install() { | ||
emake DESTDIR="${D}" install | ||
dodoc AUTHORS NEWS README* | ||
if [[ ${USERLAND} == "GNU" ]] ; then | ||
# we install everywhere as 'gmake' but on GNU systems, | ||
# symlink 'make' to 'gmake' | ||
dosym gmake /usr/bin/make | ||
dosym gmake.1 /usr/share/man/man1/make.1 | ||
fi | ||
} |