summaryrefslogtreecommitdiff
path: root/~lukeshu/make-graph
diff options
context:
space:
mode:
Diffstat (limited to '~lukeshu/make-graph')
-rw-r--r--~lukeshu/make-graph/PKGBUILD64
-rw-r--r--~lukeshu/make-graph/bug30612.patch66
-rw-r--r--~lukeshu/make-graph/bug30723.patch12
-rw-r--r--~lukeshu/make-graph/make-3.82-makeflags.patch36
-rw-r--r--~lukeshu/make-graph/make-3.82-sort-blank.patch17
-rw-r--r--~lukeshu/make-graph/make-graph.patch273
-rw-r--r--~lukeshu/make-graph/make.install20
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
+}