Implemented preliminary installation path detection and manual setting
This commit is contained in:
parent
8b84b42438
commit
49a5705683
@ -3,10 +3,13 @@
|
||||
|
||||
|
||||
#include <System.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/utsname.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#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 */
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user