47 lines
1.0 KiB
Odin
47 lines
1.0 KiB
Odin
package backend
|
|
|
|
import "core:fmt"
|
|
import "core:os"
|
|
import "core:os/os2"
|
|
|
|
compile :: proc(llvm_path, output_path: string) -> bool {
|
|
pid := os2.get_pid()
|
|
temporary_output := fmt.tprintf("%s.brolang-tmp-%d", output_path, pid)
|
|
defer _ = os.remove(temporary_output)
|
|
|
|
command := []string{
|
|
"/usr/bin/env",
|
|
"ZIG_LOCAL_CACHE_DIR=/tmp/brolang-zig-cache",
|
|
"ZIG_GLOBAL_CACHE_DIR=/tmp/brolang-zig-global-cache",
|
|
"zig",
|
|
"cc",
|
|
"-Wno-override-module",
|
|
llvm_path,
|
|
"-o",
|
|
temporary_output,
|
|
}
|
|
state, stdout, stderr, err := os2.process_exec(
|
|
os2.Process_Desc{command=command},
|
|
context.allocator,
|
|
)
|
|
defer delete(stdout)
|
|
defer delete(stderr)
|
|
if len(stdout) > 0 {
|
|
fmt.print(string(stdout))
|
|
}
|
|
if len(stderr) > 0 {
|
|
fmt.eprint(string(stderr))
|
|
}
|
|
if err != nil || state.exit_code != 0 {
|
|
if err != nil {
|
|
fmt.eprintln("failed to execute zig cc:", err)
|
|
}
|
|
return false
|
|
}
|
|
if rename_err := os2.rename(temporary_output, output_path); rename_err != nil {
|
|
fmt.eprintln("failed to atomically replace output:", rename_err)
|
|
return false
|
|
}
|
|
return true
|
|
}
|