| ... | ... | @@ -482,6 +482,10 @@ const usage_build_generic = |
| 482 | 482 | \\ lib then static lib before proceeding to next path. |
| 483 | 483 | \\ -search_dylibs_first Search for dynamic libs in all library search |
| 484 | 484 | \\ paths, then static libs. |
| 485 | \\ -search_static_first Search for static libs in all library search |
| 486 | \\ paths, then dynamic libs. |
| 487 | \\ -search_dylibs_only Only search for dynamic libs. |
| 488 | \\ -search_static_only Only search for static libs. |
| 485 | 489 | \\ -T[script], --script [script] Use a custom linker script |
| 486 | 490 | \\ --version-script [path] Provide a version .map file |
| 487 | 491 | \\ --dynamic-linker [path] Set the dynamic interpreter path (usually ld.so) |
| ... | ... | @@ -878,8 +882,8 @@ fn buildOutputType( |
| 878 | 882 | var hash_style: link.HashStyle = .both; |
| 879 | 883 | var entitlements: ?[]const u8 = null; |
| 880 | 884 | var pagezero_size: ?u64 = null; |
| 881 | | var lib_search_strategy: ?SystemLib.SearchStrategy = null; |
| 882 | | var lib_preferred_mode: ?std.builtin.LinkMode = null; |
| 885 | var lib_search_strategy: SystemLib.SearchStrategy = .paths_first; |
| 886 | var lib_preferred_mode: std.builtin.LinkMode = .Dynamic; |
| 883 | 887 | var headerpad_size: ?u32 = null; |
| 884 | 888 | var headerpad_max_install_names: bool = false; |
| 885 | 889 | var dead_strip_dylibs: bool = false; |
| ... | ... | @@ -1111,6 +1115,15 @@ fn buildOutputType( |
| 1111 | 1115 | } else if (mem.eql(u8, arg, "-search_dylibs_first")) { |
| 1112 | 1116 | lib_search_strategy = .mode_first; |
| 1113 | 1117 | lib_preferred_mode = .Dynamic; |
| 1118 | } else if (mem.eql(u8, arg, "-search_static_first")) { |
| 1119 | lib_search_strategy = .mode_first; |
| 1120 | lib_preferred_mode = .Static; |
| 1121 | } else if (mem.eql(u8, arg, "-search_dylibs_only")) { |
| 1122 | lib_search_strategy = .no_fallback; |
| 1123 | lib_preferred_mode = .Dynamic; |
| 1124 | } else if (mem.eql(u8, arg, "-search_static_only")) { |
| 1125 | lib_search_strategy = .no_fallback; |
| 1126 | lib_preferred_mode = .Static; |
| 1114 | 1127 | } else if (mem.eql(u8, arg, "-headerpad")) { |
| 1115 | 1128 | const next_arg = args_iter.nextOrFatal(); |
| 1116 | 1129 | headerpad_size = std.fmt.parseUnsigned(u32, eatIntPrefix(next_arg, 16), 16) catch |err| { |
| ... | ... | @@ -1136,8 +1149,8 @@ fn buildOutputType( |
| 1136 | 1149 | // -l always dynamic links. For static libraries, |
| 1137 | 1150 | // users are expected to use positional arguments |
| 1138 | 1151 | // which are always unambiguous. |
| 1139 | | .preferred_mode = lib_preferred_mode orelse .Dynamic, |
| 1140 | | .search_strategy = lib_search_strategy orelse .no_fallback, |
| 1152 | .preferred_mode = lib_preferred_mode, |
| 1153 | .search_strategy = lib_search_strategy, |
| 1141 | 1154 | }); |
| 1142 | 1155 | } else if (mem.eql(u8, arg, "--needed-library") or |
| 1143 | 1156 | mem.eql(u8, arg, "-needed-l") or |
| ... | ... | @@ -1147,15 +1160,15 @@ fn buildOutputType( |
| 1147 | 1160 | try system_libs.put(next_arg, .{ |
| 1148 | 1161 | .needed = true, |
| 1149 | 1162 | .weak = false, |
| 1150 | | .preferred_mode = lib_preferred_mode orelse .Dynamic, |
| 1151 | | .search_strategy = lib_search_strategy orelse .no_fallback, |
| 1163 | .preferred_mode = lib_preferred_mode, |
| 1164 | .search_strategy = lib_search_strategy, |
| 1152 | 1165 | }); |
| 1153 | 1166 | } else if (mem.eql(u8, arg, "-weak_library") or mem.eql(u8, arg, "-weak-l")) { |
| 1154 | 1167 | try system_libs.put(args_iter.nextOrFatal(), .{ |
| 1155 | 1168 | .needed = false, |
| 1156 | 1169 | .weak = true, |
| 1157 | | .preferred_mode = lib_preferred_mode orelse .Dynamic, |
| 1158 | | .search_strategy = lib_search_strategy orelse .no_fallback, |
| 1170 | .preferred_mode = lib_preferred_mode, |
| 1171 | .search_strategy = lib_search_strategy, |
| 1159 | 1172 | }); |
| 1160 | 1173 | } else if (mem.eql(u8, arg, "-D")) { |
| 1161 | 1174 | try clang_argv.append(arg); |
| ... | ... | @@ -1388,8 +1401,12 @@ fn buildOutputType( |
| 1388 | 1401 | emit_implib_arg_provided = true; |
| 1389 | 1402 | } else if (mem.eql(u8, arg, "-dynamic")) { |
| 1390 | 1403 | link_mode = .Dynamic; |
| 1404 | lib_preferred_mode = .Dynamic; |
| 1405 | lib_search_strategy = .mode_first; |
| 1391 | 1406 | } else if (mem.eql(u8, arg, "-static")) { |
| 1392 | 1407 | link_mode = .Static; |
| 1408 | lib_preferred_mode = .Static; |
| 1409 | lib_search_strategy = .no_fallback; |
| 1393 | 1410 | } else if (mem.eql(u8, arg, "-fdll-export-fns")) { |
| 1394 | 1411 | dll_export_fns = true; |
| 1395 | 1412 | } else if (mem.eql(u8, arg, "-fno-dll-export-fns")) { |
| ... | ... | @@ -1541,22 +1558,22 @@ fn buildOutputType( |
| 1541 | 1558 | // -l always dynamic links. For static libraries, |
| 1542 | 1559 | // users are expected to use positional arguments |
| 1543 | 1560 | // which are always unambiguous. |
| 1544 | | .preferred_mode = lib_preferred_mode orelse .Dynamic, |
| 1545 | | .search_strategy = lib_search_strategy orelse .no_fallback, |
| 1561 | .preferred_mode = lib_preferred_mode, |
| 1562 | .search_strategy = lib_search_strategy, |
| 1546 | 1563 | }); |
| 1547 | 1564 | } else if (mem.startsWith(u8, arg, "-needed-l")) { |
| 1548 | 1565 | try system_libs.put(arg["-needed-l".len..], .{ |
| 1549 | 1566 | .needed = true, |
| 1550 | 1567 | .weak = false, |
| 1551 | | .preferred_mode = lib_preferred_mode orelse .Dynamic, |
| 1552 | | .search_strategy = lib_search_strategy orelse .no_fallback, |
| 1568 | .preferred_mode = lib_preferred_mode, |
| 1569 | .search_strategy = lib_search_strategy, |
| 1553 | 1570 | }); |
| 1554 | 1571 | } else if (mem.startsWith(u8, arg, "-weak-l")) { |
| 1555 | 1572 | try system_libs.put(arg["-weak-l".len..], .{ |
| 1556 | 1573 | .needed = false, |
| 1557 | 1574 | .weak = true, |
| 1558 | | .preferred_mode = lib_preferred_mode orelse .Dynamic, |
| 1559 | | .search_strategy = lib_search_strategy orelse .no_fallback, |
| 1575 | .preferred_mode = lib_preferred_mode, |
| 1576 | .search_strategy = lib_search_strategy, |
| 1560 | 1577 | }); |
| 1561 | 1578 | } else if (mem.startsWith(u8, arg, "-D")) { |
| 1562 | 1579 | try clang_argv.append(arg); |
| ... | ... | @@ -1632,7 +1649,6 @@ fn buildOutputType( |
| 1632 | 1649 | var emit_llvm = false; |
| 1633 | 1650 | var needed = false; |
| 1634 | 1651 | var must_link = false; |
| 1635 | | var force_static_libs = false; |
| 1636 | 1652 | var file_ext: ?Compilation.FileExt = null; |
| 1637 | 1653 | while (it.has_next) { |
| 1638 | 1654 | it.next() catch |err| { |
| ... | ... | @@ -1702,22 +1718,12 @@ fn buildOutputType( |
| 1702 | 1718 | .must_link = must_link, |
| 1703 | 1719 | .loption = true, |
| 1704 | 1720 | }); |
| 1705 | | } else if (force_static_libs) { |
| 1706 | | try system_libs.put(it.only_arg, .{ |
| 1707 | | .needed = false, |
| 1708 | | .weak = false, |
| 1709 | | .preferred_mode = .Static, |
| 1710 | | .search_strategy = .no_fallback, |
| 1711 | | }); |
| 1712 | 1721 | } else { |
| 1713 | | // C compilers are traditionally expected to look |
| 1714 | | // first for dynamic libraries and then fall back |
| 1715 | | // to static libraries. |
| 1716 | 1722 | try system_libs.put(it.only_arg, .{ |
| 1717 | 1723 | .needed = needed, |
| 1718 | 1724 | .weak = false, |
| 1719 | | .preferred_mode = lib_preferred_mode orelse .Dynamic, |
| 1720 | | .search_strategy = lib_search_strategy orelse .paths_first, |
| 1725 | .preferred_mode = lib_preferred_mode, |
| 1726 | .search_strategy = lib_search_strategy, |
| 1721 | 1727 | }); |
| 1722 | 1728 | } |
| 1723 | 1729 | }, |
| ... | ... | @@ -1814,13 +1820,15 @@ fn buildOutputType( |
| 1814 | 1820 | mem.eql(u8, linker_arg, "-dy") or |
| 1815 | 1821 | mem.eql(u8, linker_arg, "-call_shared")) |
| 1816 | 1822 | { |
| 1817 | | force_static_libs = false; |
| 1823 | lib_search_strategy = .no_fallback; |
| 1824 | lib_preferred_mode = .Dynamic; |
| 1818 | 1825 | } else if (mem.eql(u8, linker_arg, "-Bstatic") or |
| 1819 | 1826 | mem.eql(u8, linker_arg, "-dn") or |
| 1820 | 1827 | mem.eql(u8, linker_arg, "-non_shared") or |
| 1821 | 1828 | mem.eql(u8, linker_arg, "-static")) |
| 1822 | 1829 | { |
| 1823 | | force_static_libs = true; |
| 1830 | lib_search_strategy = .no_fallback; |
| 1831 | lib_preferred_mode = .Static; |
| 1824 | 1832 | } else if (mem.eql(u8, linker_arg, "-search_paths_first")) { |
| 1825 | 1833 | lib_search_strategy = .paths_first; |
| 1826 | 1834 | lib_preferred_mode = .Dynamic; |
| ... | ... | @@ -1939,8 +1947,8 @@ fn buildOutputType( |
| 1939 | 1947 | .weak_library => try system_libs.put(it.only_arg, .{ |
| 1940 | 1948 | .needed = false, |
| 1941 | 1949 | .weak = true, |
| 1942 | | .preferred_mode = lib_preferred_mode orelse .Dynamic, |
| 1943 | | .search_strategy = lib_search_strategy orelse .paths_first, |
| 1950 | .preferred_mode = lib_preferred_mode, |
| 1951 | .search_strategy = lib_search_strategy, |
| 1944 | 1952 | }), |
| 1945 | 1953 | .weak_framework => try frameworks.put(gpa, it.only_arg, .{ .weak = true }), |
| 1946 | 1954 | .headerpad_max_install_names => headerpad_max_install_names = true, |
| ... | ... | @@ -2240,22 +2248,22 @@ fn buildOutputType( |
| 2240 | 2248 | try system_libs.put(linker_args_it.nextOrFatal(), .{ |
| 2241 | 2249 | .weak = false, |
| 2242 | 2250 | .needed = true, |
| 2243 | | .preferred_mode = lib_preferred_mode orelse .Dynamic, |
| 2244 | | .search_strategy = lib_search_strategy orelse .paths_first, |
| 2251 | .preferred_mode = lib_preferred_mode, |
| 2252 | .search_strategy = lib_search_strategy, |
| 2245 | 2253 | }); |
| 2246 | 2254 | } else if (mem.startsWith(u8, arg, "-weak-l")) { |
| 2247 | 2255 | try system_libs.put(arg["-weak-l".len..], .{ |
| 2248 | 2256 | .weak = true, |
| 2249 | 2257 | .needed = false, |
| 2250 | | .preferred_mode = lib_preferred_mode orelse .Dynamic, |
| 2251 | | .search_strategy = lib_search_strategy orelse .paths_first, |
| 2258 | .preferred_mode = lib_preferred_mode, |
| 2259 | .search_strategy = lib_search_strategy, |
| 2252 | 2260 | }); |
| 2253 | 2261 | } else if (mem.eql(u8, arg, "-weak_library")) { |
| 2254 | 2262 | try system_libs.put(linker_args_it.nextOrFatal(), .{ |
| 2255 | 2263 | .weak = true, |
| 2256 | 2264 | .needed = false, |
| 2257 | | .preferred_mode = lib_preferred_mode orelse .Dynamic, |
| 2258 | | .search_strategy = lib_search_strategy orelse .paths_first, |
| 2265 | .preferred_mode = lib_preferred_mode, |
| 2266 | .search_strategy = lib_search_strategy, |
| 2259 | 2267 | }); |
| 2260 | 2268 | } else if (mem.eql(u8, arg, "-compatibility_version")) { |
| 2261 | 2269 | const compat_version = linker_args_it.nextOrFatal(); |