]> Cypherpunks repositories - gostls13.git/commitdiff
Add support for a -I option. -I DIR searches for packages in
authorIan Lance Taylor <iant@golang.org>
Wed, 11 Mar 2009 03:03:31 +0000 (20:03 -0700)
committerIan Lance Taylor <iant@golang.org>
Wed, 11 Mar 2009 03:03:31 +0000 (20:03 -0700)
DIR.

R=ken,rsc
DELTA=49  (41 added, 2 deleted, 6 changed)
OCL=26057
CL=26092

src/cmd/gc/go.h
src/cmd/gc/lex.c

index e96a85cc5a3da817ffc60637dacb0abc6091009b..dd57981961adc278074ed36c197eb5219fac7901 100644 (file)
@@ -455,6 +455,13 @@ struct     Dlist
        Type*   field;
 };
 
+typedef        struct  Idir    Idir;
+struct Idir
+{
+       Idir*   link;
+       char*   dir;
+};
+
 EXTERN Dlist   dotlist[10];    // size is max depth of embeddeds
 
 EXTERN Io      curio;
@@ -482,6 +489,7 @@ EXTERN      int     tptr;           // either TPTR32 or TPTR64
 extern char*   sysimport;
 extern char*   unsafeimport;
 EXTERN char*   filename;       // name to uniqify names
+EXTERN Idir*   idirs;
 
 EXTERN Type*   types[NTYPE];
 EXTERN uchar   simtype[NTYPE];
@@ -552,6 +560,7 @@ int yyparse(void);
  */
 int    mainlex(int, char*[]);
 void   setfilename(char*);
+void   addidir(char*);
 void   importfile(Val*);
 void   cannedimports(char*, char*);
 void   unimportfile();
index 7c9c8957b42d621e610242dbcf086d8984a98df4..179d0518e099feee0592056374688f8bfbc47deb 100644 (file)
@@ -35,6 +35,10 @@ mainlex(int argc, char *argv[])
        case 'k':
                package = ARGF();
                break;
+
+       case 'I':
+               addidir(ARGF());
+               break;
        } ARGEND
 
        if(argc != 1)
@@ -109,6 +113,7 @@ mainlex(int argc, char *argv[])
 
 usage:
        print("flags:\n");
+       print("  -I DIR search for packages in DIR\n");
        print("  -d print declarations\n");
        print("  -f print stack frame structure\n");
        print("  -k name specify package name\n");
@@ -175,15 +180,29 @@ skiptopkgdef(Biobuf *b)
        return 1;
 }
 
+void
+addidir(char* dir)
+{
+       Idir** pp;
+
+       if(dir == nil)
+               return;
+
+       for(pp = &idirs; *pp != nil; pp = &(*pp)->link)
+               ;
+       *pp = mal(sizeof(Idir));
+       (*pp)->link = nil;
+       (*pp)->dir = dir;
+}
+
 int
 findpkg(String *name)
 {
        static char* goroot;
+       Idir* p;
 
        if(goroot == nil) {
                goroot = getenv("GOROOT");
-               if(goroot == nil)
-                       return 0;
        }
 
        // BOTCH need to get .6 from backend
@@ -191,18 +210,29 @@ findpkg(String *name)
        // try .a before .6.  important for building libraries:
        // if there is an array.6 in the array.a library,
        // want to find all of array.a, not just array.6.
+       for(p = idirs; p != nil; p = p->link) {
+               snprint(namebuf, sizeof(namebuf), "%s/%Z.a", p->dir, name);
+               if(access(namebuf, 0) >= 0)
+                       return 1;
+               snprint(namebuf, sizeof(namebuf), "%s/%Z.6", p->dir, name);
+               if(access(namebuf, 0) >= 0)
+                       return 1;
+       }
+
        snprint(namebuf, sizeof(namebuf), "%Z.a", name);
        if(access(namebuf, 0) >= 0)
                return 1;
        snprint(namebuf, sizeof(namebuf), "%Z.6", name);
        if(access(namebuf, 0) >= 0)
                return 1;
-       snprint(namebuf, sizeof(namebuf), "%s/pkg/%Z.a", goroot, name);
-       if(access(namebuf, 0) >= 0)
-               return 1;
-       snprint(namebuf, sizeof(namebuf), "%s/pkg/%Z.6", goroot, name);
-       if(access(namebuf, 0) >= 0)
-               return 1;
+       if(goroot != nil) {
+               snprint(namebuf, sizeof(namebuf), "%s/pkg/%Z.a", goroot, name);
+               if(access(namebuf, 0) >= 0)
+                       return 1;
+               snprint(namebuf, sizeof(namebuf), "%s/pkg/%Z.6", goroot, name);
+               if(access(namebuf, 0) >= 0)
+                       return 1;
+       }
        return 0;
 }