fixed some bugs in parser
This commit is contained in:
parent
63f0379df0
commit
9363c73bbd
@ -6,8 +6,7 @@ gcc: {
|
||||
src_dirs: [ "src" ],
|
||||
};
|
||||
|
||||
configurations: {
|
||||
release: {
|
||||
release: {
|
||||
preprocess_sources: {
|
||||
src_languages: [ "c", "c++" ],
|
||||
src_dirs: [ "src" ],
|
||||
@ -15,8 +14,7 @@ configurations: {
|
||||
gcc: {
|
||||
pre_args: [ "-O2" ],
|
||||
post_args: [ "-Wl,--gc-sections" ],
|
||||
};
|
||||
};
|
||||
},
|
||||
};
|
||||
|
||||
tasks: {
|
||||
@ -24,7 +22,7 @@ tasks: {
|
||||
pre_tasks: [ ],
|
||||
tool_order: [ "preprocess_sources", "gcc", "g++", "g++-link" ],
|
||||
#g++: [ ... ],
|
||||
};
|
||||
},
|
||||
};
|
||||
|
||||
languages: [
|
||||
@ -35,14 +33,20 @@ languages: [
|
||||
{
|
||||
aliases: [ "c-header" ],
|
||||
file_extensions: [ "h" ],
|
||||
}
|
||||
},
|
||||
];
|
||||
|
||||
tools: [
|
||||
{
|
||||
aliases: [ "preprocess_sources" ],
|
||||
exe_file: "echo",
|
||||
supported_languages: [ "any" ],
|
||||
parallel: false,
|
||||
},
|
||||
{
|
||||
aliases: [ "gcc" ],
|
||||
exe_file: "gcc",
|
||||
supported_languages: [ "c" ]; # set to "any" to use with any lang
|
||||
parallel: false,
|
||||
}
|
||||
},
|
||||
];
|
||||
@ -74,11 +74,14 @@ Maybe Tool_tryApplyOptions(Tool* t, Hashtable* dtsod){
|
||||
if(!UniCheckTypePtr(val, Autoarr(Unitype)))
|
||||
safethrow("src_languages value expected to be a string array", ;);
|
||||
Autoarr(Unitype)* ar = val.VoidPtr;
|
||||
|
||||
Unitype any_lang_uni;
|
||||
bool is_any_language = Hashtable_tryGet(t->supported_languages, "any", &any_lang_uni);
|
||||
Autoarr_foreach(ar, el,
|
||||
if(!UniCheckTypePtr(el, char))
|
||||
safethrow("src_languages array values expected to be string", ;);
|
||||
const char* l_name = el.VoidPtr;
|
||||
if(!Hashtable_tryGet(t->supported_languages, l_name, &val))
|
||||
if(!is_any_language && !Hashtable_tryGet(t->supported_languages, l_name, &val))
|
||||
safethrow(cptr_concat("language '", l_name, "' isn't supported by tool '", Autoarr_get(t->aliases, 0), "'"), ;);
|
||||
Hashtable_add(t->src_languages, l_name, val);
|
||||
)
|
||||
@ -127,11 +130,7 @@ Maybe CompilationScenario_tryApplyPlatformSpecificOptions(CompilationScenario* s
|
||||
try(CompilationScenario_tryApplyConditionalOptions(sc, dtsod, os_and_arch), _m2, ;);
|
||||
free(os_and_arch);
|
||||
|
||||
os_and_arch = cptr_concat(os, "_", arch);
|
||||
try(CompilationScenario_tryApplyConditionalOptions(sc, dtsod, os_and_arch), _m3, ;);
|
||||
free(os_and_arch);
|
||||
|
||||
return SUCCESS(UniBool(_m0.value.Bool || _m1.value.Bool || _m2.value.Bool || _m3.value.Bool));
|
||||
return SUCCESS(UniBool(_m0.value.Bool || _m1.value.Bool || _m2.value.Bool));
|
||||
}
|
||||
|
||||
Maybe CompilationScenario_applyConfigurationOptions(CompilationScenario* sc, Hashtable* dtsod, const char* configuration){
|
||||
@ -142,8 +141,13 @@ Maybe CompilationScenario_applyConfigurationOptions(CompilationScenario* sc, Has
|
||||
}
|
||||
|
||||
Maybe CompilationScenario_applyTaskOptions(CompilationScenario* sc, Hashtable* dtsod, const char* task){
|
||||
try(CompilationScenario_tryApplyConditionalOptions(sc, dtsod, task), _m0, ;);
|
||||
if(!_m0.value.Bool)
|
||||
Unitype tasks_uni;
|
||||
if(!Hashtable_tryGet(dtsod, "tasks", &tasks_uni))
|
||||
safethrow(cptr_concat("key 'tasks' not found"), ;);
|
||||
if(!UniCheckTypePtr(tasks_uni, Hashtable))
|
||||
safethrow(ERR_WRONGTYPE, ;);
|
||||
try(CompilationScenario_tryApplyConditionalOptions(sc, tasks_uni.VoidPtr, task), _m1, ;);
|
||||
if(!_m1.value.Bool)
|
||||
safethrow(cptr_concat("task '", task, "' not found"), ;);
|
||||
return MaybeNull;
|
||||
}
|
||||
@ -192,10 +196,18 @@ Maybe CompilationScenario_tryRegisterLanguages(CompilationScenario* sc, Hashtabl
|
||||
// registers each alias of the language
|
||||
Autoarr_foreach(aliases, l_name,
|
||||
if(!Hashtable_tryAdd(sc->languages, l_name, UniHeapPtr(Language, lang)))
|
||||
safethrow(cptr_concat("language '", l_name, "has been already registered"), ;);
|
||||
safethrow(cptr_concat("language '", l_name, "' has been already registered"), ;);
|
||||
)
|
||||
)
|
||||
|
||||
// "any" language
|
||||
Language* any_lang = malloc(sizeof(Language));
|
||||
Autoarr(Pointer)* any_aliases = Autoarr_create(Pointer, 1, 1);
|
||||
Autoarr_add(any_aliases, cptr_copy("any"));
|
||||
Language_construct(any_lang, any_aliases, Autoarr_create(Pointer, 0, 0));
|
||||
if(!Hashtable_tryAdd(sc->languages, "any", UniHeapPtr(Language, any_lang)))
|
||||
safethrow(cptr_concat("language '", "any", "has been already registered"), ;);
|
||||
|
||||
return SUCCESS(UniTrue);
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user