aboutsummaryrefslogtreecommitdiff
path: root/src/main.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2019-07-08 13:51:48 -0400
committerGitHub <noreply@github.com>2019-07-08 13:51:48 -0400
commit4953e84902df3467b6d7491532e48bf33b5e56b9 (patch)
treeaa7d7fcb91a0e6ca8725d3fbdd586e168f62a27f /src/main.cpp
parentd39dcd6d9db2faf18287b2ff734ffda0d4080e5a (diff)
parent201033d83b80d65380aaade37b76eafa17258f16 (diff)
downloadzig-4953e84902df3467b6d7491532e48bf33b5e56b9.tar.gz
zig-4953e84902df3467b6d7491532e48bf33b5e56b9.zip
Merge pull request #2847 from ziglang/glibc-abi-versioning
support glibc version as part of the target
Diffstat (limited to 'src/main.cpp')
-rw-r--r--src/main.cpp61
1 files changed, 59 insertions, 2 deletions
diff --git a/src/main.cpp b/src/main.cpp
index 179b4fddb0..9329229a7b 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -15,6 +15,7 @@
#include "target.hpp"
#include "libc_installation.hpp"
#include "userland.h"
+#include "glibc.hpp"
#include <stdio.h>
@@ -74,6 +75,7 @@ static int print_full_usage(const char *arg0, FILE *file, int return_code) {
" -dynamic create a shared library (.so; .dll; .dylib)\n"
" --strip exclude debug symbols\n"
" -target [name] <arch><sub>-<os>-<abi> see the targets command\n"
+ " -target-glibc [version] target a specific glibc version (default: 2.17)\n"
" --verbose-tokenize enable compiler debug output for tokenization\n"
" --verbose-ast enable compiler debug output for AST parsing\n"
" --verbose-link enable compiler debug output for linking\n"
@@ -96,6 +98,7 @@ static int print_full_usage(const char *arg0, FILE *file, int return_code) {
" --forbid-library [lib] make it an error to link against lib\n"
" --library-path [dir] add a directory to the library search path\n"
" --linker-script [path] use a custom linker script\n"
+ " --version-script [path] provide a version .map file\n"
" --object [obj] add object file to build\n"
" -L[dir] alias for --library-path\n"
" -rdynamic add all symbols to the dynamic symbol table\n"
@@ -189,10 +192,33 @@ static int print_target_list(FILE *f) {
for (size_t i = 0; i < libc_count; i += 1) {
ZigTarget libc_target;
target_libc_enum(i, &libc_target);
- fprintf(f, " %s-%s-%s\n", target_arch_name(libc_target.arch),
- target_os_name(libc_target.os), target_abi_name(libc_target.abi));
+ bool is_native = native.arch == libc_target.arch &&
+ native.os == libc_target.os &&
+ native.abi == libc_target.abi;
+ const char *native_str = is_native ? " (native)" : "";
+ fprintf(f, " %s-%s-%s%s\n", target_arch_name(libc_target.arch),
+ target_os_name(libc_target.os), target_abi_name(libc_target.abi), native_str);
}
+ fprintf(f, "\nAvailable glibc versions:\n");
+ ZigGLibCAbi *glibc_abi;
+ Error err;
+ if ((err = glibc_load_metadata(&glibc_abi, get_zig_lib_dir(), true))) {
+ return EXIT_FAILURE;
+ }
+ for (size_t i = 0; i < glibc_abi->all_versions.length; i += 1) {
+ ZigGLibCVersion *this_ver = &glibc_abi->all_versions.at(i);
+ bool is_native = native.glibc_version != nullptr &&
+ native.glibc_version->major == this_ver->major &&
+ native.glibc_version->minor == this_ver->minor &&
+ native.glibc_version->patch == this_ver->patch;
+ const char *native_str = is_native ? " (native)" : "";
+ if (this_ver->patch == 0) {
+ fprintf(f, " %d.%d%s\n", this_ver->major, this_ver->minor, native_str);
+ } else {
+ fprintf(f, " %d.%d.%d%s\n", this_ver->major, this_ver->minor, this_ver->patch, native_str);
+ }
+ }
return EXIT_SUCCESS;
}
@@ -437,6 +463,8 @@ int main(int argc, char **argv) {
const char *mmacosx_version_min = nullptr;
const char *mios_version_min = nullptr;
const char *linker_script = nullptr;
+ Buf *version_script = nullptr;
+ const char *target_glibc = nullptr;
ZigList<const char *> rpath_list = {0};
bool each_lib_rpath = false;
ZigList<const char *> objects = {0};
@@ -783,6 +811,10 @@ int main(int argc, char **argv) {
frameworks.append(argv[i]);
} else if (strcmp(arg, "--linker-script") == 0) {
linker_script = argv[i];
+ } else if (strcmp(arg, "--version-script") == 0) {
+ version_script = buf_create_from_str(argv[i]);
+ } else if (strcmp(arg, "-target-glibc") == 0) {
+ target_glibc = argv[i];
} else if (strcmp(arg, "-rpath") == 0) {
rpath_list.append(argv[i]);
} else if (strcmp(arg, "--test-filter") == 0) {
@@ -904,6 +936,10 @@ int main(int argc, char **argv) {
ZigTarget target;
if (target_string == nullptr) {
get_native_target(&target);
+ if (target_glibc != nullptr) {
+ fprintf(stderr, "-target-glibc provided but no -target parameter\n");
+ return print_error_usage(arg0);
+ }
} else {
if ((err = target_parse_triple(&target, target_string))) {
if (err == ErrorUnknownArchitecture && target.arch != ZigLLVM_UnknownArch) {
@@ -921,6 +957,22 @@ int main(int argc, char **argv) {
return print_error_usage(arg0);
}
}
+ if (target_is_glibc(&target)) {
+ target.glibc_version = allocate<ZigGLibCVersion>(1);
+
+ if (target_glibc != nullptr) {
+ if ((err = target_parse_glibc_version(target.glibc_version, target_glibc))) {
+ fprintf(stderr, "invalid glibc version '%s': %s\n", target_glibc, err_str(err));
+ return print_error_usage(arg0);
+ }
+ } else {
+ // Default cross-compiling glibc version
+ *target.glibc_version = {2, 17, 0};
+ }
+ } else if (target_glibc != nullptr) {
+ fprintf(stderr, "'%s' is not a glibc-compatible target", target_string);
+ return print_error_usage(arg0);
+ }
}
if (output_dir != nullptr && enable_cache == CacheOptOn) {
@@ -963,6 +1015,10 @@ int main(int argc, char **argv) {
CodeGen *g = codegen_create(main_pkg_path, nullptr, &target,
out_type, build_mode, override_lib_dir, override_std_dir, nullptr, nullptr);
codegen_set_strip(g, strip);
+ for (size_t i = 0; i < link_libs.length; i += 1) {
+ LinkLib *link_lib = codegen_add_link_lib(g, buf_create_from_str(link_libs.at(i)));
+ link_lib->provided_explicitly = true;
+ }
g->subsystem = subsystem;
g->valgrind_support = valgrind_support;
g->want_pic = want_pic;
@@ -1074,6 +1130,7 @@ int main(int argc, char **argv) {
codegen_set_is_test(g, cmd == CmdTest);
g->want_single_threaded = want_single_threaded;
codegen_set_linker_script(g, linker_script);
+ g->version_script_path = version_script;
if (each_lib_rpath)
codegen_set_each_lib_rpath(g, each_lib_rpath);