diff --git a/src/all_types.hpp b/src/all_types.hpp index d9e1dc44ca..708db8848d 100644 --- a/src/all_types.hpp +++ b/src/all_types.hpp @@ -2003,6 +2003,7 @@ struct CodeGen { ZigList assembly_files; ZigList c_source_files; ZigList lib_dirs; + ZigList framework_dirs; ZigLibCInstallation *libc; diff --git a/src/codegen.cpp b/src/codegen.cpp index 890724d950..74de8634cc 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -9803,6 +9803,7 @@ static Error check_cache(CodeGen *g, Buf *manifest_dir, Buf *digest) { cache_list_of_str(ch, g->llvm_argv, g->llvm_argv_len); cache_list_of_str(ch, g->clang_argv, g->clang_argv_len); cache_list_of_str(ch, g->lib_dirs.items, g->lib_dirs.length); + cache_list_of_str(ch, g->framework_dirs.items, g->framework_dirs.length); if (g->libc) { cache_buf(ch, &g->libc->include_dir); cache_buf(ch, &g->libc->sys_include_dir); diff --git a/src/link.cpp b/src/link.cpp index 8a1f889234..5519f98fd2 100644 --- a/src/link.cpp +++ b/src/link.cpp @@ -2510,6 +2510,12 @@ static void construct_linker_job_macho(LinkJob *lj) { lj->args.append("dynamic_lookup"); } + for (size_t i = 0; i < g->framework_dirs.length; i += 1) { + const char *framework_dir = g->framework_dirs.at(i); + lj->args.append("-F"); + lj->args.append(framework_dir); + } + for (size_t i = 0; i < g->darwin_frameworks.length; i += 1) { lj->args.append("-framework"); lj->args.append(buf_ptr(g->darwin_frameworks.at(i))); diff --git a/src/main.cpp b/src/main.cpp index c0945ef180..6f1ccd418c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -104,6 +104,7 @@ static int print_full_usage(const char *arg0, FILE *file, int return_code) { " -rdynamic add all symbols to the dynamic symbol table\n" " -rpath [path] add directory to the runtime library search path\n" " --subsystem [subsystem] (windows) /SUBSYSTEM: to the linker\n" + " -F[dir] (darwin) add search path for frameworks\n" " -framework [name] (darwin) link against framework\n" " -mios-version-min [ver] (darwin) set iOS deployment target\n" " -mmacosx-version-min [ver] (darwin) set Mac OS X deployment target\n" @@ -454,6 +455,7 @@ int main(int argc, char **argv) { ZigList lib_dirs = {0}; ZigList link_libs = {0}; ZigList forbidden_link_libs = {0}; + ZigList framework_dirs = {0}; ZigList frameworks = {0}; bool have_libc = false; const char *target_string = nullptr; @@ -686,6 +688,8 @@ int main(int argc, char **argv) { } else if (arg[1] == 'L' && arg[2] != 0) { // alias for --library-path lib_dirs.append(&arg[2]); + } else if (arg[1] == 'F' && arg[2] != 0) { + framework_dirs.append(&arg[2]); } else if (strcmp(arg, "--pkg-begin") == 0) { if (i + 2 >= argc) { fprintf(stderr, "Expected 2 arguments after --pkg-begin\n"); @@ -772,6 +776,8 @@ int main(int argc, char **argv) { main_pkg_path = buf_create_from_str(argv[i]); } else if (strcmp(arg, "--library-path") == 0 || strcmp(arg, "-L") == 0) { lib_dirs.append(argv[i]); + } else if (strcmp(arg, "-F") == 0) { + framework_dirs.append(argv[i]); } else if (strcmp(arg, "--library") == 0) { if (strcmp(argv[i], "c") == 0) have_libc = true; @@ -1153,6 +1159,9 @@ int main(int argc, char **argv) { for (size_t i = 0; i < lib_dirs.length; i += 1) { codegen_add_lib_dir(g, lib_dirs.at(i)); } + for (size_t i = 0; i < framework_dirs.length; i += 1) { + g->framework_dirs.append(framework_dirs.at(i)); + } 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; diff --git a/std/build.zig b/std/build.zig index 9393d72c15..27715663f7 100644 --- a/std/build.zig +++ b/std/build.zig @@ -1228,6 +1228,7 @@ pub const LibExeObjStep = struct { name_only_filename: []const u8, strip: bool, lib_paths: ArrayList([]const u8), + framework_dirs: ArrayList([]const u8), frameworks: BufSet, verbose_link: bool, verbose_cc: bool, @@ -1341,6 +1342,7 @@ pub const LibExeObjStep = struct { .include_dirs = ArrayList(IncludeDir).init(builder.allocator), .link_objects = ArrayList(LinkObject).init(builder.allocator), .lib_paths = ArrayList([]const u8).init(builder.allocator), + .framework_dirs = ArrayList([]const u8).init(builder.allocator), .object_src = undefined, .build_options_contents = std.Buffer.initSize(builder.allocator, 0) catch unreachable, .c_std = Builder.CStd.C99, @@ -1614,6 +1616,10 @@ pub const LibExeObjStep = struct { self.lib_paths.append(path) catch unreachable; } + pub fn addFrameworkDir(self: *LibExeObjStep, dir_path: []const u8) void { + self.framework_dirs.append(dir_path) catch unreachable; + } + pub fn addPackagePath(self: *LibExeObjStep, name: []const u8, pkg_index_path: []const u8) void { self.packages.append(Pkg{ .name = name, @@ -1860,8 +1866,8 @@ pub const LibExeObjStep = struct { } for (self.lib_paths.toSliceConst()) |lib_path| { - zig_args.append("--library-path") catch unreachable; - zig_args.append(lib_path) catch unreachable; + try zig_args.append("-L"); + try zig_args.append(lib_path); } if (self.need_system_paths and self.target == Target.Native) { @@ -1882,6 +1888,11 @@ pub const LibExeObjStep = struct { } if (self.target.isDarwin()) { + for (self.framework_dirs.toSliceConst()) |dir| { + try zig_args.append("-F"); + try zig_args.append(dir); + } + var it = self.frameworks.iterator(); while (it.next()) |entry| { zig_args.append("-framework") catch unreachable;