diff options
-rw-r--r-- | ~lukeshu/make-graph/PKGBUILD | 64 | ||||
-rw-r--r-- | ~lukeshu/make-graph/bug30612.patch | 66 | ||||
-rw-r--r-- | ~lukeshu/make-graph/bug30723.patch | 12 | ||||
-rw-r--r-- | ~lukeshu/make-graph/make-3.82-makeflags.patch | 36 | ||||
-rw-r--r-- | ~lukeshu/make-graph/make-3.82-sort-blank.patch | 17 | ||||
-rw-r--r-- | ~lukeshu/make-graph/make-graph.patch | 273 | ||||
-rw-r--r-- | ~lukeshu/make-graph/make.install | 20 |
7 files changed, 488 insertions, 0 deletions
diff --git a/~lukeshu/make-graph/PKGBUILD b/~lukeshu/make-graph/PKGBUILD new file mode 100644 index 000000000..f7f7cd0b1 --- /dev/null +++ b/~lukeshu/make-graph/PKGBUILD @@ -0,0 +1,64 @@ +# $Id: PKGBUILD 138004 2011-09-14 05:05:12Z allan $ +# Maintainer: Allan McRae <allan@archlinux.org> +# Contributor: judd <jvinet@zeroflux.org> + +_pkgname=make +pkgname=$_pkgname-graph +pkgver=3.82 +pkgrel=4.1 +provides=("$_pkgname=$pkgver") +conflicts=("$_pkgname") +pkgdesc="GNU make utility to maintain groups of programs, with patch to dump a Graphviz dependency graph." +arch=('i686' 'x86_64') +url="http://www.gnu.org/software/make" +license=('GPL3') +groups=('base-devel') +depends=('glibc' 'sh') +install=$_pkgname.install +source=(ftp://ftp.gnu.org/gnu/${_pkgname}/${_pkgname}-${pkgver}.tar.bz2 + bug30612.patch + bug30723.patch + make-3.82-sort-blank.patch + make-3.82-makeflags.patch) +md5sums=('1a11100f3c63fcf5753818e59d63088f' + 'c8f496b22191f9fb9420ab14c1a19a47' + '662e6450e19a5acdaa5c9fcb8ad78dea' + '7d01a99f389d8f08dec93ed479071ee4' + 'bc12ad4d0c6e6c0e72d9fb61054f446b') + +source+=('make-graph.patch') +md5sums+=('c1f1d652004a36c69b1f7f42a6849356') +depends+=('graphviz') + +build() { + cd ${srcdir}/${_pkgname}-${pkgver} + + # http://savannah.gnu.org/bugs/?30612 + patch -Np1 -i $srcdir/bug30612.patch + + # http://savannah.gnu.org/bugs/?30723 + patch -Np1 -i $srcdir/bug30723.patch + + # https://bugs.archlinux.org/task/22733 (fix from Fedora) + patch -Np1 -i $srcdir/make-3.82-sort-blank.patch + + # https://savannah.gnu.org/support/index.php?107487 + # https://savannah.gnu.org/bugs/?33873 + patch -Np0 -i $srcdir/make-3.82-makeflags.patch + + # https://savannah.gnu.org/patch/?7447 + patch -Np1 -i $srcdir/make-graph.patch + + ./configure --prefix=/usr + make +} + +check() { + cd ${srcdir}/${_pkgname}-${pkgver} + make check +} + +package() { + cd ${srcdir}/${_pkgname}-${pkgver} + make DESTDIR=${pkgdir} install +} diff --git a/~lukeshu/make-graph/bug30612.patch b/~lukeshu/make-graph/bug30612.patch new file mode 100644 index 000000000..fb843bcd9 --- /dev/null +++ b/~lukeshu/make-graph/bug30612.patch @@ -0,0 +1,66 @@ +diff -Naur make-3.82-orig/main.c make-3.82-fix30612//main.c +--- make-3.82-orig/main.c 2010-07-19 17:10:53.000000000 +1000 ++++ make-3.82-fix30612//main.c 2010-09-23 23:33:37.908855839 +1000 +@@ -1,3 +1,4 @@ ++ + /* Argument parsing and main program of GNU Make. + Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, + 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, +@@ -1138,7 +1139,7 @@ + a macro and some compilers (MSVC) don't like conditionals in macros. */ + { + const char *features = "target-specific order-only second-expansion" +- " else-if shortest-stem undefine" ++ " else-if shortest-stem undefine oneshell" + #ifndef NO_ARCHIVES + " archives" + #endif +diff -Naur make-3.82-orig/read.c make-3.82-fix30612//read.c +--- make-3.82-orig/read.c 2010-07-13 11:20:42.000000000 +1000 ++++ make-3.82-fix30612//read.c 2010-09-23 23:30:58.018855839 +1000 +@@ -3028,7 +3028,7 @@ + { + /* This looks like the first element in an open archive group. + A valid group MUST have ')' as the last character. */ +- const char *e = p + nlen; ++ const char *e = p; + do + { + e = next_token (e); +@@ -3084,19 +3084,19 @@ + Go to the next item in the string. */ + if (flags & PARSEFS_NOGLOB) + { +- NEWELT (concat (2, prefix, tp)); ++ NEWELT (concat (2, prefix, tmpbuf)); + continue; + } + + /* If we get here we know we're doing glob expansion. + TP is a string in tmpbuf. NLEN is no longer used. + We may need to do more work: after this NAME will be set. */ +- name = tp; ++ name = tmpbuf; + + /* Expand tilde if applicable. */ +- if (tp[0] == '~') ++ if (tmpbuf[0] == '~') + { +- tildep = tilde_expand (tp); ++ tildep = tilde_expand (tmpbuf); + if (tildep != 0) + name = tildep; + } +@@ -3152,7 +3152,11 @@ + else + { + /* We got a chain of items. Attach them. */ +- (*newp)->next = found; ++ if (*newp) ++ (*newp)->next = found; ++ else ++ *newp = found; ++ + + /* Find and set the new end. Massage names if necessary. */ + while (1) diff --git a/~lukeshu/make-graph/bug30723.patch b/~lukeshu/make-graph/bug30723.patch new file mode 100644 index 000000000..84e7ebe7a --- /dev/null +++ b/~lukeshu/make-graph/bug30723.patch @@ -0,0 +1,12 @@ +diff -Naur make-3.82-orig/main.c make-3.82-fix30723//main.c +--- make-3.82-orig/main.c 2010-07-19 17:10:53.000000000 +1000 ++++ make-3.82-fix30723//main.c 2010-09-23 23:34:10.932188592 +1000 +@@ -2093,7 +2093,7 @@ + const char *pv = define_makeflags (1, 1); + char *p = alloca (sizeof ("MAKEFLAGS=") + strlen (pv) + 1); + sprintf (p, "MAKEFLAGS=%s", pv); +- putenv (p); ++ putenv (allocated_variable_expand (p)); + } + + if (ISDB (DB_BASIC)) diff --git a/~lukeshu/make-graph/make-3.82-makeflags.patch b/~lukeshu/make-graph/make-3.82-makeflags.patch new file mode 100644 index 000000000..3cba3c402 --- /dev/null +++ b/~lukeshu/make-graph/make-3.82-makeflags.patch @@ -0,0 +1,36 @@ +Index: main.c +=================================================================== +RCS file: /sources/make/make/main.c,v +retrieving revision 1.246 +diff -u -r1.246 main.c +--- main.c 29 Aug 2010 23:05:27 -0000 1.246 ++++ main.c 27 Jul 2011 22:03:12 -0000 +@@ -2091,10 +2095,16 @@ + + /* Reset makeflags in case they were changed. */ + { ++ if (master_job_slots) ++ { ++ assert (job_slots == default_job_slots); ++ job_slots = master_job_slots; ++ } + const char *pv = define_makeflags (1, 1); + char *p = alloca (sizeof ("MAKEFLAGS=") + strlen (pv) + 1); + sprintf (p, "MAKEFLAGS=%s", pv); + putenv (allocated_variable_expand (p)); ++ job_slots = default_job_slots; + } + + if (ISDB (DB_BASIC)) +@@ -2825,9 +2852,11 @@ + && (*(unsigned int *) cs->value_ptr == + *(unsigned int *) cs->noarg_value)) + ADD_FLAG ("", 0); /* Optional value omitted; see below. */ ++#if 0 + else if (cs->c == 'j') + /* Special case for `-j'. */ + ADD_FLAG ("1", 1); ++#endif + else + { + char *buf = alloca (30); diff --git a/~lukeshu/make-graph/make-3.82-sort-blank.patch b/~lukeshu/make-graph/make-3.82-sort-blank.patch new file mode 100644 index 000000000..2e73f5b7c --- /dev/null +++ b/~lukeshu/make-graph/make-3.82-sort-blank.patch @@ -0,0 +1,17 @@ +diff -urp make-3.82/function.c make-3.82-pm/function.c +--- make-3.82/function.c 2010-07-13 03:20:39.000000000 +0200 ++++ make-3.82-pm/function.c 2010-10-27 01:43:27.000000000 +0200 +@@ -1138,12 +1138,12 @@ func_sort (char *o, char **argv, const c + { + char c = *(t++); + +- if (! isspace ((unsigned char)c)) ++ if (! isblank ((unsigned char)c)) + continue; + + ++wordi; + +- while (isspace ((unsigned char)*t)) ++ while (isblank ((unsigned char)*t)) + ++t; + } diff --git a/~lukeshu/make-graph/make-graph.patch b/~lukeshu/make-graph/make-graph.patch new file mode 100644 index 000000000..083db55e4 --- /dev/null +++ b/~lukeshu/make-graph/make-graph.patch @@ -0,0 +1,273 @@ +diff -ur make-3.82/file.c make-wch/file.c +--- make-3.82/file.c 2010-07-12 21:20:39.000000000 -0400 ++++ make-wch/file.c 2010-08-19 23:28:20.162660391 -0400 +@@ -1021,6 +1021,129 @@ + hash_print_stats (&files, stdout); + } + ++/* Dump the dependency graph to a Graphviz file (on stdout) */ ++ ++void ++print_graph_prereqs (const char *filename, const struct dep *deps) ++{ ++ const struct dep *ood = 0; ++ ++ /* Print all normal dependencies; note any order-only deps. */ ++ for (; deps != 0; deps = deps->next) ++ if (! deps->ignore_mtime) ++ printf (" \"%s\" -> \"%s\";\n", filename, dep_name (deps)); ++ ++ /* Print order-only deps, if we have any. */ ++ if (ood) ++ { ++ for (ood = ood->next; ood != 0; ood = ood->next) ++ if (ood->ignore_mtime) ++ printf (" %s -> %s [style=dotted];\n", filename, dep_name (ood)); ++ /* XXX: we need to distinguish these some how. ++ * Is dotting them the right way? */ ++ } ++} ++ ++static void ++print_graph_file (const void *item) ++{ ++ const struct file *f = item; ++ ++ int built_in_special_target=( ++ (0==strcmp(f->name,".PHONY")) ++ || (0==strcmp(f->name,".SUFFIXES")) ++ || (0==strcmp(f->name,".DEFAULT")) ++ || (0==strcmp(f->name,".PRECIOUS")) ++ || (0==strcmp(f->name,".INTERMEDIATE")) ++ || (0==strcmp(f->name,".SECONDARY")) ++ || (0==strcmp(f->name,".SECONDEXPANSION")) ++ || (0==strcmp(f->name,".DELETE_ON_ERROR")) ++ || (0==strcmp(f->name,".IGNORE")) ++ || (0==strcmp(f->name,".LOW_RESOLUTION_TIME")) ++ || (0==strcmp(f->name,".SILENT")) ++ || (0==strcmp(f->name,".EXPORT_ALL_VARIABLES")) ++ || (0==strcmp(f->name,".NOTPARALLEL")) ++ || (0==strcmp(f->name,".ONESHELL")) ++ || (0==strcmp(f->name,".POSIX")) ++ ); ++ if ((f->is_target) && (!built_in_special_target)) ++ { ++ printf (" \"%s\" [", f->name); ++ /* XXX some of these should be attached to the nodes in some way; ++ * though I'm not sure what style changes should be made for which ones. ++ * ~ LukeShu ++ if (f->double_colon) puts (_("// Double-colon rule.")); ++ if (f->precious) puts (_("// Precious file (prerequisite of .PRECIOUS).")); ++ */if (f->phony) puts (_(" color=blue "));/* ++ if (f->cmd_target) puts (_("// Command line target.")); ++ if (f->dontcare) puts (_("// A default, MAKEFILES, or -include/sinclude makefile.")); ++ if (f->tried_implicit) puts (_("// Implicit rule search has been done.")); ++ else puts (_("// Implicit rule search has not been done.")); ++ if (f->stem != 0) printf (_("// Implicit/static pattern stem: `%s'\n"), f->stem); ++ if (f->intermediate) puts (_("// File is an intermediate prerequisite.")); ++ if (f->also_make != 0) ++ { ++ const struct dep *d; ++ fputs (_("# Also makes:"), stdout); ++ for (d = f->also_make; d != 0; d = d->next) ++ printf (" %s\n", dep_name (d)); ++ } ++ if (f->last_mtime == UNKNOWN_MTIME) puts (_("// Modification time never checked.")); ++ else if (f->last_mtime == NONEXISTENT_MTIME) puts (_("// File does not exist.")); ++ else if (f->last_mtime == OLD_MTIME) puts (_("// File is very old.")); ++ else ++ { ++ char buf[FILE_TIMESTAMP_PRINT_LEN_BOUND + 1]; ++ file_timestamp_sprintf (buf, f->last_mtime); ++ printf (_("// Last modified %s\n"), buf); ++ } ++ if (f->updated) puts (_("// File has been updated.")); ++ else puts (_("// File has not been updated.")); ++ switch (f->command_state) ++ { ++ case cs_running: puts (_("// Update: Running (THIS IS A BUG).")); break; ++ case cs_deps_running: puts (_("// Update: Dependencies running (THIS IS A BUG).")); break; ++ case cs_not_started: ++ case cs_finished: ++ switch (f->update_status) ++ { ++ case -1: break; ++ case 0: puts (_("// Update: Successfully")); break; ++ case 1: assert (question_flag); ++ puts (_("// Update: Needs to be (-q is set)")); break; ++ case 2: puts (_("// Update: Failed")); break; ++ default: puts (_("// Update: Invalid `update_status' value)); ++ fflush (stdout); ++ fflush (stderr); ++ abort (); ++ } ++ break; ++ default: puts (_("// Update: Invalid `command_state' value")); ++ fflush (stdout); ++ fflush (stderr); ++ abort (); ++ } ++ if (f->variables != 0) print_file_variables (f); ++ if (f->cmds != 0) print_commands (f->cmds); ++ */ ++ puts("];"); ++ print_graph_prereqs (f->name, f->deps); ++ } ++ ++ if (f->prev) ++ print_graph_file ((const void *) f->prev); ++} ++ ++void ++print_graph (void) ++{ ++ printf ("%sgraph make%i {\n", ++ (makelevel==0)?"di":"sub", ++ getpid()); ++ hash_map (&files, print_graph_file); ++ puts ("}"); ++} ++ + /* Verify the integrity of the data base of files. */ + + #define VERIFY_CACHED(_p,_n) \ +diff -ur make-3.82/filedef.h make-wch/filedef.h +--- make-3.82/filedef.h 2010-07-12 21:20:39.000000000 -0400 ++++ make-wch/filedef.h 2010-08-19 21:09:34.314660209 -0400 +@@ -116,6 +116,7 @@ + char *build_target_list (char *old_list); + void print_prereqs (const struct dep *deps); + void print_file_data_base (void); ++void print_graph (void); + + #if FILE_TIMESTAMP_HI_RES + # define FILE_TIMESTAMP_STAT_MODTIME(fname, st) \ +diff -ur make-3.82/main.c make-wch/main.c +--- make-3.82/main.c 2010-07-19 03:10:53.000000000 -0400 ++++ make-wch/main.c 2010-08-21 22:32:56.818417305 -0400 +@@ -175,6 +175,11 @@ + + int print_data_base_flag = 0; + ++/* Nonzero means don't remake anything, just print the dependency graph ++ that results from reading the makefile (-g). */ ++ ++int print_graph_flag = 0; ++ + /* Nonzero means don't remake anything; just return a nonzero status + if the specified targets are not up to date (-q). */ + +@@ -321,6 +326,9 @@ + -f FILE, --file=FILE, --makefile=FILE\n\ + Read FILE as a makefile.\n"), + N_("\ ++ -g, --graph Print make's internal dependency graph\n\ ++ in Graphviz format, without remaking makefiles.\n"), ++ N_("\ + -h, --help Print this message and exit.\n"), + N_("\ + -i, --ignore-errors Ignore errors from recipes.\n"), +@@ -385,6 +393,7 @@ + #endif + { 'e', flag, &env_overrides, 1, 1, 0, 0, 0, "environment-overrides", }, + { 'f', filename, &makefiles, 0, 0, 0, 0, 0, "file" }, ++ { 'g', flag, &print_graph_flag, 1, 1, 0, 0, 0, "graph" }, + { 'h', flag, &print_usage_flag, 0, 0, 0, 0, 0, "help" }, + { 'i', flag, &ignore_errors_flag, 1, 1, 0, 0, 0, "ignore-errors" }, + { 'I', filename, &include_directories, 1, 1, 0, 0, 0, +@@ -1946,7 +1955,10 @@ + define_makeflags (1, 1); + + rebuilding_makefiles = 1; +- status = update_goal_chain (read_makefiles); ++ if (print_graph_flag) ++ status = -1; ++ else ++ status = update_goal_chain (read_makefiles); + rebuilding_makefiles = 0; + + switch (status) +@@ -2278,33 +2290,37 @@ + + { + int status; ++ if (print_graph_flag) ++ status=0; ++ else ++ { ++ switch (update_goal_chain (goals)) ++ { ++ case -1: ++ /* Nothing happened. */ ++ case 0: ++ /* Updated successfully. */ ++ status = makefile_status; ++ break; ++ case 1: ++ /* We are under -q and would run some commands. */ ++ status = MAKE_TROUBLE; ++ break; ++ case 2: ++ /* Updating failed. POSIX.2 specifies exit status >1 for this; ++ but in VMS, there is only success and failure. */ ++ status = MAKE_FAILURE; ++ break; ++ default: ++ abort (); ++ } + +- switch (update_goal_chain (goals)) +- { +- case -1: +- /* Nothing happened. */ +- case 0: +- /* Updated successfully. */ +- status = makefile_status; +- break; +- case 1: +- /* We are under -q and would run some commands. */ +- status = MAKE_TROUBLE; +- break; +- case 2: +- /* Updating failed. POSIX.2 specifies exit status >1 for this; +- but in VMS, there is only success and failure. */ +- status = MAKE_FAILURE; +- break; +- default: +- abort (); +- } +- +- /* If we detected some clock skew, generate one last warning */ +- if (clock_skew_detected) +- error (NILF, +- _("warning: Clock skew detected. Your build may be incomplete.")); +- ++ /* If we detected some clock skew, generate one last warning */ ++ if (clock_skew_detected) ++ error (NILF, ++ _("warning: Clock skew detected. Your build may be incomplete.")); ++ } ++ + /* Exit. */ + die (status); + } +@@ -3042,7 +3058,7 @@ + { + static int printed_version = 0; + +- char *precede = print_data_base_flag ? "# " : ""; ++ char *precede = (print_data_base_flag||print_graph_flag) ? "# " : ""; + + if (printed_version) + /* Do it only once. */ +@@ -3188,6 +3204,10 @@ + if (print_data_base_flag) + print_data_base (); + ++ ++ if (print_graph_flag) ++ print_graph (); ++ + verify_file_data_base (); + + clean_jobserver (status); diff --git a/~lukeshu/make-graph/make.install b/~lukeshu/make-graph/make.install new file mode 100644 index 000000000..6cf8b0dc4 --- /dev/null +++ b/~lukeshu/make-graph/make.install @@ -0,0 +1,20 @@ +infodir=usr/share/info +filelist=(make.info make.info-1 make.info-2) + +post_install() { + [ -x usr/bin/install-info ] || return 0 + for file in ${filelist[@]}; do + install-info $infodir/$file.gz $infodir/dir 2> /dev/null + done +} + +post_upgrade() { + post_install $1 +} + +pre_remove() { + [ -x usr/bin/install-info ] || return 0 + for file in ${filelist[@]}; do + install-info --delete $infodir/$file.gz $infodir/dir 2> /dev/null + done +} |