Implemented preliminary installation path detection and manual setting

This commit is contained in:
Pierre Pronchery 2006-04-18 21:19:29 +00:00
parent 8b84b42438
commit 49a5705683
3 changed files with 126 additions and 59 deletions

View File

@ -3,10 +3,13 @@
#include <System.h> #include <System.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/utsname.h> #include <sys/utsname.h>
#include <unistd.h> #include <unistd.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <string.h>
#include "makefile.h" #include "makefile.h"
#include "configure.h" #include "configure.h"
@ -16,7 +19,7 @@
const String * sHostArch[HA_LAST+1] = const String * sHostArch[HA_LAST+1] =
{ {
"i386", "i486", "i586", "i686", "i386", "i486", "i586", "i686",
"sparc", "sparc", "sparc64",
"unknown" "unknown"
}; };
const String * sHostOS[HO_LAST+1] = const String * sHostOS[HO_LAST+1] =
@ -28,7 +31,7 @@ const String * sHostOS[HO_LAST+1] =
const String * sHostKernel[HK_LAST+1] = const String * sHostKernel[HK_LAST+1] =
{ {
"2.0", "2.2", "2.4", "2.6", "2.0", "2.2", "2.4", "2.6",
"2.0", "2.0", "3.0",
"unknown" "unknown"
}; };
@ -87,24 +90,25 @@ static int _configure(Prefs * prefs, char const * directory)
Configure cfgr; Configure cfgr;
configArray * ca; configArray * ca;
int ret; int ret;
int flags = prefs->flags;
int i; int i;
Config * p; Config * p;
if((ca = configarray_new()) == NULL) if((ca = configarray_new()) == NULL)
return configure_error("libSystem", 2); return configure_error("libSystem", 2);
cfgr.prefs = *prefs; cfgr.prefs = prefs;
_configure_detect(&cfgr); _configure_detect(&cfgr);
ret = _configure_load(prefs, directory, ca); ret = _configure_load(prefs, directory, ca);
if(ret == 0) if(ret == 0)
{ {
if(*prefs & PREFS_n) if(prefs->flags & PREFS_n)
ret = _configure_do(&cfgr, ca); ret = _configure_do(&cfgr, ca);
else else
{ {
cfgr.prefs = PREFS_n; prefs->flags = PREFS_n;
if(_configure_do(&cfgr, ca) == 0) if(_configure_do(&cfgr, ca) == 0)
{ {
cfgr.prefs = *prefs; prefs->flags = flags;
ret = _configure_do(&cfgr, ca); 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->os = enum_string(HO_LAST, sHostOS, un.sysname);
configure->kernel = enum_string_short(HK_LAST, sHostKernel, configure->kernel = enum_string_short(HK_LAST, sHostKernel,
un.release); un.release);
if(configure->prefs & PREFS_v) if(configure->prefs->flags & PREFS_v)
printf("Detected system %s version %s on %s\n", printf("Detected system %s version %s on %s\n",
sHostOS[configure->os], sHostOS[configure->os],
sHostKernel[configure->kernel], sHostKernel[configure->kernel],
@ -164,7 +168,7 @@ static int _configure_load(Prefs * prefs, String const * directory,
return configure_error(directory, 1); return configure_error(directory, 1);
} }
config_set(config, "", "directory", directory); config_set(config, "", "directory", directory);
if(*prefs & PREFS_v) if(prefs->flags & PREFS_v)
printf("%s%s%s", "Loading project file ", path, "\n"); printf("%s%s%s", "Loading project file ", path, "\n");
if(config_load(config, path) != 0) if(config_load(config, path) != 0)
ret = configure_error(path, 1); ret = configure_error(path, 1);
@ -252,11 +256,20 @@ static int _configure_do(Configure * configure, configArray * ca)
/* usage */ /* usage */
static void _prefs_init(Prefs * prefs);
static int _usage(void) static int _usage(void)
{ {
fprintf(stderr, "%s", "Usage: configure [-nv][directory]\n\ Prefs prefs;
-n do not actually write Makefiles\n\
-v verbose mode\n"); _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; return 1;
} }
@ -264,17 +277,30 @@ static int _usage(void)
/* main */ /* main */
int main(int argc, char * argv[]) int main(int argc, char * argv[])
{ {
Prefs prefs = 0; Prefs prefs;
int o; int o;
while((o = getopt(argc, argv, "nv")) != -1) _prefs_init(&prefs);
while((o = getopt(argc, argv, "d:i:np:v")) != -1)
switch(o) switch(o)
{ {
case 'b':
prefs.bindir = optarg;
break;
case 'd':
prefs.destdir = optarg;
break;
case 'i':
prefs.includedir = optarg;
break;
case 'n': case 'n':
prefs |= PREFS_n; prefs.flags |= PREFS_n;
break;
case 'p':
prefs.prefix = optarg;
break; break;
case 'v': case 'v':
prefs |= PREFS_v; prefs.flags |= PREFS_v;
break; break;
case '?': case '?':
return _usage(); return _usage();
@ -283,3 +309,21 @@ int main(int argc, char * argv[])
return _usage(); return _usage();
return _configure(&prefs, argc - optind == 1 ? argv[argc - 1] : "."); 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 */
}

View File

@ -12,7 +12,7 @@
typedef enum _HostArch typedef enum _HostArch
{ {
HA_I386, HA_I486, HA_I586, HA_I686, HA_I386, HA_I486, HA_I586, HA_I686,
HA_SPARC, HA_SPARC, HA_SPARC64,
HA_UNKNOWN HA_UNKNOWN
} HostArch; } HostArch;
# define HA_LAST HA_UNKNOWN # define HA_LAST HA_UNKNOWN
@ -27,10 +27,10 @@ typedef enum _HostOS
# define HO_LAST HO_UNKNOWN # define HO_LAST HO_UNKNOWN
extern const String * sHostOS[HO_LAST+1]; 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_LINUX20, HK_LINUX22, HK_LINUX24, HK_LINUX26,
HK_NETBSD, HK_NETBSD20, HK_NETBSD30,
HK_UNKNOWN HK_UNKNOWN
} HostKernel; } HostKernel;
# define HK_LAST HK_UNKNOWN # define HK_LAST HK_UNKNOWN
@ -59,12 +59,19 @@ String * _source_extension(String * source);
/* configure */ /* configure */
/* types */ /* types */
typedef int Prefs; typedef struct _Prefs
{
int flags;
char * bindir;
char * destdir;
char * includedir;
char * prefix;
} Prefs;
# define PREFS_n 0x1 # define PREFS_n 0x1
# define PREFS_v 0x2 # define PREFS_v 0x2
typedef struct _Configure typedef struct _Configure
{ {
Prefs prefs; Prefs * prefs;
HostArch arch; HostArch arch;
HostOS os; HostOS os;
HostKernel kernel; HostKernel kernel;

View File

@ -24,11 +24,12 @@ int makefile(Configure * configure, Config * config, String * directory,
makefile = string_new(directory); makefile = string_new(directory);
string_append(&makefile, "/"); string_append(&makefile, "/");
string_append(&makefile, 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); ret = configure_error(makefile, 1);
else else
{ {
if(configure->prefs & PREFS_v) if(configure->prefs->flags & PREFS_v)
printf("%s%s%s%s%s", "Creating ", MAKEFILE, " in ", printf("%s%s%s%s%s", "Creating ", MAKEFILE, " in ",
directory, "\n"); directory, "\n");
ret |= _makefile_write(configure, config, fp, ca, from, to); 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) configArray * ca, int from, int to)
{ {
if(_write_variables(configure, config, fp) != 0 if(_write_variables(configure, config, fp) != 0
|| _write_targets(&configure->prefs, config, fp) != 0 || _write_targets(configure->prefs, config, fp) != 0
|| _write_objects(&configure->prefs, config, fp) != 0 || _write_objects(configure->prefs, config, fp) != 0
|| _write_clean(&configure->prefs, config, fp) != 0 || _write_clean(configure->prefs, config, fp) != 0
|| _write_distclean(&configure->prefs, config, fp) != 0 || _write_distclean(configure->prefs, config, fp) != 0
|| _write_dist(&configure->prefs, config, fp, ca, from, || _write_dist(configure->prefs, config, fp, ca, from,
to) != 0 to) != 0
|| _write_install(&configure->prefs, config, fp) != 0 || _write_install(configure->prefs, config, fp) != 0
|| _write_uninstall(&configure->prefs, config, fp) != 0) || _write_uninstall(configure->prefs, config, fp) != 0)
return 1; return 1;
return 0; return 0;
} }
@ -76,12 +77,12 @@ static int _write_variables(Configure * configure, Config * config, FILE * fp)
String const * directory = config_get(config, "", "directory"); String const * directory = config_get(config, "", "directory");
int ret = 0; int ret = 0;
ret |= _variables_package(&configure->prefs, config, fp, directory); ret |= _variables_package(configure->prefs, config, fp, directory);
ret |= _variables_print(&configure->prefs, config, fp, "subdirs", ret |= _variables_print(configure->prefs, config, fp, "subdirs",
"SUBDIRS"); "SUBDIRS");
ret |= _variables_targets(&configure->prefs, config, fp); ret |= _variables_targets(configure->prefs, config, fp);
ret |= _variables_executables(configure, config, fp); ret |= _variables_executables(configure, config, fp);
if(!(configure->prefs & PREFS_n)) if(!(configure->prefs->flags & PREFS_n))
fputc('\n', fp); fputc('\n', fp);
return ret; return ret;
} }
@ -94,17 +95,17 @@ static int _variables_package(Prefs * prefs, Config * config, FILE * fp,
if((package = config_get(config, "", "package")) == NULL) if((package = config_get(config, "", "package")) == NULL)
return 0; return 0;
if(*prefs & PREFS_v) if(prefs->flags & PREFS_v)
printf("%s%s", "Package: ", package); printf("%s%s", "Package: ", package);
if((version = config_get(config, "", "version")) == NULL) if((version = config_get(config, "", "version")) == NULL)
{ {
if(*prefs & PREFS_v) if(prefs->flags & PREFS_v)
fputc('\n', stdout); fputc('\n', stdout);
fprintf(stderr, "%s%s%s", "configure: ", directory, fprintf(stderr, "%s%s%s", "configure: ", directory,
": \"package\" needs \"version\"\n"); ": \"package\" needs \"version\"\n");
return 1; return 1;
} }
if(*prefs & PREFS_v) if(prefs->flags & PREFS_v)
printf("%s%s%s", " ", version, "\n"); printf("%s%s%s", " ", version, "\n");
if(fp != NULL) if(fp != NULL)
fprintf(fp, "%s%s%s%s%s", "PACKAGE\t= ", package, 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; int i;
char c; char c;
if(*prefs & PREFS_n) if(prefs->flags & PREFS_n)
return 0; return 0;
if((prints = config_get(config, "", input)) == NULL) if((prints = config_get(config, "", input)) == NULL)
return 0; return 0;
@ -148,7 +149,7 @@ static int _variables_targets(Prefs * prefs, Config * config, FILE * fp)
char c; char c;
String * type; String * type;
if(*prefs & PREFS_n) if(prefs->flags & PREFS_n)
return 0; return 0;
if((prints = config_get(config, "", "targets")) == NULL) if((prints = config_get(config, "", "targets")) == NULL)
return 0; return 0;
@ -193,7 +194,7 @@ static int _variables_executables(Configure * configure, Config * config,
int i; int i;
char c; char c;
if(configure->prefs & PREFS_n) if(configure->prefs->flags & PREFS_n)
return 0; return 0;
if((targets = config_get(config, "", "targets")) != NULL) 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 */ /* FIXME path given from user or autodetected */
if(!done[TT_LIBRARY]) if(!done[TT_LIBRARY])
{ {
fprintf(fp, "%s", "PREFIX\t= /usr/local\n"); fprintf(fp, "%s%s\n", "PREFIX\t= ", configure->prefs->prefix);
fprintf(fp, "%s", "DESTDIR\t=\n"); 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]) if(!done[TT_LIBRARY])
{ {
fprintf(fp, "%s", "CC\t= cc\n"); 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, fprintf(fp, "%s%s%s", "CFLAGS\t= ", p,
"\n"); "\n");
} }
/* FIXME remove -l dl and -l crypt on BSD, check on Solaris etc */
if((p = config_get(config, "", "ldflags_force")) if((p = config_get(config, "", "ldflags_force"))
!= NULL) != NULL)
fprintf(fp, "%s%s%s", "LDFLAGSF= ", p, "\n"); 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) static int _targets_all(Prefs * prefs, Config * config, FILE * fp)
{ {
if(*prefs & PREFS_n) if(prefs->flags & PREFS_n)
return 0; return 0;
fprintf(fp, "%s", "\nall:"); fprintf(fp, "%s", "\nall:");
if(config_get(config, "", "subdirs") != NULL) if(config_get(config, "", "subdirs") != NULL)
@ -378,7 +390,7 @@ static int _targets_subdirs(Prefs * prefs, Config * config, FILE * fp)
{ {
String * subdirs; String * subdirs;
if(*prefs & PREFS_n) if(prefs->flags & PREFS_n)
return 0; return 0;
if((subdirs = config_get(config, "", "subdirs")) != NULL) if((subdirs = config_get(config, "", "subdirs")) != NULL)
fprintf(fp, "%s", "\nsubdirs:\n\t@for i in $(SUBDIRS); do" 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"); " no sources for target\n");
return 1; return 1;
} }
if(*prefs & PREFS_n) if(prefs->flags & PREFS_n)
return 0; return 0;
fprintf(fp, "%s%s%s%s", target, ": ", p, "\n"); fprintf(fp, "%s%s%s%s", target, ": ", p, "\n");
/* FIXME */ /* FIXME */
@ -447,7 +459,7 @@ static int _target_objs(Prefs * prefs, Config * config, FILE * fp,
": no sources defined for target\n"); ": no sources defined for target\n");
return 1; return 1;
} }
if(!(*prefs & PREFS_n)) if(!(prefs->flags & PREFS_n))
fprintf(fp, "%s%s%s", "\n", target, "_OBJS ="); fprintf(fp, "%s%s%s", "\n", target, "_OBJS =");
for(i = 0; ret == 0; i++) for(i = 0; ret == 0; i++)
{ {
@ -462,7 +474,7 @@ static int _target_objs(Prefs * prefs, Config * config, FILE * fp,
sources+=i+1; sources+=i+1;
i = 0; i = 0;
} }
if(!(*prefs & PREFS_n)) if(!(prefs->flags & PREFS_n))
fputc('\n', fp); fputc('\n', fp);
return ret; return ret;
} }
@ -485,7 +497,7 @@ static int _objs_source(Prefs * prefs, FILE * fp, String * source)
{ {
case OT_ASM_SOURCE: case OT_ASM_SOURCE:
case OT_C_SOURCE: case OT_C_SOURCE:
if(*prefs & PREFS_n) if(prefs->flags & PREFS_n)
break; break;
fprintf(fp, "%s%s%s", " ", source, ".o"); fprintf(fp, "%s%s%s", " ", source, ".o");
break; break;
@ -506,15 +518,19 @@ static int _target_binary(Prefs * prefs, Config * config, FILE * fp,
if(_target_objs(prefs, config, fp, target) != 0) if(_target_objs(prefs, config, fp, target) != 0)
return 1; return 1;
if(*prefs & PREFS_n) if(prefs->flags & PREFS_n)
return 0; return 0;
fprintf(fp, "%s%s", target, "_CFLAGS = $(CFLAGSF) $(CFLAGS)"); fprintf(fp, "%s%s", target, "_CFLAGS = $(CFLAGSF) $(CFLAGS)");
if((p = config_get(config, target, "cflags")) != NULL) if((p = config_get(config, target, "cflags")) != NULL)
fprintf(fp, "%s%s", " ", p); fprintf(fp, " %s", p);
fputc('\n', fp); fputc('\n', fp);
fprintf(fp, "%s%s%s%s", target, ": $(", target, "_OBJS)\n"); fprintf(fp, "%s%s%s%s", target, ": $(", target, "_OBJS)\n");
fprintf(fp, "%s%s%s%s%s", "\t$(CC) $(LDFLAGSF) $(LDFLAGS) -o ", fprintf(fp, "%s", "\t$(CC) $(LDFLAGSF)");
target, " $(", target, "_OBJS)\n"); 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; return 0;
} }
@ -525,7 +541,7 @@ static int _target_library(Prefs * prefs, Config * config, FILE * fp,
if(_target_objs(prefs, config, fp, target) != 0) if(_target_objs(prefs, config, fp, target) != 0)
return 1; return 1;
if(*prefs & PREFS_n) if(prefs->flags & PREFS_n)
return 0; return 0;
fprintf(fp, "%s%s", target, "_CFLAGS = $(CFLAGSF) $(CFLAGS)"); fprintf(fp, "%s%s", target, "_CFLAGS = $(CFLAGSF) $(CFLAGS)");
if((p = config_get(config, target, "cflags")) != NULL) 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_ASM_SOURCE:
case OT_C_SOURCE: case OT_C_SOURCE:
if(*prefs & PREFS_n) if(prefs->flags & PREFS_n)
break; break;
fprintf(fp, "%s%s%s%s%s%s", "\n", source, ".o: ", fprintf(fp, "%s%s%s%s%s%s", "\n", source, ".o: ",
source, ".", sObjectType[ot]); 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 _clean_targets(Config * config, FILE * fp);
static int _write_clean(Prefs * prefs, 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; return 0;
fprintf(fp, "%s", "\nclean:\n"); fprintf(fp, "%s", "\nclean:\n");
if(config_get(config, "", "subdirs") != NULL) if(config_get(config, "", "subdirs") != NULL)
@ -700,7 +716,7 @@ static int _write_distclean(Prefs * prefs, Config * config, FILE * fp)
{ {
String * subdirs; String * subdirs;
if(*prefs & PREFS_n) if(prefs->flags & PREFS_n)
return 0; return 0;
fprintf(fp, "%s", "\ndistclean:"); fprintf(fp, "%s", "\ndistclean:");
if((subdirs = config_get(config, "", "subdirs")) == NULL) if((subdirs = config_get(config, "", "subdirs")) == NULL)
@ -725,7 +741,7 @@ static int _write_dist(Prefs * prefs, Config * config, FILE * fp,
Config * p; Config * p;
int i; int i;
if(*prefs & PREFS_n) if(prefs->flags & PREFS_n)
return 0; return 0;
if((package = config_get(config, "", "package")) == NULL if((package = config_get(config, "", "package")) == NULL
|| (version = config_get(config, "", "version")) || (version = config_get(config, "", "version"))
@ -826,7 +842,7 @@ static int _write_install(Prefs * prefs, Config * config, FILE * fp)
int i; int i;
char c; char c;
if(*prefs & PREFS_n) if(prefs->flags & PREFS_n)
return 0; return 0;
fprintf(fp, "%s", "\ninstall: all\n"); fprintf(fp, "%s", "\ninstall: all\n");
if((subdirs = config_get(config, "", "subdirs")) != NULL) if((subdirs = config_get(config, "", "subdirs")) != NULL)
@ -901,7 +917,7 @@ static int _write_uninstall(Prefs * prefs, Config * config, FILE * fp)
int i; int i;
char c; char c;
if(*prefs & PREFS_n) if(prefs->flags & PREFS_n)
return 0; return 0;
fprintf(fp, "%s", "\nuninstall:\n"); fprintf(fp, "%s", "\nuninstall:\n");
if((subdirs = config_get(config, "", "subdirs")) != NULL) if((subdirs = config_get(config, "", "subdirs")) != NULL)