Now have a scheme to delete stale xified sources as we traverse the include path...
authorNick Downing <downing.nick@gmail.com>
Sun, 22 Jan 2017 00:43:35 +0000 (11:43 +1100)
committerNick Downing <downing.nick@gmail.com>
Sun, 22 Jan 2017 00:43:35 +0000 (11:43 +1100)
test/Makefile
xify/cc.c

index 8c03f91..252c20c 100644 (file)
@@ -1,6 +1,6 @@
 ROOT=..
 CC=FAKEROOT=${ROOT}/cross ${ROOT}/cross/bin/cc
-CFLAGS=-d -g -Dvax
+CFLAGS=-I. -d -g -Dvax
 
 hello: hello.o
        ${CC} ${CFLAGS} -o $@ hello.o
index e2ec3a7..adf2097 100644 (file)
--- a/xify/cc.c
+++ b/xify/cc.c
@@ -108,7 +108,7 @@ void error __P((char *s, char *x));
 int getsuf __P((char as[]));
 char *setsuf __P((char *as, int ch));
 #ifdef XIFY
-int xify_include __P((char *in_name, char *prev_name));
+int xify_enqueue __P((char *in_name, char *prev_name));
 int xify_file __P((char *in_name, struct timespec *in_mtime));
 #endif
 int callsys __P((char *f, char **v));
@@ -338,12 +338,12 @@ int main(argc, argv) int argc; char **argv; {
                                        )
                                )
                                        goto nogood;
-                               if ( 
-                                       in_queue[in_queue_head].mkdir >= 0 &&
-                                       mkdir(plist[in_queue[in_queue_head].mkdir] + 2, 0777) &&
-                                       errno != EEXIST
-                               )
-                                       goto nogood;
+                               if (in_queue[in_queue_head].mkdir >= 0) {
+                                       if (debug)
+                                               fprintf(stderr, "mkdir %s\n", plist[in_queue[in_queue_head].mkdir] + 2);
+                                       if (mkdir(plist[in_queue[in_queue_head].mkdir] + 2, 0777) && errno != EEXIST)
+                                               goto nogood;
+                               }
                                ++in_queue_head;
                        }
                }
@@ -583,6 +583,8 @@ int xify_file(in_name, in_mtime) char *in_name; struct timespec *in_mtime; {
                
        ) {
                out_path[i + 5] = 0;
+               if (debug)
+                       fprintf(stderr, "mkdir %s\n", out_path);
                if (mkdir(out_path, 0777) == -1 && errno != EEXIST) {
                        error("can't mkdir: %s\n", out_path);
                        return 1;
@@ -614,7 +616,7 @@ int xify_file(in_name, in_mtime) char *in_name; struct timespec *in_mtime; {
                        }
                        err_line[i] = 0;
  /*fprintf(stderr, "found dep: %s\n", err_line);*/
-                       if (xify_include(err_line + 1, err_line[0] == '"' ? in_name : 0))
+                       if (xify_enqueue(err_line + 1, err_line[0] == '"' ? in_name : 0))
                                break;
                }
                else {
@@ -626,43 +628,71 @@ int xify_file(in_name, in_mtime) char *in_name; struct timespec *in_mtime; {
        return 0;
 }
 
-int xify_include(in_name, prev_name) char *in_name; char *prev_name; {
-       int i, j;
+int xify_enqueue(in_name, prev_name) char *in_name; char *prev_name; {
+       int i, j, k;
        struct stat statbuf;
 
+       for (i = strlen(in_name); i > 0 && in_name[i - 1] != '/'; --i)
+               ;
        if (prev_name) {
-               for (i = strlen(prev_name); i > 0 && prev_name[i - 1] != '/'; --i)
+               for (j = strlen(prev_name); j > 0 && prev_name[j - 1] != '/'; --j)
                        ;
-               bcopy(prev_name, in_path, i);
-               strcpy(in_path + i, in_name);
+               bcopy(prev_name, in_path, j);
+               strcpy(in_path + j, in_name);
                if (stat(in_path, &statbuf) == 0) {
-                       i = -1;
-                       goto found_relative;
+                       j = -1; /* does not require extra mkdir */
+                       goto found;
+               }
+
+               strcpy(in_path + j + i, ".xify/x_");
+               strcat(in_path + j + i, in_name + i);
+               if (debug)
+                       fprintf(stderr, "unlink %s\n", in_path);
+               if (unlink(in_path)) {
+                       if (errno != ENOENT)
+                               goto cant_unlink;
+               }
+               else {
+                       strcat(in_path, ".deps");
+                       if (debug)
+                               fprintf(stderr, "unlink %s\n", in_path);
+                       if (unlink(in_path) && errno != ENOENT)
+                               goto cant_unlink;
                }
        }
-       for (i = 0; i < np; ++i)
-               if (/*plist[i][0] == '-' &&*/ plist[i][1] == 'I') {
-                       j = strlen(plist[i] + 2) - 5; /* remove ".xify" */      
-                       bcopy(plist[i] + 2, in_path, j);
-                       strcpy(in_path + j, in_name);
+       for (j = 0; j < np; ++j)
+               if (/*plist[j][0] == '-' &&*/ plist[j][1] == 'I') {
+                       k = strlen(plist[j] + 2) - 5; /* remove ".xify" */      
+                       bcopy(plist[j] + 2, in_path, k);
+                       strcpy(in_path + k, in_name);
                        if (stat(in_path, &statbuf) == 0)
-                               goto found_in_path;
+                               goto found;
+
+                       strcpy(in_path + k + i, ".xify/x_");
+                       strcat(in_path + k + i, in_name + i);
+                       if (debug)
+                               fprintf(stderr, "unlink %s\n", in_path);
+                       if (unlink(in_path)) {
+                               if (errno != ENOENT)
+                                       goto cant_unlink;
+                       }
+                       else {
+                               strcat(in_path, ".deps");
+                               if (debug)
+                                       fprintf(stderr, "unlink %s\n", in_path);
+                               if (unlink(in_path) && errno != ENOENT) {
+                               cant_unlink:
+                                       error("can't unlink: %s\n", in_path);
+                                       return 1;
+                               }
+                       }
                }
        error("not found: %s\n", in_name);
        return 1;
 
-found_in_path:
-       /* see if it requires extra mkdir */
-       for (; in_path[j]; ++j)
-               if (in_path[j] == '/')
-                       goto found_relative;
-
-       /* it does not require extra mkdir */
-       i = -1;
-
-found_relative:
-       for (j = 0; j < in_queue_tail; ++j)
-               if (strcmp(in_queue[j].path, in_path) == 0)
+found:
+       for (k = 0; k < in_queue_tail; ++k)
+               if (strcmp(in_queue[k].path, in_path) == 0)
                        return 0;
 
        if (in_queue_tail >= IN_QUEUE_SIZE) {
@@ -672,7 +702,7 @@ found_relative:
 
        in_queue[in_queue_tail].path = savestr(in_path);
        in_queue[in_queue_tail].mtime = statbuf.st_mtim;
-       in_queue[in_queue_tail].mkdir = i;
+       in_queue[in_queue_tail].mkdir = i ? j : -1;
        ++in_queue_tail;
        return 0;
 }