diff --git a/src/configure.c b/src/configure.c index 8d93a3c..f436567 100644 --- a/src/configure.c +++ b/src/configure.c @@ -3,10 +3,13 @@ #include +#include +#include #include #include #include #include +#include #include "makefile.h" #include "configure.h" @@ -16,7 +19,7 @@ const String * sHostArch[HA_LAST+1] = { "i386", "i486", "i586", "i686", - "sparc", + "sparc", "sparc64", "unknown" }; const String * sHostOS[HO_LAST+1] = @@ -28,7 +31,7 @@ const String * sHostOS[HO_LAST+1] = const String * sHostKernel[HK_LAST+1] = { "2.0", "2.2", "2.4", "2.6", - "2.0", + "2.0", "3.0", "unknown" }; @@ -87,24 +90,25 @@ static int _configure(Prefs * prefs, char const * directory) Configure cfgr; configArray * ca; int ret; + int flags = prefs->flags; int i; Config * p; if((ca = configarray_new()) == NULL) return configure_error("libSystem", 2); - cfgr.prefs = *prefs; + cfgr.prefs = prefs; _configure_detect(&cfgr); ret = _configure_load(prefs, directory, ca); if(ret == 0) { - if(*prefs & PREFS_n) + if(prefs->flags & PREFS_n) ret = _configure_do(&cfgr, ca); else { - cfgr.prefs = PREFS_n; + prefs->flags = PREFS_n; if(_configure_do(&cfgr, ca) == 0) { - cfgr.prefs = *prefs; + prefs->flags = flags; ret = _configure_do(&cfgr, ca); } } @@ -136,7 +140,7 @@ static void _configure_detect(Configure * configure) configure->os = enum_string(HO_LAST, sHostOS, un.sysname); configure->kernel = enum_string_short(HK_LAST, sHostKernel, un.release); - if(configure->prefs & PREFS_v) + if(configure->prefs->flags & PREFS_v) printf("Detected system %s version %s on %s\n", sHostOS[configure->os], sHostKernel[configure->kernel], @@ -164,7 +168,7 @@ static int _configure_load(Prefs * prefs, String const * directory, return configure_error(directory, 1); } config_set(config, "", "directory", directory); - if(*prefs & PREFS_v) + if(prefs->flags & PREFS_v) printf("%s%s%s", "Loading project file ", path, "\n"); if(config_load(config, path) != 0) ret = configure_error(path, 1); @@ -252,11 +256,20 @@ static int _configure_do(Configure * configure, configArray * ca) /* usage */ +static void _prefs_init(Prefs * prefs); static int _usage(void) { - fprintf(stderr, "%s", "Usage: configure [-nv][directory]\n\ - -n do not actually write Makefiles\n\ - -v verbose mode\n"); + Prefs prefs; + + _prefs_init(&prefs); + fprintf(stderr, "%s%s%s%s%s%s%s", +"Usage: configure [-nv][options...][directory]\n\ + -n Do not actually write Makefiles\n\ + -v Verbose mode\n\ + -b Binary files directory (default: \"", prefs.bindir, "\")\n\ + -d Destination prefix (default: \"\")\n\ + -i Include files directory (default: \"", prefs.includedir, "\")\n\ + -p Installation directory prefix (default: \"", prefs.prefix, "\")\n"); return 1; } @@ -264,17 +277,30 @@ static int _usage(void) /* main */ int main(int argc, char * argv[]) { - Prefs prefs = 0; + Prefs prefs; int o; - while((o = getopt(argc, argv, "nv")) != -1) + _prefs_init(&prefs); + while((o = getopt(argc, argv, "d:i:np:v")) != -1) switch(o) { + case 'b': + prefs.bindir = optarg; + break; + case 'd': + prefs.destdir = optarg; + break; + case 'i': + prefs.includedir = optarg; + break; case 'n': - prefs |= PREFS_n; + prefs.flags |= PREFS_n; + break; + case 'p': + prefs.prefix = optarg; break; case 'v': - prefs |= PREFS_v; + prefs.flags |= PREFS_v; break; case '?': return _usage(); @@ -283,3 +309,21 @@ int main(int argc, char * argv[]) return _usage(); return _configure(&prefs, argc - optind == 1 ? argv[argc - 1] : "."); } + +static void _prefs_init(Prefs * prefs) +{ + struct stat st; + + memset(prefs, 0, sizeof(Prefs)); + prefs->destdir = ""; + if(stat("/usr", &st) == 0) /* FIXME see below */ + { + prefs->bindir = "bin"; + prefs->includedir = "include"; + prefs->prefix = "/usr/local"; + return; + } + prefs->bindir = "Binaries"; + prefs->includedir = "Include"; + prefs->prefix = "/Apps"; /* FIXME detect System or Apps/x first */ +} diff --git a/src/configure.h b/src/configure.h index 6d2640e..c324b88 100644 --- a/src/configure.h +++ b/src/configure.h @@ -12,7 +12,7 @@ typedef enum _HostArch { HA_I386, HA_I486, HA_I586, HA_I686, - HA_SPARC, + HA_SPARC, HA_SPARC64, HA_UNKNOWN } HostArch; # define HA_LAST HA_UNKNOWN @@ -27,10 +27,10 @@ typedef enum _HostOS # define HO_LAST HO_UNKNOWN extern const String * sHostOS[HO_LAST+1]; -typedef enum _HostKernel +typedef enum _HostKernel /* FIXME feels wrong */ { HK_LINUX20, HK_LINUX22, HK_LINUX24, HK_LINUX26, - HK_NETBSD, + HK_NETBSD20, HK_NETBSD30, HK_UNKNOWN } HostKernel; # define HK_LAST HK_UNKNOWN @@ -59,12 +59,19 @@ String * _source_extension(String * source); /* configure */ /* types */ -typedef int Prefs; +typedef struct _Prefs +{ + int flags; + char * bindir; + char * destdir; + char * includedir; + char * prefix; +} Prefs; # define PREFS_n 0x1 # define PREFS_v 0x2 typedef struct _Configure { - Prefs prefs; + Prefs * prefs; HostArch arch; HostOS os; HostKernel kernel; diff --git a/src/makefile.c b/src/makefile.c index 0ed9cb9..d0aa88f 100644 --- a/src/makefile.c +++ b/src/makefile.c @@ -24,11 +24,12 @@ int makefile(Configure * configure, Config * config, String * directory, makefile = string_new(directory); string_append(&makefile, "/"); string_append(&makefile, MAKEFILE); - if(!(configure->prefs & PREFS_n) && (fp = fopen(makefile, "w")) == NULL) + if(!(configure->prefs->flags & PREFS_n) + && (fp = fopen(makefile, "w")) == NULL) ret = configure_error(makefile, 1); else { - if(configure->prefs & PREFS_v) + if(configure->prefs->flags & PREFS_v) printf("%s%s%s%s%s", "Creating ", MAKEFILE, " in ", directory, "\n"); ret |= _makefile_write(configure, config, fp, ca, from, to); @@ -52,14 +53,14 @@ static int _makefile_write(Configure * configure, Config * config, FILE * fp, configArray * ca, int from, int to) { if(_write_variables(configure, config, fp) != 0 - || _write_targets(&configure->prefs, config, fp) != 0 - || _write_objects(&configure->prefs, config, fp) != 0 - || _write_clean(&configure->prefs, config, fp) != 0 - || _write_distclean(&configure->prefs, config, fp) != 0 - || _write_dist(&configure->prefs, config, fp, ca, from, + || _write_targets(configure->prefs, config, fp) != 0 + || _write_objects(configure->prefs, config, fp) != 0 + || _write_clean(configure->prefs, config, fp) != 0 + || _write_distclean(configure->prefs, config, fp) != 0 + || _write_dist(configure->prefs, config, fp, ca, from, to) != 0 - || _write_install(&configure->prefs, config, fp) != 0 - || _write_uninstall(&configure->prefs, config, fp) != 0) + || _write_install(configure->prefs, config, fp) != 0 + || _write_uninstall(configure->prefs, config, fp) != 0) return 1; return 0; } @@ -76,12 +77,12 @@ static int _write_variables(Configure * configure, Config * config, FILE * fp) String const * directory = config_get(config, "", "directory"); int ret = 0; - ret |= _variables_package(&configure->prefs, config, fp, directory); - ret |= _variables_print(&configure->prefs, config, fp, "subdirs", + ret |= _variables_package(configure->prefs, config, fp, directory); + ret |= _variables_print(configure->prefs, config, fp, "subdirs", "SUBDIRS"); - ret |= _variables_targets(&configure->prefs, config, fp); + ret |= _variables_targets(configure->prefs, config, fp); ret |= _variables_executables(configure, config, fp); - if(!(configure->prefs & PREFS_n)) + if(!(configure->prefs->flags & PREFS_n)) fputc('\n', fp); return ret; } @@ -94,17 +95,17 @@ static int _variables_package(Prefs * prefs, Config * config, FILE * fp, if((package = config_get(config, "", "package")) == NULL) return 0; - if(*prefs & PREFS_v) + if(prefs->flags & PREFS_v) printf("%s%s", "Package: ", package); if((version = config_get(config, "", "version")) == NULL) { - if(*prefs & PREFS_v) + if(prefs->flags & PREFS_v) fputc('\n', stdout); fprintf(stderr, "%s%s%s", "configure: ", directory, ": \"package\" needs \"version\"\n"); return 1; } - if(*prefs & PREFS_v) + if(prefs->flags & PREFS_v) printf("%s%s%s", " ", version, "\n"); if(fp != NULL) fprintf(fp, "%s%s%s%s%s", "PACKAGE\t= ", package, @@ -119,7 +120,7 @@ static int _variables_print(Prefs * prefs, Config * config, FILE * fp, int i; char c; - if(*prefs & PREFS_n) + if(prefs->flags & PREFS_n) return 0; if((prints = config_get(config, "", input)) == NULL) return 0; @@ -148,7 +149,7 @@ static int _variables_targets(Prefs * prefs, Config * config, FILE * fp) char c; String * type; - if(*prefs & PREFS_n) + if(prefs->flags & PREFS_n) return 0; if((prints = config_get(config, "", "targets")) == NULL) return 0; @@ -193,7 +194,7 @@ static int _variables_executables(Configure * configure, Config * config, int i; char c; - if(configure->prefs & PREFS_n) + if(configure->prefs->flags & PREFS_n) return 0; if((targets = config_get(config, "", "targets")) != NULL) { @@ -267,10 +268,20 @@ static void _variables_binary(Configure * configure, Config * config, FILE * fp, /* FIXME path given from user or autodetected */ if(!done[TT_LIBRARY]) { - fprintf(fp, "%s", "PREFIX\t= /usr/local\n"); - fprintf(fp, "%s", "DESTDIR\t=\n"); + fprintf(fp, "%s%s\n", "PREFIX\t= ", configure->prefs->prefix); + fprintf(fp, "%s%s\n", "DESTDIR\t= ", configure->prefs->destdir); } - fprintf(fp, "%s", "BINDIR\t= $(PREFIX)/bin\n"); + if(configure->prefs->bindir[0] == '/') + fprintf(fp, "%s%s\n", "BINDIR\t= ", configure->prefs->bindir); + else + fprintf(fp, "%s%s\n", "BINDIR\t= $(PREFIX)/", + configure->prefs->bindir); + if(configure->prefs->includedir[0] == '/') + fprintf(fp, "%s%s\n", "INCLUDEDIR= ", + configure->prefs->includedir); + else + fprintf(fp, "%s%s\n", "INCLUDEDIR= $(PREFIX)/", + configure->prefs->includedir); if(!done[TT_LIBRARY]) { fprintf(fp, "%s", "CC\t= cc\n"); @@ -288,6 +299,7 @@ static void _variables_binary(Configure * configure, Config * config, FILE * fp, fprintf(fp, "%s%s%s", "CFLAGS\t= ", p, "\n"); } + /* FIXME remove -l dl and -l crypt on BSD, check on Solaris etc */ if((p = config_get(config, "", "ldflags_force")) != NULL) fprintf(fp, "%s%s%s", "LDFLAGSF= ", p, "\n"); @@ -363,7 +375,7 @@ static int _write_targets(Prefs * prefs, Config * config, FILE * fp) static int _targets_all(Prefs * prefs, Config * config, FILE * fp) { - if(*prefs & PREFS_n) + if(prefs->flags & PREFS_n) return 0; fprintf(fp, "%s", "\nall:"); if(config_get(config, "", "subdirs") != NULL) @@ -378,7 +390,7 @@ static int _targets_subdirs(Prefs * prefs, Config * config, FILE * fp) { String * subdirs; - if(*prefs & PREFS_n) + if(prefs->flags & PREFS_n) return 0; if((subdirs = config_get(config, "", "subdirs")) != NULL) fprintf(fp, "%s", "\nsubdirs:\n\t@for i in $(SUBDIRS); do" @@ -419,7 +431,7 @@ static int _targets_target(Prefs * prefs, Config * config, FILE * fp, " no sources for target\n"); return 1; } - if(*prefs & PREFS_n) + if(prefs->flags & PREFS_n) return 0; fprintf(fp, "%s%s%s%s", target, ": ", p, "\n"); /* FIXME */ @@ -447,7 +459,7 @@ static int _target_objs(Prefs * prefs, Config * config, FILE * fp, ": no sources defined for target\n"); return 1; } - if(!(*prefs & PREFS_n)) + if(!(prefs->flags & PREFS_n)) fprintf(fp, "%s%s%s", "\n", target, "_OBJS ="); for(i = 0; ret == 0; i++) { @@ -462,7 +474,7 @@ static int _target_objs(Prefs * prefs, Config * config, FILE * fp, sources+=i+1; i = 0; } - if(!(*prefs & PREFS_n)) + if(!(prefs->flags & PREFS_n)) fputc('\n', fp); return ret; } @@ -485,7 +497,7 @@ static int _objs_source(Prefs * prefs, FILE * fp, String * source) { case OT_ASM_SOURCE: case OT_C_SOURCE: - if(*prefs & PREFS_n) + if(prefs->flags & PREFS_n) break; fprintf(fp, "%s%s%s", " ", source, ".o"); break; @@ -506,15 +518,19 @@ static int _target_binary(Prefs * prefs, Config * config, FILE * fp, if(_target_objs(prefs, config, fp, target) != 0) return 1; - if(*prefs & PREFS_n) + if(prefs->flags & PREFS_n) return 0; fprintf(fp, "%s%s", target, "_CFLAGS = $(CFLAGSF) $(CFLAGS)"); if((p = config_get(config, target, "cflags")) != NULL) - fprintf(fp, "%s%s", " ", p); + fprintf(fp, " %s", p); fputc('\n', fp); fprintf(fp, "%s%s%s%s", target, ": $(", target, "_OBJS)\n"); - fprintf(fp, "%s%s%s%s%s", "\t$(CC) $(LDFLAGSF) $(LDFLAGS) -o ", - target, " $(", target, "_OBJS)\n"); + fprintf(fp, "%s", "\t$(CC) $(LDFLAGSF)"); + if((p = config_get(config, target, "ldflags_force")) != NULL) + fprintf(fp, " %s", p); + /* FIXME also find a way to add ldflags */ + fprintf(fp, "%s%s%s%s%s", " $(LDFLAGS) -o ", target, " $(", target, + "_OBJS)\n"); return 0; } @@ -525,7 +541,7 @@ static int _target_library(Prefs * prefs, Config * config, FILE * fp, if(_target_objs(prefs, config, fp, target) != 0) return 1; - if(*prefs & PREFS_n) + if(prefs->flags & PREFS_n) return 0; fprintf(fp, "%s%s", target, "_CFLAGS = $(CFLAGSF) $(CFLAGS)"); if((p = config_get(config, target, "cflags")) != NULL) @@ -612,7 +628,7 @@ static int _target_source(Prefs * prefs, Config * config, FILE * fp, { case OT_ASM_SOURCE: case OT_C_SOURCE: - if(*prefs & PREFS_n) + if(prefs->flags & PREFS_n) break; fprintf(fp, "%s%s%s%s%s%s", "\n", source, ".o: ", source, ".", sObjectType[ot]); @@ -661,7 +677,7 @@ static void _source_c_depends(Config * config, FILE * fp, String * source) static int _clean_targets(Config * config, FILE * fp); static int _write_clean(Prefs * prefs, Config * config, FILE * fp) { - if(*prefs & PREFS_n) + if(prefs->flags & PREFS_n) return 0; fprintf(fp, "%s", "\nclean:\n"); if(config_get(config, "", "subdirs") != NULL) @@ -700,7 +716,7 @@ static int _write_distclean(Prefs * prefs, Config * config, FILE * fp) { String * subdirs; - if(*prefs & PREFS_n) + if(prefs->flags & PREFS_n) return 0; fprintf(fp, "%s", "\ndistclean:"); if((subdirs = config_get(config, "", "subdirs")) == NULL) @@ -725,7 +741,7 @@ static int _write_dist(Prefs * prefs, Config * config, FILE * fp, Config * p; int i; - if(*prefs & PREFS_n) + if(prefs->flags & PREFS_n) return 0; if((package = config_get(config, "", "package")) == NULL || (version = config_get(config, "", "version")) @@ -826,7 +842,7 @@ static int _write_install(Prefs * prefs, Config * config, FILE * fp) int i; char c; - if(*prefs & PREFS_n) + if(prefs->flags & PREFS_n) return 0; fprintf(fp, "%s", "\ninstall: all\n"); if((subdirs = config_get(config, "", "subdirs")) != NULL) @@ -901,7 +917,7 @@ static int _write_uninstall(Prefs * prefs, Config * config, FILE * fp) int i; char c; - if(*prefs & PREFS_n) + if(prefs->flags & PREFS_n) return 0; fprintf(fp, "%s", "\nuninstall:\n"); if((subdirs = config_get(config, "", "subdirs")) != NULL)