From 062d6998abfa3fd59d47ed86547783db25ab066b Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Tue, 10 Mar 2009 20:03:31 -0700 Subject: [PATCH] Add support for a -I option. -I DIR searches for packages in DIR. R=ken,rsc DELTA=49 (41 added, 2 deleted, 6 changed) OCL=26057 CL=26092 --- src/cmd/gc/go.h | 9 +++++++++ src/cmd/gc/lex.c | 46 ++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 47 insertions(+), 8 deletions(-) diff --git a/src/cmd/gc/go.h b/src/cmd/gc/go.h index e96a85cc5a..dd57981961 100644 --- a/src/cmd/gc/go.h +++ b/src/cmd/gc/go.h @@ -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(); diff --git a/src/cmd/gc/lex.c b/src/cmd/gc/lex.c index 7c9c8957b4..179d0518e0 100644 --- a/src/cmd/gc/lex.c +++ b/src/cmd/gc/lex.c @@ -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; } -- 2.48.1