From aa337049eaf680cc7ba9bd87a6eab8fc32882e75 Mon Sep 17 00:00:00 2001 From: Christoffer Lerno Date: Wed, 10 Aug 2022 22:21:29 +0200 Subject: [PATCH] Fix -l and -L build options. --- src/build/build_options.c | 18 ++---------------- src/build/builder.c | 8 ++++++++ src/compiler/linker.c | 9 ++++++++- src/utils/lib.h | 1 + src/utils/stringutils.c | 8 ++++++++ src/version.h | 2 +- 6 files changed, 28 insertions(+), 18 deletions(-) diff --git a/src/build/build_options.c b/src/build/build_options.c index 0ff4b1e08..a3a3cdcde 100644 --- a/src/build/build_options.c +++ b/src/build/build_options.c @@ -412,26 +412,12 @@ static void parse_option(BuildOptions *options) return; case 'L': if (at_end() || next_is_opt()) error_exit("error: -L needs a directory."); - add_linker_arg(options, "-L"); - add_linker_arg(options, check_dir(next_arg())); + options->linker_lib_dir[options->linker_lib_dir_count++] = check_dir(next_arg()); return; case 'l': - { if (at_end() || next_is_opt()) error_exit("error: -l needs a library name."); - const char *lib = next_arg(); - const char *framework = str_remove_suffix(lib, ".framework"); - if (framework) - { - add_linker_arg(options, "-framework"); - add_linker_arg(options, framework); - } - else - { - add_linker_arg(options, "-l"); - add_linker_arg(options, lib); - } + options->linker_libs[options->linker_lib_count++] = next_arg(); return; - } case 'P': if (options->compile_option != COMPILE_NORMAL) { diff --git a/src/build/builder.c b/src/build/builder.c index 34e83b597..1ae5dbbd4 100644 --- a/src/build/builder.c +++ b/src/build/builder.c @@ -176,6 +176,14 @@ static void update_build_target_from_options(BuildTarget *target, BuildOptions * { vec_add(target->link_args, options->linker_args[i]); } + for (int i = 0; i < options->linker_lib_dir_count; i++) + { + vec_add(target->linker_libdirs, options->linker_lib_dir[i]); + } + for (int i = 0; i < options->linker_lib_count; i++) + { + vec_add(target->linker_libs, options->linker_libs[i]); + } target->no_stdlib = options->no_stdlib; target->emit_llvm = options->emit_llvm; target->emit_asm = options->emit_asm; diff --git a/src/compiler/linker.c b/src/compiler/linker.c index b3525dc8d..f4538b626 100644 --- a/src/compiler/linker.c +++ b/src/compiler/linker.c @@ -402,7 +402,14 @@ static bool linker_setup(const char ***args_ref, const char **files_to_link, uns } if (use_win) { - add_arg2(lib, ".lib"); + if (str_has_suffix(lib, ".lib")) + { + add_arg(lib); + } + else + { + add_arg2(lib, ".lib"); + } } else { diff --git a/src/utils/lib.h b/src/utils/lib.h index ea35128d5..378662b12 100644 --- a/src/utils/lib.h +++ b/src/utils/lib.h @@ -99,6 +99,7 @@ void taskqueue_wait_for_completion(TaskQueueRef queue); const char *str_remove_suffix(const char *name, const char *suffix); +bool str_has_suffix(const char *name, const char *suffix); char *str_trim(char *str); const char *str_trim_start(const char *str); void str_trim_end(char *str); diff --git a/src/utils/stringutils.c b/src/utils/stringutils.c index 9da57b650..90c398aa2 100644 --- a/src/utils/stringutils.c +++ b/src/utils/stringutils.c @@ -93,6 +93,14 @@ const char *str_remove_suffix(const char *name, const char *suffix) return name_copy; } +bool str_has_suffix(const char *name, const char *suffix) +{ + size_t name_len = strlen(name); + size_t suffix_len = strlen(suffix); + if (name_len <= suffix_len) return false; + return memcmp(name + name_len - suffix_len, suffix, suffix_len) == 0; +} + StringSlice slice_next_token(StringSlice *slice, char separator) { diff --git a/src/version.h b/src/version.h index 331568928..5cba5a658 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define COMPILER_VERSION "0.3.10" \ No newline at end of file +#define COMPILER_VERSION "0.3.11" \ No newline at end of file