80 lines
2.1 KiB
Odin
80 lines
2.1 KiB
Odin
package main
|
|
|
|
import c "core:c/libc"
|
|
import "core:log"
|
|
import "core:os"
|
|
import "core:strings"
|
|
|
|
ExecutionError :: enum {
|
|
None,
|
|
ErrorDuringCommandExecution,
|
|
}
|
|
|
|
execute_command :: proc(
|
|
command: Command,
|
|
target_name: TargetName,
|
|
configuration: ConfigurationTargets,
|
|
) -> (
|
|
error: ExecutionError,
|
|
) {
|
|
target_config, found_target_in_config := configuration[target_name]
|
|
if !found_target_in_config && target_name != "" {
|
|
log.errorf("No such target in config: %s", target_name)
|
|
os.exit(1)
|
|
}
|
|
|
|
compile_flags: string
|
|
sb := strings.builder_make()
|
|
defer strings.builder_destroy(&sb)
|
|
|
|
// Append the command
|
|
strings.write_string(&sb, "odin ")
|
|
strings.write_string(&sb, command_to_string(command))
|
|
strings.write_byte(&sb, ' ')
|
|
|
|
if def_config, ok := configuration[DEFAULT_TARGET_NAME]; ok && !found_target_in_config {
|
|
strings.write_string(&sb, string(def_config.source))
|
|
} else if found_target_in_config {
|
|
strings.write_string(&sb, string(target_config.source))
|
|
}
|
|
|
|
// Add the collections to the compile flags
|
|
if def_config, ok := configuration[DEFAULT_TARGET_NAME]; ok {
|
|
for collectionName, collectionPath in def_config.collections {
|
|
strings.write_string(&sb, " -collection:")
|
|
strings.write_string(&sb, string(collectionName))
|
|
strings.write_string(&sb, "=")
|
|
strings.write_string(&sb, string(collectionPath))
|
|
}
|
|
}
|
|
if found_target_in_config {
|
|
for collectionName, collectionPath in target_config.collections {
|
|
strings.write_string(&sb, " -collection:")
|
|
strings.write_string(&sb, string(collectionName))
|
|
strings.write_string(&sb, "=")
|
|
strings.write_string(&sb, string(collectionPath))
|
|
}
|
|
}
|
|
|
|
// Add the other type of flags
|
|
if def_config, ok := configuration[DEFAULT_TARGET_NAME]; ok {
|
|
for flag in def_config.flags {
|
|
strings.write_byte(&sb, ' ')
|
|
strings.write_string(&sb, flag)
|
|
}
|
|
}
|
|
if found_target_in_config {
|
|
for flag in target_config.flags {
|
|
strings.write_byte(&sb, ' ')
|
|
strings.write_string(&sb, flag)
|
|
}
|
|
}
|
|
|
|
compile_flags = strings.to_string(sb)
|
|
|
|
log.infof("Calling command:\n\t'%s'", compile_flags)
|
|
ccommand, err := strings.clone_to_cstring(compile_flags)
|
|
c.system(ccommand)
|
|
|
|
return
|
|
}
|