| author | |
| committer | |
| log | b5a5260546ddd8953e493f75c5ee12c5a853263b |
| tree | 4da4f332b4077ad7d28af72635e6cf5fd60e7c7b |
| parent | fb188c3d18a744cb98fc361aeeb8e8796066868b |
8 files changed, 67 insertions(+), 1 deletions(-)
lib/compiler/build_runner.zig+1| ... | ... | @@ -1496,6 +1496,7 @@ fn createModuleDependenciesForStep(step: *Step) Allocator.Error!void { |
| 1496 | 1496 | .path_after, |
| 1497 | 1497 | .framework_path, |
| 1498 | 1498 | .framework_path_system, |
| 1499 | .embed_path, | |
| 1499 | 1500 | => |lp| lp.addStepDependencies(step), |
| 1500 | 1501 | |
| 1501 | 1502 | .other_step => |other| { |
lib/std/Build/Module.zig+9| ... | ... | @@ -164,6 +164,7 @@ pub const IncludeDir = union(enum) { |
| 164 | 164 | framework_path_system: LazyPath, |
| 165 | 165 | other_step: *Step.Compile, |
| 166 | 166 | config_header_step: *Step.ConfigHeader, |
| 167 | embed_path: LazyPath, | |
| 167 | 168 | |
| 168 | 169 | pub fn appendZigProcessFlags( |
| 169 | 170 | include_dir: IncludeDir, |
| ... | ... | @@ -200,6 +201,9 @@ pub const IncludeDir = union(enum) { |
| 200 | 201 | const header_dir_path = full_file_path[0 .. full_file_path.len - config_header.include_path.len]; |
| 201 | 202 | try zig_args.appendSlice(&.{ "-I", header_dir_path }); |
| 202 | 203 | }, |
| 204 | .embed_path => |embed_path| { | |
| 205 | try zig_args.append(try std.mem.concat(b.allocator, u8, &.{ "--embed-dir=", embed_path.getPath2(b, asking_step) })); | |
| 206 | }, | |
| 203 | 207 | } |
| 204 | 208 | } |
| 205 | 209 | }; |
| ... | ... | @@ -511,6 +515,11 @@ pub fn addFrameworkPath(m: *Module, directory_path: LazyPath) void { |
| 511 | 515 | @panic("OOM"); |
| 512 | 516 | } |
| 513 | 517 | |
| 518 | pub fn addEmbedPath(m: *Module, lazy_path: LazyPath) void { | |
| 519 | const b = m.owner; | |
| 520 | m.include_dirs.append(b.allocator, .{ .embed_path = lazy_path.dupe(b) }) catch @panic("OOM"); | |
| 521 | } | |
| 522 | ||
| 514 | 523 | pub fn addLibraryPath(m: *Module, directory_path: LazyPath) void { |
| 515 | 524 | const b = m.owner; |
| 516 | 525 | m.lib_paths.append(b.allocator, directory_path.dupe(b)) catch @panic("OOM"); |
lib/std/Build/Step/Compile.zig+4| ... | ... | @@ -943,6 +943,10 @@ pub fn addConfigHeader(compile: *Compile, config_header: *Step.ConfigHeader) voi |
| 943 | 943 | compile.root_module.addConfigHeader(config_header); |
| 944 | 944 | } |
| 945 | 945 | |
| 946 | pub fn addEmbedPath(compile: *Compile, lazy_path: LazyPath) void { | |
| 947 | compile.root_module.addEmbedPath(lazy_path); | |
| 948 | } | |
| 949 | ||
| 946 | 950 | pub fn addLibraryPath(compile: *Compile, directory_path: LazyPath) void { |
| 947 | 951 | compile.root_module.addLibraryPath(directory_path); |
| 948 | 952 | } |
src/main.zig+9-1| ... | ... | @@ -541,6 +541,7 @@ const usage_build_generic = |
| 541 | 541 | \\ -idirafter [dir] Add directory to AFTER include search path |
| 542 | 542 | \\ -isystem [dir] Add directory to SYSTEM include search path |
| 543 | 543 | \\ -I[dir] Add directory to include search path |
| 544 | \\ --embed-dir=[dir] Add directory to embed search path | |
| 544 | 545 | \\ -D[macro]=[value] Define C [macro] to [value] (1 if [value] omitted) |
| 545 | 546 | \\ -cflags [flags] -- Set extra flags for the next positional C source files |
| 546 | 547 | \\ -rcflags [flags] -- Set extra flags for the next positional .rc source files |
| ... | ... | @@ -1287,6 +1288,8 @@ fn buildOutputType( |
| 1287 | 1288 | try cc_argv.appendSlice(arena, &.{ arg, args_iter.nextOrFatal() }); |
| 1288 | 1289 | } else if (mem.eql(u8, arg, "-I")) { |
| 1289 | 1290 | try cssan.addIncludePath(arena, &cc_argv, .I, arg, args_iter.nextOrFatal(), false); |
| 1291 | } else if (mem.startsWith(u8, arg, "--embed-dir=")) { | |
| 1292 | try cssan.addIncludePath(arena, &cc_argv, .embed_dir, arg, arg["--embed-dir=".len..], true); | |
| 1290 | 1293 | } else if (mem.eql(u8, arg, "-isystem")) { |
| 1291 | 1294 | try cssan.addIncludePath(arena, &cc_argv, .isystem, arg, args_iter.nextOrFatal(), false); |
| 1292 | 1295 | } else if (mem.eql(u8, arg, "-iwithsysroot")) { |
| ... | ... | @@ -6974,13 +6977,17 @@ const ClangSearchSanitizer = struct { |
| 6974 | 6977 | m.iframeworkwithsysroot = true; |
| 6975 | 6978 | if (m.iwithsysroot) warn(wtxt, .{ dir, "iframeworkwithsysroot", "iwithsysroot" }); |
| 6976 | 6979 | }, |
| 6980 | .embed_dir => { | |
| 6981 | if (m.embed_dir) return; | |
| 6982 | m.embed_dir = true; | |
| 6983 | }, | |
| 6977 | 6984 | } |
| 6978 | 6985 | try argv.ensureUnusedCapacity(ally, 2); |
| 6979 | 6986 | argv.appendAssumeCapacity(arg); |
| 6980 | 6987 | if (!joined) argv.appendAssumeCapacity(dir); |
| 6981 | 6988 | } |
| 6982 | 6989 | |
| 6983 | const Group = enum { I, isystem, iwithsysroot, idirafter, iframework, iframeworkwithsysroot }; | |
| 6990 | const Group = enum { I, isystem, iwithsysroot, idirafter, iframework, iframeworkwithsysroot, embed_dir }; | |
| 6984 | 6991 | |
| 6985 | 6992 | const Membership = packed struct { |
| 6986 | 6993 | I: bool = false, |
| ... | ... | @@ -6989,6 +6996,7 @@ const ClangSearchSanitizer = struct { |
| 6989 | 6996 | idirafter: bool = false, |
| 6990 | 6997 | iframework: bool = false, |
| 6991 | 6998 | iframeworkwithsysroot: bool = false, |
| 6999 | embed_dir: bool = false, | |
| 6992 | 7000 | }; |
| 6993 | 7001 | }; |
| 6994 | 7002 |
test/standalone/build.zig.zon+3| ... | ... | @@ -126,6 +126,9 @@ |
| 126 | 126 | .c_compiler = .{ |
| 127 | 127 | .path = "c_compiler", |
| 128 | 128 | }, |
| 129 | .c_embed_path = .{ | |
| 130 | .path = "c_embed_path", | |
| 131 | }, | |
| 129 | 132 | .pie = .{ |
| 130 | 133 | .path = "pie", |
| 131 | 134 | }, |
test/standalone/c_embed_path/build.zig created+25| ... | ... | @@ -0,0 +1,25 @@ |
| 1 | const std = @import("std"); | |
| 2 | ||
| 3 | pub fn build(b: *std.Build) void { | |
| 4 | const test_step = b.step("test", "Test it"); | |
| 5 | b.default_step = test_step; | |
| 6 | ||
| 7 | const optimize: std.builtin.OptimizeMode = .Debug; | |
| 8 | ||
| 9 | const exe = b.addExecutable(.{ | |
| 10 | .name = "test", | |
| 11 | .target = b.graph.host, | |
| 12 | .optimize = optimize, | |
| 13 | }); | |
| 14 | exe.addCSourceFile(.{ | |
| 15 | .file = b.path("test.c"), | |
| 16 | .flags = &.{"-std=c23"}, | |
| 17 | }); | |
| 18 | exe.linkLibC(); | |
| 19 | exe.addEmbedPath(b.path("data")); | |
| 20 | ||
| 21 | const run_c_cmd = b.addRunArtifact(exe); | |
| 22 | run_c_cmd.expectExitCode(0); | |
| 23 | run_c_cmd.skip_foreign_checks = true; | |
| 24 | test_step.dependOn(&run_c_cmd.step); | |
| 25 | } |
test/standalone/c_embed_path/data/foo.data created+1| ... | ... | @@ -0,0 +1 @@ |
| 1 | This text is the contents of foo.data | |
| \ No newline at end of file |
test/standalone/c_embed_path/test.c created+15| ... | ... | @@ -0,0 +1,15 @@ |
| 1 | ||
| 2 | #include <stdlib.h> | |
| 3 | #include <string.h> | |
| 4 | int main(void) { | |
| 5 | // Raw bytes; not a C string | |
| 6 | const char data[] = { | |
| 7 | #embed <foo.data> | |
| 8 | }; | |
| 9 | const char *expected = "This text is the contents of foo.data"; | |
| 10 | if (sizeof data == strlen(expected) && memcmp(data, expected, sizeof data) == 0) { | |
| 11 | return EXIT_SUCCESS; | |
| 12 | } else { | |
| 13 | return EXIT_FAILURE; | |
| 14 | } | |
| 15 | } |