package main import "./compiler" import "./compiler/linker" import "./compiler/target" import "core:fmt" import "core:os/os2" Cli_Options :: struct { input_path: string, output_path: string, link_arguments: []linker.Argument, target: target.Target, } parse_cli_args :: proc(args: []string, allocator := context.allocator) -> (Cli_Options, bool) { if len(args) < 4 { return {}, false } options := Cli_Options{input_path=args[1], target=target.DEFAULT} link_arguments: [dynamic]linker.Argument link_arguments.allocator = allocator output_set := false cursor := 2 for cursor < len(args) { option := args[cursor] cursor += 1 if cursor >= len(args) { delete(link_arguments) return {}, false } value := args[cursor] cursor += 1 switch option { case "-o": if output_set { delete(link_arguments) return {}, false } output_set = true options.output_path = value case "--link": append(&link_arguments, linker.Argument{kind=.Input, value=value}) case "--library-path": append(&link_arguments, linker.Argument{kind=.Library_Path, value=value}) case "--library": append(&link_arguments, linker.Argument{kind=.Library, value=value}) case "--target": selected, ok := target.parse(value) if !ok { delete(link_arguments) return {}, false } options.target = selected case: delete(link_arguments) return {}, false } } if !output_set || len(options.output_path) == 0 { delete(link_arguments) return {}, false } options.link_arguments = link_arguments[:] return options, true } print_usage :: proc() { fmt.eprintln( "usage: brolang -o [--target aarch64-macos] [--link | --library-path | --library ]...", ) } main :: proc() { options, valid := parse_cli_args(os2.args) if !valid { print_usage() os2.exit(2) } defer delete(options.link_arguments) status := compiler.compile_package(options.input_path, options.output_path, options.link_arguments, options.target) if status != 0 { os2.exit(status) } }