Supports C++
This commit is contained in:
parent
4ff593d080
commit
b2783ff65c
@ -46,7 +46,8 @@ const struct HostKernel sHostKernel[] =
|
||||
};
|
||||
|
||||
const String * sTargetType[TT_LAST] = { "binary", "library", "object" };
|
||||
const String * sObjectType[OT_LAST] = { "c", "S" };
|
||||
const String * sObjectType[OT_LAST] = { "c", "cc", "cpp", "S" };
|
||||
|
||||
String * _source_extension(String * source)
|
||||
{
|
||||
int len;
|
||||
|
@ -53,7 +53,10 @@ extern const String * sTargetType[TT_LAST];
|
||||
|
||||
typedef enum _ObjectType
|
||||
{
|
||||
OT_C_SOURCE = 0, OT_ASM_SOURCE, OT_UNKNOWN
|
||||
OT_C_SOURCE = 0,
|
||||
OT_CXX_SOURCE, OT_CPP_SOURCE,
|
||||
OT_ASM_SOURCE,
|
||||
OT_UNKNOWN
|
||||
} ObjectType;
|
||||
# define OT_LAST OT_UNKNOWN
|
||||
extern const String * sObjectType[OT_LAST];
|
||||
|
177
src/makefile.c
177
src/makefile.c
@ -274,6 +274,8 @@ static int _executables_variables(Configure * configure, Config * config,
|
||||
}
|
||||
|
||||
static void _targets_cflags(Configure * configure, Config * config, FILE * fp);
|
||||
static void _targets_cxxflags(Configure * configure, Config * config,
|
||||
FILE * fp);
|
||||
static void _binary_ldflags(Configure * configure, FILE * fp,
|
||||
String const * ldflags);
|
||||
static void _variables_binary(Configure * configure, Config * config, FILE * fp,
|
||||
@ -298,9 +300,11 @@ static void _variables_binary(Configure * configure, Config * config, FILE * fp,
|
||||
fprintf(fp, "%s%s\n", "INCLUDEDIR= $(PREFIX)/",
|
||||
configure->prefs->includedir);
|
||||
if(!done[TT_LIBRARY])
|
||||
{
|
||||
_targets_cflags(configure, config, fp);
|
||||
if((p = config_get(config, "", "ldflags_force"))
|
||||
!= NULL)
|
||||
_targets_cxxflags(configure, config, fp);
|
||||
}
|
||||
if((p = config_get(config, "", "ldflags_force")) != NULL)
|
||||
{
|
||||
fprintf(fp, "%s", "LDFLAGSF= ");
|
||||
_binary_ldflags(configure, fp, p);
|
||||
@ -315,22 +319,47 @@ static void _variables_binary(Configure * configure, Config * config, FILE * fp,
|
||||
static void _targets_cflags(Configure * configure, Config * config, FILE * fp)
|
||||
{
|
||||
String const * p;
|
||||
String const * q;
|
||||
|
||||
fprintf(fp, "%s", "CC\t= cc\nCFLAGSF\t=");
|
||||
if((p = config_get(config, "", "cflags_force")) != NULL)
|
||||
{
|
||||
fprintf(fp, " %s", p);
|
||||
fprintf(fp, "%s%s", "CC\t= cc\nCFLAGSF\t= ", p);
|
||||
if(configure->os == HO_GNU_LINUX && string_find(p, "-ansi"))
|
||||
fprintf(fp, "%s", " -D_GNU_SOURCE");
|
||||
fputc('\n', fp);
|
||||
}
|
||||
fprintf(fp, "%s", "\nCFLAGS\t=");
|
||||
if((p = config_get(config, "", "cflags")) != NULL)
|
||||
if((q = config_get(config, "", "cflags")) != NULL)
|
||||
{
|
||||
fprintf(fp, " %s", p);
|
||||
if(p == NULL)
|
||||
fprintf(fp, "%s", "CC\t= cc\n");
|
||||
fprintf(fp, "%s%s", "CFLAGS\t= ", p);
|
||||
if(configure->os == HO_GNU_LINUX && string_find(p, "-ansi"))
|
||||
fprintf(fp, "%s", " -D_GNU_SOURCE");
|
||||
fputc('\n', fp);
|
||||
}
|
||||
}
|
||||
|
||||
static void _targets_cxxflags(Configure * configure, Config * config, FILE * fp)
|
||||
{
|
||||
String const * p;
|
||||
String const * q;
|
||||
|
||||
if((p = config_get(config, "", "cxxflags_force")) != NULL)
|
||||
{
|
||||
fprintf(fp, "%s%s", "CXX\t= c++\nCXXFLAGSF= ", p);
|
||||
if(configure->os == HO_GNU_LINUX && string_find(p, "-ansi"))
|
||||
fprintf(fp, "%s", " -D_GNU_SOURCE");
|
||||
fputc('\n', fp);
|
||||
}
|
||||
if((q = config_get(config, "", "cxxflags")) != NULL)
|
||||
{
|
||||
if(p == NULL)
|
||||
fprintf(fp, "%s", "CXX\t= c++\n");
|
||||
fprintf(fp, "%s%s", "CXXFLAGS= ", p);
|
||||
if(configure->os == HO_GNU_LINUX && string_find(p, "-ansi"))
|
||||
fprintf(fp, "%s", " -D_GNU_SOURCE");
|
||||
fputc('\n', fp);
|
||||
}
|
||||
fputc('\n', fp);
|
||||
}
|
||||
|
||||
static void _binary_ldflags(Configure * configure, FILE * fp,
|
||||
@ -342,7 +371,7 @@ static void _binary_ldflags(Configure * configure, FILE * fp,
|
||||
char buf[10];
|
||||
char ** libs;
|
||||
char * p;
|
||||
char * q;
|
||||
String * q;
|
||||
int i;
|
||||
|
||||
if((p = string_new(ldflags)) == NULL)
|
||||
@ -374,7 +403,7 @@ static void _binary_ldflags(Configure * configure, FILE * fp,
|
||||
continue;
|
||||
memmove(q, q + strlen(buf), strlen(q) - strlen(buf) + 1);
|
||||
}
|
||||
fprintf(fp, "%s%s", p, "\n");
|
||||
fprintf(fp, "%s\n", p);
|
||||
free(p);
|
||||
}
|
||||
|
||||
@ -392,7 +421,10 @@ static void _variables_library(Configure * configure, Config * config,
|
||||
fprintf(fp, "%s%s\n", "LIBDIR\t= $(PREFIX)/",
|
||||
configure->prefs->libdir);
|
||||
if(!done[TT_BINARY])
|
||||
{
|
||||
_targets_cflags(configure, config, fp);
|
||||
_targets_cxxflags(configure, config, fp);
|
||||
}
|
||||
fprintf(fp, "%s", "AR\t= ar -rc\n");
|
||||
fprintf(fp, "%s", "RANLIB\t= ranlib\n");
|
||||
fprintf(fp, "%s", "LD\t= ld -shared\n");
|
||||
@ -558,6 +590,12 @@ static int _objs_source(Prefs * prefs, FILE * fp, String * source)
|
||||
break;
|
||||
fprintf(fp, "%s%s%s", " ", source, ".o");
|
||||
break;
|
||||
case OT_CXX_SOURCE:
|
||||
case OT_CPP_SOURCE:
|
||||
if(prefs->flags & PREFS_n)
|
||||
break;
|
||||
fprintf(fp, "%s%s%s", " ", source, ".o");
|
||||
break;
|
||||
case OT_UNKNOWN:
|
||||
ret = 1;
|
||||
fprintf(stderr, "%s%s%s", "configure: ", source,
|
||||
@ -568,6 +606,7 @@ static int _objs_source(Prefs * prefs, FILE * fp, String * source)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void _target_flags(Config * config, FILE * fp, String * target);
|
||||
static int _target_binary(Prefs * prefs, Config * config, FILE * fp,
|
||||
String * target)
|
||||
{
|
||||
@ -577,33 +616,97 @@ static int _target_binary(Prefs * prefs, Config * config, FILE * fp,
|
||||
return 1;
|
||||
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", p);
|
||||
fputc('\n', fp);
|
||||
_target_flags(config, fp, target);
|
||||
fprintf(fp, "%s%s%s%s", target, ": $(", target, "_OBJS)\n");
|
||||
fprintf(fp, "%s", "\t$(CC) $(LDFLAGSF)");
|
||||
if((p = config_get(config, target, "ldflags_force")) != NULL)
|
||||
if((p = config_get(config, target, "ldflags")) != 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;
|
||||
}
|
||||
|
||||
static void _flags_c(Config * config, FILE * fp, String * target);
|
||||
static void _flags_cxx(Config * config, FILE * fp, String * target);
|
||||
static void _target_flags(Config * config, FILE * fp, String * target)
|
||||
{
|
||||
char done[OT_LAST+1];
|
||||
String * sources;
|
||||
String * extension;
|
||||
ObjectType type;
|
||||
char c;
|
||||
unsigned int i;
|
||||
|
||||
memset(done, 0, sizeof(done));
|
||||
if((sources = config_get(config, target, "sources")) == NULL)
|
||||
return;
|
||||
for(i = 0;; i++)
|
||||
{
|
||||
if(sources[i] != ',' && sources[i] != '\0')
|
||||
continue;
|
||||
c = sources[i];
|
||||
sources[i] = '\0';
|
||||
extension = _source_extension(sources);
|
||||
if(extension == NULL)
|
||||
{
|
||||
sources[i] = c;
|
||||
continue;
|
||||
}
|
||||
type = enum_string(OT_LAST, sObjectType, extension);
|
||||
sources[i] = c;
|
||||
if(!done[type])
|
||||
switch(type)
|
||||
{
|
||||
case OT_ASM_SOURCE:
|
||||
break;
|
||||
case OT_C_SOURCE:
|
||||
_flags_c(config, fp, target);
|
||||
break;
|
||||
case OT_CXX_SOURCE:
|
||||
case OT_CPP_SOURCE:
|
||||
done[OT_CXX_SOURCE] = 1;
|
||||
done[OT_CPP_SOURCE] = 1;
|
||||
_flags_cxx(config, fp, target);
|
||||
break;
|
||||
case OT_UNKNOWN:
|
||||
break;
|
||||
}
|
||||
done[type] = 1;
|
||||
if(c == '\0')
|
||||
break;
|
||||
sources+=i+1;
|
||||
i = 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void _flags_c(Config * config, FILE * fp, String * target)
|
||||
{
|
||||
char * p;
|
||||
|
||||
fprintf(fp, "%s%s", target, "_CFLAGS = $(CFLAGSF) $(CFLAGS)");
|
||||
if((p = config_get(config, target, "cflags")) != NULL)
|
||||
fprintf(fp, " %s", p);
|
||||
fputc('\n', fp);
|
||||
}
|
||||
|
||||
static void _flags_cxx(Config * config, FILE * fp, String * target)
|
||||
{
|
||||
char * p;
|
||||
|
||||
fprintf(fp, "%s%s", target, "_CXXFLAGS = $(CXXFLAGSF) $(CXXFLAGS)");
|
||||
if((p = config_get(config, target, "cxxflags")) != NULL)
|
||||
fprintf(fp, " %s", p);
|
||||
fputc('\n', fp);
|
||||
}
|
||||
|
||||
static int _target_library(Prefs * prefs, Config * config, FILE * fp,
|
||||
String * target)
|
||||
{
|
||||
String * p;
|
||||
|
||||
if(_target_objs(prefs, config, fp, target) != 0)
|
||||
return 1;
|
||||
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);
|
||||
fputc('\n', fp);
|
||||
_target_flags(config, fp, target);
|
||||
fprintf(fp, "%s%s%s%s", target, ".a: $(", target, "_OBJS)\n");
|
||||
fprintf(fp, "%s%s%s%s%s", "\t$(AR) ", target, ".a $(", target,
|
||||
"_OBJS)\n");
|
||||
@ -676,6 +779,7 @@ static int _target_source(Prefs * prefs, Config * config, FILE * fp,
|
||||
String * extension;
|
||||
ObjectType ot;
|
||||
int len;
|
||||
String const * p;
|
||||
|
||||
if((extension = _source_extension(source)) == NULL)
|
||||
return 1;
|
||||
@ -691,15 +795,38 @@ static int _target_source(Prefs * prefs, Config * config, FILE * fp,
|
||||
source, ".", sObjectType[ot]);
|
||||
source[len] = '.'; /* FIXME ugly */
|
||||
_source_c_depends(config, fp, source);
|
||||
p = config_get(config, source, "cflags");
|
||||
source[len] = '\0';
|
||||
fputc('\n', fp);
|
||||
fprintf(fp, "%s%s%s%s%s%s", "\t$(CC) $(", target,
|
||||
"_CFLAGS) -c ", source, ".",
|
||||
fprintf(fp, "%s%s%s", "\n\t$(CC) $(", target,
|
||||
"_CFLAGS)");
|
||||
if(p != NULL)
|
||||
fprintf(fp, " %s", p);
|
||||
fprintf(fp, "%s%s%s%s", " -c ", source, ".",
|
||||
sObjectType[ot]);
|
||||
if(string_find(source, "/"))
|
||||
fprintf(fp, "%s%s%s", " -o ", source, ".o");
|
||||
fputc('\n', fp);
|
||||
break;
|
||||
case OT_CXX_SOURCE:
|
||||
case OT_CPP_SOURCE:
|
||||
if(prefs->flags & PREFS_n)
|
||||
break;
|
||||
fprintf(fp, "%s%s%s%s%s%s", "\n", source, ".o: ",
|
||||
source, ".", sObjectType[ot]);
|
||||
source[len] = '.'; /* FIXME ugly */
|
||||
_source_c_depends(config, fp, source);
|
||||
p = config_get(config, source, "cxxflags");
|
||||
source[len] = '\0';
|
||||
fprintf(fp, "%s%s%s", "\n\t$(CXX) $(", target,
|
||||
"_CXXFLAGS)");
|
||||
if(p != NULL)
|
||||
fprintf(fp, " %s", p);
|
||||
fprintf(fp, "%s%s%s%s", " -c ", source, ".",
|
||||
sObjectType[ot]);
|
||||
if(string_find(source, "/"))
|
||||
fprintf(fp, "%s%s%s", " -o ", source, ".o");
|
||||
fputc('\n', fp);
|
||||
break;
|
||||
case OT_UNKNOWN:
|
||||
ret = 1;
|
||||
break;
|
||||
|
Loading…
Reference in New Issue
Block a user