svn commit: r195150 - in projects/jbuild/usr.bin: jbuild/port jdirdep make

John Birrell jb at FreeBSD.org
Sun Jun 28 23:21:19 UTC 2009


Author: jb
Date: Sun Jun 28 23:21:18 2009
New Revision: 195150
URL: http://svn.freebsd.org/changeset/base/195150

Log:
  When automatically updating dependencies, the only meta data files that
  need to be parsed are the ones that were created in the current jbuild
  process.
  
  It is a waste of time to re-parse all the existing meta data files in libs
  like libc which have lots of them when only a few may have changed.
  
  And only the new meta data files can have info that leads to the discovery
  or new directory dependencies.

Modified:
  projects/jbuild/usr.bin/jbuild/port/Makefile
  projects/jbuild/usr.bin/jdirdep/jdirdep.c
  projects/jbuild/usr.bin/jdirdep/jdirdep.h
  projects/jbuild/usr.bin/make/job.c

Modified: projects/jbuild/usr.bin/jbuild/port/Makefile
==============================================================================
--- projects/jbuild/usr.bin/jbuild/port/Makefile	Sun Jun 28 22:42:51 2009	(r195149)
+++ projects/jbuild/usr.bin/jbuild/port/Makefile	Sun Jun 28 23:21:18 2009	(r195150)
@@ -4,7 +4,7 @@
 #
 
 PORTNAME=      jbuild
-PORTVERSION=   11
+PORTVERSION=   12
 CATEGORIES=    devel
 
 MAINTAINER=    rodrigc at FreeBSD.org

Modified: projects/jbuild/usr.bin/jdirdep/jdirdep.c
==============================================================================
--- projects/jbuild/usr.bin/jdirdep/jdirdep.c	Sun Jun 28 22:42:51 2009	(r195149)
+++ projects/jbuild/usr.bin/jdirdep/jdirdep.c	Sun Jun 28 23:21:18 2009	(r195150)
@@ -45,6 +45,11 @@ struct incmk {
 	TAILQ_ENTRY(incmk) link;
 };
 
+struct metas {
+	char *s;
+	TAILQ_ENTRY(metas) link;
+};
+
 struct file_track {
 	int64_t *filids;
 	int max_idx;
@@ -55,11 +60,25 @@ static TAILQ_HEAD(, dirdep) dirdeps = TA
 static TAILQ_HEAD(, dirdep) srcdirdeps = TAILQ_HEAD_INITIALIZER(srcdirdeps);
 static TAILQ_HEAD(, incmk) incmks = TAILQ_HEAD_INITIALIZER(incmks);
 static TAILQ_HEAD(, march) marchs = TAILQ_HEAD_INITIALIZER(marchs);
+static TAILQ_HEAD(, metas) metass = TAILQ_HEAD_INITIALIZER(metass);
 static int f_db = 0;
 static int f_quiet = 1;
 static struct file_track read_filids = { NULL, 0, 0 };
 static struct file_track write_filids = { NULL, 0, 0 };
 
+static int
+meta_lookup(const char *mname)
+{
+	struct metas *m;
+
+	TAILQ_FOREACH(m, &metass, link) {
+		if (strcmp(m->s, mname) == 0)
+			return(1);
+	}
+
+	return(0);
+}
+
 static void
 file_track_add(struct file_track *ft, int64_t filid)
 {
@@ -649,6 +668,7 @@ do_dirdep(const char *srctop, const char
 	int f_doit = 0;
 	int f_error = 0;
 	int f_force = (options & JDIRDEP_OPT_FORCE);
+	int f_meta = (options & JDIRDEP_OPT_META);
 	int f_rewrite = 0;
 	int f_src = (options & JDIRDEP_OPT_SOURCE);
 	int f_update = (options & JDIRDEP_OPT_UPDATE);
@@ -821,6 +841,13 @@ do_dirdep(const char *srctop, const char
 					snprintf(mname, sizeof(mname), "%s/%s", objdir, de->d_name);
 
 					/*
+					 * If a list of meta data files has been specified,
+					 * then only parse the meata data file if it is in the list.
+					 */
+					if (f_meta && !meta_lookup(mname))
+						continue;
+
+					/*
 					 * Parse the meta data file and watch out that we don't get
 					 * confused with references to the current directory -- they
 					 * are almost certain to occur if there are include files
@@ -1207,10 +1234,15 @@ jdirdep_incmk(const char *p)
 /* This is the public function. */
 int
 jdirdep(const char *srctop, const char *curdir, const char *srcrel, const char *objroot,
-    const char *objdir, const char *sharedobj, const char *filedep_name, int options)
+    const char *objdir, const char *sharedobj, const char *filedep_name,
+    const char *meta_created, int options)
 {
 	FILE *fp;
+	char *meta_str = NULL;
+	char *s;
+	char *str;
 	int ret = 0;
+	struct metas *metasp;
 
 	if (filedep_name != NULL) {
 		f_db = 1;
@@ -1218,6 +1250,19 @@ jdirdep(const char *srctop, const char *
 		jdirdep_db_open(filedep_name);
 	}
 
+	if (meta_created != NULL) {
+		meta_str = strdup(meta_created);
+		str = meta_str;
+		for (s = str; (s = strsep(&str, " ")) != NULL; ) {
+			if ((metasp = malloc(sizeof(struct metas))) == NULL)
+				err(1, "Could not allocate memory for struct metas");
+			metasp->s = s;
+			TAILQ_INSERT_TAIL(&metass, metasp, link);
+		}
+
+		options |= JDIRDEP_OPT_META;
+	}
+
 	if ((options & JDIRDEP_OPT_GRAPH) != 0) {
 		char gvfile[MAXPATHLEN];
 
@@ -1247,6 +1292,9 @@ jdirdep(const char *srctop, const char *
 
 	jdirdep_db_close();
 
+	if (meta_str != NULL)
+		free(meta_str);
+
 	return(ret);
 }
 
@@ -1373,6 +1421,6 @@ main(int argc, char *argv[])
 		}
 	}
 
-	return(jdirdep(srctop, curdir, srcrel, objroot, objdir, sharedobj, filedep_name, options));
+	return(jdirdep(srctop, curdir, srcrel, objroot, objdir, sharedobj, filedep_name, NULL, options));
 }
 #endif

Modified: projects/jbuild/usr.bin/jdirdep/jdirdep.h
==============================================================================
--- projects/jbuild/usr.bin/jdirdep/jdirdep.h	Sun Jun 28 22:42:51 2009	(r195149)
+++ projects/jbuild/usr.bin/jdirdep/jdirdep.h	Sun Jun 28 23:21:18 2009	(r195150)
@@ -11,16 +11,18 @@
 #define JDIRDEP_OPT_DB		(1 << 1)
 #define JDIRDEP_OPT_FORCE	(1 << 2)
 #define JDIRDEP_OPT_GRAPH	(1 << 3)
-#define JDIRDEP_OPT_RECURSE	(1 << 4)
-#define JDIRDEP_OPT_SOURCE	(1 << 5)
-#define JDIRDEP_OPT_UPDATE	(1 << 6)
+#define JDIRDEP_OPT_META	(1 << 4)
+#define JDIRDEP_OPT_RECURSE	(1 << 5)
+#define JDIRDEP_OPT_SOURCE	(1 << 6)
+#define JDIRDEP_OPT_UPDATE	(1 << 7)
 
 #define MAX_FIELDS	20
 
 typedef int (*db_cb_func)(void *, int, char **, char **);
 
 int jdirdep(const char *srctop, const char *curdir, const char *srcrel, const char *objroot,
-    const char *objdir, const char *sharedobj, const char *filedep_name, int options);
+    const char *objdir, const char *sharedobj, const char *filedep_name,
+    const char *meta_created, int options);
 int64_t jdirdep_db_rowid(void);
 void jdirdep_db_close(void);
 void jdirdep_db_command(db_cb_func, void *, const char *, ...);

Modified: projects/jbuild/usr.bin/make/job.c
==============================================================================
--- projects/jbuild/usr.bin/make/job.c	Sun Jun 28 22:42:51 2009	(r195149)
+++ projects/jbuild/usr.bin/make/job.c	Sun Jun 28 23:21:18 2009	(r195150)
@@ -423,6 +423,7 @@ meta_exit(void)
 	char sharedobj[MAXPATHLEN];
 	const char *curdir;
 	const char *filedep_name;
+	const char *meta_created;
 	const char *objdir;
 	const char *objroot;
 	const char *p_incmk;
@@ -468,12 +469,13 @@ meta_exit(void)
 		objroot = Var_Value(".OBJROOT", VAR_GLOBAL);
 		objdir = Var_Value(".OBJDIR", VAR_GLOBAL);
 		filedep_name = Var_Value(".FILEDEP_NAME", VAR_GLOBAL);
+		meta_created = Var_Value(".META_CREATED", VAR_GLOBAL);
 
 		snprintf(sharedobj, sizeof(sharedobj), "%s/../shared", objroot);
 
 		/* Add any new directory and/or source dependencies. */
 		jdirdep(srctop, curdir, srcrel, objroot, objdir, sharedobj, filedep_name,
-		    JDIRDEP_OPT_ADD | JDIRDEP_OPT_SOURCE | JDIRDEP_OPT_UPDATE);
+		    meta_created, JDIRDEP_OPT_ADD | JDIRDEP_OPT_SOURCE | JDIRDEP_OPT_UPDATE);
 	}
 }
 
@@ -680,6 +682,8 @@ meta_create(GNode *gn)
 
 	n_meta_created++;
 
+	Var_Append(".META_CREATED", fname, VAR_GLOBAL);
+
 	return (fp);
 }
 #endif


More information about the svn-src-projects mailing list