From eccd07f009bd779f5ee1eabb9bf07d0f9b3de649 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Thu, 16 Apr 2026 21:19:41 -0700 Subject: [PATCH] pkg: replace @cImport with addTranslateC in pkg/ @cImport is going to disappear in Zig 0.17. Its deprecated in Zig 0.16. Let's remove it now. Replace @cImport with addTranslateC across pkg/ packages. Each package now has a c_import.h header that is translated at build time via addTranslateC and exposed as a "cimport" module import. Converted packages: - dcimgui - fontconfig - freetype - glslang - harfbuzz - macos - oniguruma - opengl - sentry - spirv-cross - wuffs Omitted: - gtk4-layer-shell - This has a bit more complexity with how it interacts with GTK headers, so I need to consider this a bit more. - src/ - It'll be cleaner to do this separately. --- pkg/dcimgui/build.zig | 37 ++++++++++++++++++++++ pkg/dcimgui/c_import.h | 7 ++++ pkg/dcimgui/main.zig | 10 +----- pkg/fontconfig/build.zig | 12 +++++++ pkg/fontconfig/c.zig | 3 -- pkg/fontconfig/c_import.h | 1 + pkg/fontconfig/char_set.zig | 2 +- pkg/fontconfig/common.zig | 2 +- pkg/fontconfig/config.zig | 2 +- pkg/fontconfig/font_set.zig | 2 +- pkg/fontconfig/init.zig | 2 +- pkg/fontconfig/lang_set.zig | 2 +- pkg/fontconfig/main.zig | 2 +- pkg/fontconfig/matrix.zig | 2 +- pkg/fontconfig/object_set.zig | 2 +- pkg/fontconfig/pattern.zig | 2 +- pkg/fontconfig/range.zig | 2 +- pkg/fontconfig/value.zig | 2 +- pkg/freetype/Library.zig | 2 +- pkg/freetype/build.zig | 21 ++++++++++++ pkg/freetype/c.zig | 3 -- pkg/freetype/c_import.h | 1 + pkg/freetype/computations.zig | 2 +- pkg/freetype/errors.zig | 2 +- pkg/freetype/face.zig | 2 +- pkg/freetype/main.zig | 2 +- pkg/glslang/build.zig | 19 +++++++++++ pkg/glslang/c.zig | 4 --- pkg/glslang/c_import.h | 2 ++ pkg/glslang/init.zig | 2 +- pkg/glslang/main.zig | 2 +- pkg/glslang/program.zig | 2 +- pkg/glslang/shader.zig | 2 +- pkg/harfbuzz/blob.zig | 2 +- pkg/harfbuzz/buffer.zig | 2 +- pkg/harfbuzz/build.zig | 30 ++++++++++++++++++ pkg/harfbuzz/c.zig | 8 ----- pkg/harfbuzz/c_import.h | 9 ++++++ pkg/harfbuzz/common.zig | 2 +- pkg/harfbuzz/coretext.zig | 2 +- pkg/harfbuzz/face.zig | 2 +- pkg/harfbuzz/font.zig | 2 +- pkg/harfbuzz/freetype.zig | 2 +- pkg/harfbuzz/main.zig | 2 +- pkg/harfbuzz/shape.zig | 2 +- pkg/harfbuzz/version.zig | 2 +- pkg/macos/animation.zig | 2 +- pkg/macos/animation/c.zig | 1 - pkg/macos/build.zig | 30 ++++++++++++++++++ pkg/macos/c_empty.zig | 2 ++ pkg/macos/c_import.h | 20 ++++++++++++ pkg/macos/carbon.zig | 2 +- pkg/macos/carbon/c.zig | 1 - pkg/macos/dispatch.zig | 2 +- pkg/macos/dispatch/c.zig | 1 - pkg/macos/dispatch/data.zig | 2 +- pkg/macos/dispatch/queue.zig | 2 +- pkg/macos/foundation.zig | 2 +- pkg/macos/foundation/array.zig | 2 +- pkg/macos/foundation/attributed_string.zig | 2 +- pkg/macos/foundation/base.zig | 2 +- pkg/macos/foundation/c.zig | 1 - pkg/macos/foundation/character_set.zig | 2 +- pkg/macos/foundation/data.zig | 2 +- pkg/macos/foundation/dictionary.zig | 2 +- pkg/macos/foundation/number.zig | 2 +- pkg/macos/foundation/string.zig | 2 +- pkg/macos/foundation/url.zig | 2 +- pkg/macos/graphics.zig | 2 +- pkg/macos/graphics/affine_transform.zig | 2 +- pkg/macos/graphics/bitmap_context.zig | 2 +- pkg/macos/graphics/c.zig | 1 - pkg/macos/graphics/color_space.zig | 2 +- pkg/macos/graphics/context.zig | 2 +- pkg/macos/graphics/font.zig | 2 +- pkg/macos/graphics/geometry.zig | 2 +- pkg/macos/graphics/image.zig | 2 +- pkg/macos/graphics/path.zig | 2 +- pkg/macos/iosurface.zig | 2 +- pkg/macos/iosurface/c.zig | 1 - pkg/macos/iosurface/iosurface.zig | 2 +- pkg/macos/main.zig | 22 +------------ pkg/macos/os.zig | 2 +- pkg/macos/os/c.zig | 1 - pkg/macos/os/log.zig | 2 +- pkg/macos/os/signpost.zig | 2 +- pkg/macos/text.zig | 2 +- pkg/macos/text/c.zig | 1 - pkg/macos/text/font.zig | 2 +- pkg/macos/text/font_collection.zig | 2 +- pkg/macos/text/font_descriptor.zig | 2 +- pkg/macos/text/font_manager.zig | 2 +- pkg/macos/text/frame.zig | 2 +- pkg/macos/text/framesetter.zig | 2 +- pkg/macos/text/line.zig | 2 +- pkg/macos/text/paragraph_style.zig | 2 +- pkg/macos/text/run.zig | 2 +- pkg/macos/text/stylized_strings.zig | 2 +- pkg/macos/text/typesetter.zig | 2 +- pkg/macos/video.zig | 2 +- pkg/macos/video/c.zig | 1 - pkg/macos/video/display_link.zig | 2 +- pkg/macos/video/pixel_format.zig | 2 +- pkg/oniguruma/build.zig | 9 ++++++ pkg/oniguruma/c.zig | 3 -- pkg/oniguruma/c_import.h | 1 + pkg/oniguruma/errors.zig | 2 +- pkg/oniguruma/init.zig | 2 +- pkg/oniguruma/main.zig | 2 +- pkg/oniguruma/match_param.zig | 2 +- pkg/oniguruma/regex.zig | 2 +- pkg/oniguruma/region.zig | 2 +- pkg/oniguruma/types.zig | 2 +- pkg/opengl/Buffer.zig | 2 +- pkg/opengl/Framebuffer.zig | 2 +- pkg/opengl/Program.zig | 2 +- pkg/opengl/Renderbuffer.zig | 2 +- pkg/opengl/Sampler.zig | 2 +- pkg/opengl/Shader.zig | 2 +- pkg/opengl/Texture.zig | 2 +- pkg/opengl/VertexArray.zig | 2 +- pkg/opengl/build.zig | 17 +++++++++- pkg/opengl/c.zig | 3 -- pkg/opengl/c_import.h | 1 + pkg/opengl/draw.zig | 2 +- pkg/opengl/errors.zig | 2 +- pkg/opengl/extensions.zig | 2 +- pkg/opengl/glad.zig | 2 +- pkg/opengl/main.zig | 2 +- pkg/opengl/primitives.zig | 2 +- pkg/sentry/build.zig | 17 ++++++++++ pkg/sentry/c.zig | 3 -- pkg/sentry/c_import.h | 1 + pkg/sentry/envelope.zig | 2 +- pkg/sentry/main.zig | 2 +- pkg/sentry/transport.zig | 2 +- pkg/sentry/uuid.zig | 2 +- pkg/sentry/value.zig | 2 +- pkg/spirv-cross/build.zig | 9 ++++++ pkg/spirv-cross/c.zig | 3 -- pkg/spirv-cross/c_import.h | 1 + pkg/spirv-cross/main.zig | 2 +- pkg/wuffs/build.zig | 36 ++++++++++++++++++++- pkg/wuffs/src/c.zig | 18 ----------- pkg/wuffs/src/c_import.h | 1 + pkg/wuffs/src/error.zig | 2 +- pkg/wuffs/src/jpeg.zig | 2 +- pkg/wuffs/src/png.zig | 2 +- pkg/wuffs/src/swizzle.zig | 2 +- 149 files changed, 390 insertions(+), 195 deletions(-) create mode 100644 pkg/dcimgui/c_import.h delete mode 100644 pkg/fontconfig/c.zig create mode 100644 pkg/fontconfig/c_import.h delete mode 100644 pkg/freetype/c.zig create mode 100644 pkg/freetype/c_import.h delete mode 100644 pkg/glslang/c.zig create mode 100644 pkg/glslang/c_import.h delete mode 100644 pkg/harfbuzz/c.zig create mode 100644 pkg/harfbuzz/c_import.h delete mode 100644 pkg/macos/animation/c.zig create mode 100644 pkg/macos/c_empty.zig create mode 100644 pkg/macos/c_import.h delete mode 100644 pkg/macos/carbon/c.zig delete mode 100644 pkg/macos/dispatch/c.zig delete mode 100644 pkg/macos/foundation/c.zig delete mode 100644 pkg/macos/graphics/c.zig delete mode 100644 pkg/macos/iosurface/c.zig delete mode 100644 pkg/macos/os/c.zig delete mode 100644 pkg/macos/text/c.zig delete mode 100644 pkg/macos/video/c.zig delete mode 100644 pkg/oniguruma/c.zig create mode 100644 pkg/oniguruma/c_import.h delete mode 100644 pkg/opengl/c.zig create mode 100644 pkg/opengl/c_import.h delete mode 100644 pkg/sentry/c.zig create mode 100644 pkg/sentry/c_import.h delete mode 100644 pkg/spirv-cross/c.zig create mode 100644 pkg/spirv-cross/c_import.h delete mode 100644 pkg/wuffs/src/c.zig create mode 100644 pkg/wuffs/src/c_import.h diff --git a/pkg/dcimgui/build.zig b/pkg/dcimgui/build.zig index 01a5879d6..1f1797d6b 100644 --- a/pkg/dcimgui/build.zig +++ b/pkg/dcimgui/build.zig @@ -45,6 +45,29 @@ pub fn build(b: *std.Build) !void { mod.addOptions("build_options", options); mod.linkLibrary(lib); + { + const tc = b.addTranslateC(.{ + .root_source_file = b.path("c_import.h"), + .target = target, + .optimize = optimize, + }); + if (target.result.os.tag.isDarwin()) { + const libc = try std.zig.LibCInstallation.findNative(.{ + .allocator = b.allocator, + .target = &target.result, + .verbose = false, + }); + tc.addSystemIncludePath(.{ .cwd_relative = libc.sys_include_dir.? }); + } + if (b.lazyDependency("bindings", .{})) |bindings| { + tc.addIncludePath(bindings.path("")); + } + if (b.lazyDependency("imgui", .{})) |imgui| { + tc.addIncludePath(imgui.path("")); + } + mod.addImport("c", tc.createModule()); + } + // We need to add proper Apple SDKs to find stdlib headers if (target.result.os.tag.isDarwin()) { if (!target.query.isNative()) { @@ -196,6 +219,20 @@ pub fn build(b: *std.Build) !void { }); test_exe.root_module.addOptions("build_options", options); test_exe.linkLibrary(lib); + { + const tc = b.addTranslateC(.{ + .root_source_file = b.path("c_import.h"), + .target = target, + .optimize = optimize, + }); + if (b.lazyDependency("bindings", .{})) |bindings| { + tc.addIncludePath(bindings.path("")); + } + if (b.lazyDependency("imgui", .{})) |imgui| { + tc.addIncludePath(imgui.path("")); + } + test_exe.root_module.addImport("c", tc.createModule()); + } const tests_run = b.addRunArtifact(test_exe); const test_step = b.step("test", "Run tests"); test_step.dependOn(&tests_run.step); diff --git a/pkg/dcimgui/c_import.h b/pkg/dcimgui/c_import.h new file mode 100644 index 000000000..1e0271f69 --- /dev/null +++ b/pkg/dcimgui/c_import.h @@ -0,0 +1,7 @@ +// This is set during the build so it also has to be set +// during import time to get the right types. Without this +// you get stack size mismatches on some structs. +#define IMGUI_USE_WCHAR32 1 + +#define IMGUI_HAS_DOCK 1 +#include "dcimgui.h" diff --git a/pkg/dcimgui/main.zig b/pkg/dcimgui/main.zig index 40a4325c0..880932e75 100644 --- a/pkg/dcimgui/main.zig +++ b/pkg/dcimgui/main.zig @@ -1,14 +1,6 @@ pub const build_options = @import("build_options"); -pub const c = @cImport({ - // This is set during the build so it also has to be set - // during import time to get the right types. Without this - // you get stack size mismatches on some structs. - @cDefine("IMGUI_USE_WCHAR32", "1"); - - @cDefine("IMGUI_HAS_DOCK", "1"); - @cInclude("dcimgui.h"); -}); +pub const c = @import("c"); // OpenGL3 backend pub extern fn ImGui_ImplOpenGL3_Init(glsl_version: ?[*:0]const u8) callconv(.c) bool; diff --git a/pkg/fontconfig/build.zig b/pkg/fontconfig/build.zig index 7c87d1f2e..43079740e 100644 --- a/pkg/fontconfig/build.zig +++ b/pkg/fontconfig/build.zig @@ -242,6 +242,18 @@ fn buildLib(b: *std.Build, module: *std.Build.Module, options: anytype) !*std.Bu if (b.lazyDependency("fontconfig", .{})) |upstream| { lib.addIncludePath(upstream.path("")); module.addIncludePath(upstream.path("")); + + { + const tc = b.addTranslateC(.{ + .root_source_file = b.path("c_import.h"), + .target = target, + .optimize = optimize, + }); + tc.addIncludePath(b.path("override/include")); + tc.addIncludePath(upstream.path("")); + module.addImport("c", tc.createModule()); + } + lib.addCSourceFiles(.{ .root = upstream.path(""), .files = srcs, diff --git a/pkg/fontconfig/c.zig b/pkg/fontconfig/c.zig deleted file mode 100644 index 6e8ae76bc..000000000 --- a/pkg/fontconfig/c.zig +++ /dev/null @@ -1,3 +0,0 @@ -pub const c = @cImport({ - @cInclude("fontconfig/fontconfig.h"); -}); diff --git a/pkg/fontconfig/c_import.h b/pkg/fontconfig/c_import.h new file mode 100644 index 000000000..87ce9ee3b --- /dev/null +++ b/pkg/fontconfig/c_import.h @@ -0,0 +1 @@ +#include "fontconfig/fontconfig.h" diff --git a/pkg/fontconfig/char_set.zig b/pkg/fontconfig/char_set.zig index b0e3a3415..5861bfda1 100644 --- a/pkg/fontconfig/char_set.zig +++ b/pkg/fontconfig/char_set.zig @@ -1,6 +1,6 @@ const std = @import("std"); const assert = std.debug.assert; -const c = @import("c.zig").c; +const c = @import("c"); pub const CharSet = opaque { pub fn create() *CharSet { diff --git a/pkg/fontconfig/common.zig b/pkg/fontconfig/common.zig index 6ad6f5685..a3f83463d 100644 --- a/pkg/fontconfig/common.zig +++ b/pkg/fontconfig/common.zig @@ -1,5 +1,5 @@ const std = @import("std"); -const c = @import("c.zig").c; +const c = @import("c"); const Error = @import("main.zig").Error; pub const Weight = enum(c_uint) { diff --git a/pkg/fontconfig/config.zig b/pkg/fontconfig/config.zig index 2b3674c54..dff06a890 100644 --- a/pkg/fontconfig/config.zig +++ b/pkg/fontconfig/config.zig @@ -1,5 +1,5 @@ const std = @import("std"); -const c = @import("c.zig").c; +const c = @import("c"); const Error = @import("main.zig").Error; const CharSet = @import("char_set.zig").CharSet; const FontSet = @import("font_set.zig").FontSet; diff --git a/pkg/fontconfig/font_set.zig b/pkg/fontconfig/font_set.zig index c5a8c5f97..007c39785 100644 --- a/pkg/fontconfig/font_set.zig +++ b/pkg/fontconfig/font_set.zig @@ -1,6 +1,6 @@ const std = @import("std"); const assert = std.debug.assert; -const c = @import("c.zig").c; +const c = @import("c"); const Pattern = @import("pattern.zig").Pattern; pub const FontSet = opaque { diff --git a/pkg/fontconfig/init.zig b/pkg/fontconfig/init.zig index 6e8f4d617..b96f0c7af 100644 --- a/pkg/fontconfig/init.zig +++ b/pkg/fontconfig/init.zig @@ -1,5 +1,5 @@ const std = @import("std"); -const c = @import("c.zig").c; +const c = @import("c"); const Config = @import("config.zig").Config; pub fn init() bool { diff --git a/pkg/fontconfig/lang_set.zig b/pkg/fontconfig/lang_set.zig index abefcc3e6..6e624a572 100644 --- a/pkg/fontconfig/lang_set.zig +++ b/pkg/fontconfig/lang_set.zig @@ -1,6 +1,6 @@ const std = @import("std"); const assert = std.debug.assert; -const c = @import("c.zig").c; +const c = @import("c"); pub const LangSet = opaque { pub fn create() *LangSet { diff --git a/pkg/fontconfig/main.zig b/pkg/fontconfig/main.zig index 61f8a3295..4cad06f0a 100644 --- a/pkg/fontconfig/main.zig +++ b/pkg/fontconfig/main.zig @@ -11,7 +11,7 @@ const pattern = @import("pattern.zig"); const range = @import("range.zig"); const value = @import("value.zig"); -pub const c = @import("c.zig").c; +pub const c = @import("c"); pub const init = initpkg.init; pub const fini = initpkg.fini; pub const initLoadConfig = initpkg.initLoadConfig; diff --git a/pkg/fontconfig/matrix.zig b/pkg/fontconfig/matrix.zig index a9b05a9eb..8ae938c0e 100644 --- a/pkg/fontconfig/matrix.zig +++ b/pkg/fontconfig/matrix.zig @@ -1,6 +1,6 @@ const std = @import("std"); const assert = std.debug.assert; -const c = @import("c.zig").c; +const c = @import("c"); pub const Matrix = extern struct { xx: f64, diff --git a/pkg/fontconfig/object_set.zig b/pkg/fontconfig/object_set.zig index 29cf63862..37a803b0a 100644 --- a/pkg/fontconfig/object_set.zig +++ b/pkg/fontconfig/object_set.zig @@ -1,5 +1,5 @@ const std = @import("std"); -const c = @import("c.zig").c; +const c = @import("c"); const Property = @import("main.zig").Property; pub const ObjectSet = opaque { diff --git a/pkg/fontconfig/pattern.zig b/pkg/fontconfig/pattern.zig index 3a623e223..4c032736e 100644 --- a/pkg/fontconfig/pattern.zig +++ b/pkg/fontconfig/pattern.zig @@ -1,6 +1,6 @@ const std = @import("std"); const assert = std.debug.assert; -const c = @import("c.zig").c; +const c = @import("c"); const Error = @import("main.zig").Error; const ObjectSet = @import("main.zig").ObjectSet; const Property = @import("main.zig").Property; diff --git a/pkg/fontconfig/range.zig b/pkg/fontconfig/range.zig index 9eb0ef268..ecbfd6b81 100644 --- a/pkg/fontconfig/range.zig +++ b/pkg/fontconfig/range.zig @@ -1,6 +1,6 @@ const std = @import("std"); const assert = std.debug.assert; -const c = @import("c.zig").c; +const c = @import("c"); pub const Range = opaque { pub fn destroy(self: *Range) void { diff --git a/pkg/fontconfig/value.zig b/pkg/fontconfig/value.zig index 89f796a26..2d2c23c1b 100644 --- a/pkg/fontconfig/value.zig +++ b/pkg/fontconfig/value.zig @@ -1,6 +1,6 @@ const std = @import("std"); const assert = std.debug.assert; -const c = @import("c.zig").c; +const c = @import("c"); const CharSet = @import("main.zig").CharSet; const LangSet = @import("main.zig").LangSet; const Matrix = @import("main.zig").Matrix; diff --git a/pkg/freetype/Library.zig b/pkg/freetype/Library.zig index 1cff79210..4f09a2b35 100644 --- a/pkg/freetype/Library.zig +++ b/pkg/freetype/Library.zig @@ -1,7 +1,7 @@ const Library = @This(); const std = @import("std"); -const c = @import("c.zig").c; +const c = @import("c"); const Face = @import("face.zig").Face; const errors = @import("errors.zig"); const Error = errors.Error; diff --git a/pkg/freetype/build.zig b/pkg/freetype/build.zig index b85310a5b..7dd716864 100644 --- a/pkg/freetype/build.zig +++ b/pkg/freetype/build.zig @@ -36,6 +36,27 @@ pub fn build(b: *std.Build) !void { module.addIncludePath(b.path("")); + { + const tc = b.addTranslateC(.{ + .root_source_file = b.path("c_import.h"), + .target = target, + .optimize = optimize, + }); + if (target.result.os.tag.isDarwin()) { + const libc = try std.zig.LibCInstallation.findNative(.{ + .allocator = b.allocator, + .target = &target.result, + .verbose = false, + }); + tc.addSystemIncludePath(.{ .cwd_relative = libc.sys_include_dir.? }); + } + tc.addIncludePath(b.path("")); + if (b.lazyDependency("freetype", .{})) |upstream| { + tc.addIncludePath(upstream.path("include")); + } + module.addImport("c", tc.createModule()); + } + if (b.systemIntegrationOption("freetype", .{})) { module.linkSystemLibrary("freetype2", dynamic_link_opts); if (test_exe) |exe| { diff --git a/pkg/freetype/c.zig b/pkg/freetype/c.zig deleted file mode 100644 index 9431abeb6..000000000 --- a/pkg/freetype/c.zig +++ /dev/null @@ -1,3 +0,0 @@ -pub const c = @cImport({ - @cInclude("freetype-zig.h"); -}); diff --git a/pkg/freetype/c_import.h b/pkg/freetype/c_import.h new file mode 100644 index 000000000..6f3810e71 --- /dev/null +++ b/pkg/freetype/c_import.h @@ -0,0 +1 @@ +#include "freetype-zig.h" diff --git a/pkg/freetype/computations.zig b/pkg/freetype/computations.zig index fc9b2ccb2..359d99fe6 100644 --- a/pkg/freetype/computations.zig +++ b/pkg/freetype/computations.zig @@ -1,5 +1,5 @@ const std = @import("std"); -const c = @import("c.zig").c; +const c = @import("c"); /// Compute (a*b)/0x10000 with maximum accuracy. Its main use is to multiply /// a given value by a 16.16 fixed-point factor. diff --git a/pkg/freetype/errors.zig b/pkg/freetype/errors.zig index 9eddc0575..7bab72009 100644 --- a/pkg/freetype/errors.zig +++ b/pkg/freetype/errors.zig @@ -1,4 +1,4 @@ -const c = @import("c.zig").c; +const c = @import("c"); // Thanks to Mach (https://github.com/hexops/mach) for this work, I didn't // do this manually. I wrote the other Freetype bindings by hand but this diff --git a/pkg/freetype/face.zig b/pkg/freetype/face.zig index cd949e357..ed086145f 100644 --- a/pkg/freetype/face.zig +++ b/pkg/freetype/face.zig @@ -1,6 +1,6 @@ const std = @import("std"); const Allocator = std.mem.Allocator; -const c = @import("c.zig").c; +const c = @import("c"); const errors = @import("errors.zig"); const Library = @import("Library.zig"); const Tag = @import("tag.zig").Tag; diff --git a/pkg/freetype/main.zig b/pkg/freetype/main.zig index 6ec818181..16d3898b5 100644 --- a/pkg/freetype/main.zig +++ b/pkg/freetype/main.zig @@ -3,7 +3,7 @@ const errors = @import("errors.zig"); const face = @import("face.zig"); const tag = @import("tag.zig"); -pub const c = @import("c.zig").c; +pub const c = @import("c"); pub const testing = @import("test.zig"); pub const Library = @import("Library.zig"); diff --git a/pkg/glslang/build.zig b/pkg/glslang/build.zig index 1dc82a6e3..9a85cdec0 100644 --- a/pkg/glslang/build.zig +++ b/pkg/glslang/build.zig @@ -17,6 +17,25 @@ pub fn build(b: *std.Build) !void { if (upstream) |v| module.addIncludePath(v.path("")); module.addIncludePath(b.path("override")); + { + const tc = b.addTranslateC(.{ + .root_source_file = b.path("c_import.h"), + .target = target, + .optimize = optimize, + }); + if (target.result.os.tag.isDarwin()) { + const libc = try std.zig.LibCInstallation.findNative(.{ + .allocator = b.allocator, + .target = &target.result, + .verbose = false, + }); + tc.addSystemIncludePath(.{ .cwd_relative = libc.sys_include_dir.? }); + } + if (upstream) |v| tc.addIncludePath(v.path("")); + tc.addIncludePath(b.path("override")); + module.addImport("c", tc.createModule()); + } + if (target.query.isNative()) { const test_exe = b.addTest(.{ .name = "test", diff --git a/pkg/glslang/c.zig b/pkg/glslang/c.zig deleted file mode 100644 index c00108463..000000000 --- a/pkg/glslang/c.zig +++ /dev/null @@ -1,4 +0,0 @@ -pub const c = @cImport({ - @cInclude("glslang/Include/glslang_c_interface.h"); - @cInclude("glslang/Public/resource_limits_c.h"); -}); diff --git a/pkg/glslang/c_import.h b/pkg/glslang/c_import.h new file mode 100644 index 000000000..0cef5f57f --- /dev/null +++ b/pkg/glslang/c_import.h @@ -0,0 +1,2 @@ +#include "glslang/Include/glslang_c_interface.h" +#include "glslang/Public/resource_limits_c.h" diff --git a/pkg/glslang/init.zig b/pkg/glslang/init.zig index a865e9e79..11d5c011d 100644 --- a/pkg/glslang/init.zig +++ b/pkg/glslang/init.zig @@ -1,4 +1,4 @@ -const c = @import("c.zig").c; +const c = @import("c"); pub fn init() !void { if (c.glslang_initialize_process() == 0) return error.GlslangInitFailed; diff --git a/pkg/glslang/main.zig b/pkg/glslang/main.zig index 2743650c6..333808652 100644 --- a/pkg/glslang/main.zig +++ b/pkg/glslang/main.zig @@ -2,7 +2,7 @@ const initpkg = @import("init.zig"); const program = @import("program.zig"); const shader = @import("shader.zig"); -pub const c = @import("c.zig").c; +pub const c = @import("c"); pub const testing = @import("test.zig"); pub const init = initpkg.init; diff --git a/pkg/glslang/program.zig b/pkg/glslang/program.zig index 4af687cc5..fcebb698c 100644 --- a/pkg/glslang/program.zig +++ b/pkg/glslang/program.zig @@ -1,5 +1,5 @@ const std = @import("std"); -const c = @import("c.zig").c; +const c = @import("c"); const testlib = @import("test.zig"); const Shader = @import("shader.zig").Shader; diff --git a/pkg/glslang/shader.zig b/pkg/glslang/shader.zig index 36a09f34d..22cfdc1f3 100644 --- a/pkg/glslang/shader.zig +++ b/pkg/glslang/shader.zig @@ -1,5 +1,5 @@ const std = @import("std"); -const c = @import("c.zig").c; +const c = @import("c"); const testlib = @import("test.zig"); pub const Shader = opaque { diff --git a/pkg/harfbuzz/blob.zig b/pkg/harfbuzz/blob.zig index 9472e4c75..cc98f547c 100644 --- a/pkg/harfbuzz/blob.zig +++ b/pkg/harfbuzz/blob.zig @@ -1,5 +1,5 @@ const std = @import("std"); -const c = @import("c.zig").c; +const c = @import("c"); const Error = @import("errors.zig").Error; /// Data type holding the memory modes available to client programs. diff --git a/pkg/harfbuzz/buffer.zig b/pkg/harfbuzz/buffer.zig index b97c1bef4..2d109dd45 100644 --- a/pkg/harfbuzz/buffer.zig +++ b/pkg/harfbuzz/buffer.zig @@ -1,5 +1,5 @@ const std = @import("std"); -const c = @import("c.zig").c; +const c = @import("c"); const common = @import("common.zig"); const Error = @import("errors.zig").Error; const Direction = common.Direction; diff --git a/pkg/harfbuzz/build.zig b/pkg/harfbuzz/build.zig index 6d8f3be70..e70c081e2 100644 --- a/pkg/harfbuzz/build.zig +++ b/pkg/harfbuzz/build.zig @@ -168,6 +168,36 @@ fn buildLib(b: *std.Build, module: *std.Build.Module, options: anytype) !*std.Bu if (b.lazyDependency("harfbuzz", .{})) |upstream| { lib.addIncludePath(upstream.path("src")); module.addIncludePath(upstream.path("src")); + + { + const tc = b.addTranslateC(.{ + .root_source_file = b.path("c_import.h"), + .target = target, + .optimize = optimize, + }); + tc.addIncludePath(upstream.path("src")); + if (freetype_enabled) { + tc.defineCMacro("GHOSTTY_HARFBUZZ_FREETYPE", "1"); + if (!b.systemIntegrationOption("freetype", .{})) { + if (freetype.builder.lazyDependency("freetype", .{})) |freetype_dep| { + tc.addIncludePath(freetype_dep.path("include")); + } + } + } + if (coretext_enabled) { + tc.defineCMacro("GHOSTTY_HARFBUZZ_CORETEXT", "1"); + if (target.result.os.tag.isDarwin()) { + const libc = try std.zig.LibCInstallation.findNative(.{ + .allocator = b.allocator, + .target = &target.result, + .verbose = false, + }); + tc.addSystemIncludePath(.{ .cwd_relative = libc.sys_include_dir.? }); + } + } + module.addImport("c", tc.createModule()); + } + lib.addCSourceFile(.{ .file = upstream.path("src/harfbuzz.cc"), .flags = flags.items, diff --git a/pkg/harfbuzz/c.zig b/pkg/harfbuzz/c.zig deleted file mode 100644 index 49e87dce7..000000000 --- a/pkg/harfbuzz/c.zig +++ /dev/null @@ -1,8 +0,0 @@ -const builtin = @import("builtin"); -const build_options = @import("build_options"); - -pub const c = @cImport({ - @cInclude("hb.h"); - if (build_options.freetype) @cInclude("hb-ft.h"); - if (build_options.coretext) @cInclude("hb-coretext.h"); -}); diff --git a/pkg/harfbuzz/c_import.h b/pkg/harfbuzz/c_import.h new file mode 100644 index 000000000..90e354933 --- /dev/null +++ b/pkg/harfbuzz/c_import.h @@ -0,0 +1,9 @@ +#include "hb.h" + +#ifdef GHOSTTY_HARFBUZZ_FREETYPE +#include "hb-ft.h" +#endif + +#ifdef GHOSTTY_HARFBUZZ_CORETEXT +#include "hb-coretext.h" +#endif diff --git a/pkg/harfbuzz/common.zig b/pkg/harfbuzz/common.zig index 840ff5868..6b3434dbf 100644 --- a/pkg/harfbuzz/common.zig +++ b/pkg/harfbuzz/common.zig @@ -1,5 +1,5 @@ const std = @import("std"); -const c = @import("c.zig").c; +const c = @import("c"); /// The direction of a text segment or buffer. /// diff --git a/pkg/harfbuzz/coretext.zig b/pkg/harfbuzz/coretext.zig index 73042624c..2377ef7fe 100644 --- a/pkg/harfbuzz/coretext.zig +++ b/pkg/harfbuzz/coretext.zig @@ -1,6 +1,6 @@ const macos = @import("macos"); const std = @import("std"); -const c = @import("c.zig").c; +const c = @import("c"); const Face = @import("face.zig").Face; const Font = @import("font.zig").Font; const Error = @import("errors.zig").Error; diff --git a/pkg/harfbuzz/face.zig b/pkg/harfbuzz/face.zig index 5ffad5d3e..c7fd437d5 100644 --- a/pkg/harfbuzz/face.zig +++ b/pkg/harfbuzz/face.zig @@ -1,5 +1,5 @@ const std = @import("std"); -const c = @import("c.zig").c; +const c = @import("c"); /// A font face is an object that represents a single face from within a font family. /// diff --git a/pkg/harfbuzz/font.zig b/pkg/harfbuzz/font.zig index 13544fb9f..6f8ee3250 100644 --- a/pkg/harfbuzz/font.zig +++ b/pkg/harfbuzz/font.zig @@ -1,5 +1,5 @@ const std = @import("std"); -const c = @import("c.zig").c; +const c = @import("c"); const Face = @import("face.zig").Face; const Error = @import("errors.zig").Error; diff --git a/pkg/harfbuzz/freetype.zig b/pkg/harfbuzz/freetype.zig index d90d3f83c..0da9efc9c 100644 --- a/pkg/harfbuzz/freetype.zig +++ b/pkg/harfbuzz/freetype.zig @@ -1,6 +1,6 @@ const freetype = @import("freetype"); const std = @import("std"); -const c = @import("c.zig").c; +const c = @import("c"); const Face = @import("face.zig").Face; const Font = @import("font.zig").Font; const Error = @import("errors.zig").Error; diff --git a/pkg/harfbuzz/main.zig b/pkg/harfbuzz/main.zig index 08a4f9c2a..146c07df2 100644 --- a/pkg/harfbuzz/main.zig +++ b/pkg/harfbuzz/main.zig @@ -7,7 +7,7 @@ const font = @import("font.zig"); const shapepkg = @import("shape.zig"); const versionpkg = @import("version.zig"); -pub const c = @import("c.zig").c; +pub const c = @import("c"); pub const freetype = @import("freetype.zig"); pub const coretext = @import("coretext.zig"); pub const MemoryMode = blob.MemoryMode; diff --git a/pkg/harfbuzz/shape.zig b/pkg/harfbuzz/shape.zig index b49020c3c..08477333b 100644 --- a/pkg/harfbuzz/shape.zig +++ b/pkg/harfbuzz/shape.zig @@ -1,5 +1,5 @@ const std = @import("std"); -const c = @import("c.zig").c; +const c = @import("c"); const Font = @import("font.zig").Font; const Buffer = @import("buffer.zig").Buffer; const Feature = @import("common.zig").Feature; diff --git a/pkg/harfbuzz/version.zig b/pkg/harfbuzz/version.zig index dbe25b522..614093e97 100644 --- a/pkg/harfbuzz/version.zig +++ b/pkg/harfbuzz/version.zig @@ -1,5 +1,5 @@ const std = @import("std"); -const c = @import("c.zig").c; +const c = @import("c"); pub const Version = struct { major: u32, diff --git a/pkg/macos/animation.zig b/pkg/macos/animation.zig index 247f97605..ceb857758 100644 --- a/pkg/macos/animation.zig +++ b/pkg/macos/animation.zig @@ -1,4 +1,4 @@ -pub const c = @import("animation/c.zig").c; +pub const c = @import("c"); /// https://developer.apple.com/documentation/quartzcore/calayer/contents_gravity_values?language=objc pub extern "c" const kCAGravityTopLeft: *anyopaque; diff --git a/pkg/macos/animation/c.zig b/pkg/macos/animation/c.zig deleted file mode 100644 index 1a7d1627e..000000000 --- a/pkg/macos/animation/c.zig +++ /dev/null @@ -1 +0,0 @@ -pub const c = @import("../main.zig").c; diff --git a/pkg/macos/build.zig b/pkg/macos/build.zig index 0525e481e..97f243104 100644 --- a/pkg/macos/build.zig +++ b/pkg/macos/build.zig @@ -12,6 +12,36 @@ pub fn build(b: *std.Build) !void { .optimize = optimize, }); + if (target.result.os.tag.isDarwin()) { + const tc = b.addTranslateC(.{ + .root_source_file = b.path("c_import.h"), + .target = target, + .optimize = optimize, + }); + const libc = try std.zig.LibCInstallation.findNative(.{ + .allocator = b.allocator, + .target = &target.result, + .verbose = false, + }); + tc.addSystemIncludePath(.{ .cwd_relative = libc.sys_include_dir.? }); + + // Framework headers (CoreFoundation, CoreGraphics, etc.) + const sdk_path = std.fs.path.dirname(std.fs.path.dirname(libc.sys_include_dir.?).?).?; + tc.addSystemFrameworkPath(.{ + .cwd_relative = try std.fs.path.join(b.allocator, &.{ + sdk_path, + "System", + "Library", + "Frameworks", + }), + }); + module.addImport("c", tc.createModule()); + } else { + module.addImport("c", b.createModule(.{ + .root_source_file = b.path("c_empty.zig"), + })); + } + const lib = b.addLibrary(.{ .name = "macos", .root_module = b.createModule(.{ diff --git a/pkg/macos/c_empty.zig b/pkg/macos/c_empty.zig new file mode 100644 index 000000000..65e305167 --- /dev/null +++ b/pkg/macos/c_empty.zig @@ -0,0 +1,2 @@ +// Empty stub for non-Darwin targets where the macOS C headers +// are not available. diff --git a/pkg/macos/c_import.h b/pkg/macos/c_import.h new file mode 100644 index 000000000..6c1706ad7 --- /dev/null +++ b/pkg/macos/c_import.h @@ -0,0 +1,20 @@ +// All of our C imports consolidated into one place. We used to +// import them one by one in each package but Zig 0.14 has some +// kind of issue with that I wasn't able to minimize. +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef __APPLE__ +#include +#if TARGET_OS_MAC && !TARGET_OS_IPHONE +#include +#endif +#endif diff --git a/pkg/macos/carbon.zig b/pkg/macos/carbon.zig index 8eafaffe6..a06212a48 100644 --- a/pkg/macos/carbon.zig +++ b/pkg/macos/carbon.zig @@ -1,4 +1,4 @@ -pub const c = @import("carbon/c.zig").c; +pub const c = @import("c"); test { @import("std").testing.refAllDecls(@This()); diff --git a/pkg/macos/carbon/c.zig b/pkg/macos/carbon/c.zig deleted file mode 100644 index 1a7d1627e..000000000 --- a/pkg/macos/carbon/c.zig +++ /dev/null @@ -1 +0,0 @@ -pub const c = @import("../main.zig").c; diff --git a/pkg/macos/dispatch.zig b/pkg/macos/dispatch.zig index 3add9c0e9..3211a113f 100644 --- a/pkg/macos/dispatch.zig +++ b/pkg/macos/dispatch.zig @@ -1,4 +1,4 @@ -pub const c = @import("dispatch/c.zig").c; +pub const c = @import("c"); pub const data = @import("dispatch/data.zig"); pub const queue = @import("dispatch/queue.zig"); pub const Data = data.Data; diff --git a/pkg/macos/dispatch/c.zig b/pkg/macos/dispatch/c.zig deleted file mode 100644 index 1a7d1627e..000000000 --- a/pkg/macos/dispatch/c.zig +++ /dev/null @@ -1 +0,0 @@ -pub const c = @import("../main.zig").c; diff --git a/pkg/macos/dispatch/data.zig b/pkg/macos/dispatch/data.zig index 28df24b7b..2d7dd0db0 100644 --- a/pkg/macos/dispatch/data.zig +++ b/pkg/macos/dispatch/data.zig @@ -1,6 +1,6 @@ const std = @import("std"); const foundation = @import("../foundation.zig"); -const c = @import("c.zig").c; +const c = @import("c"); pub const Data = opaque { pub const DESTRUCTOR_DEFAULT = c.DISPATCH_DATA_DESTRUCTOR_DEFAULT; diff --git a/pkg/macos/dispatch/queue.zig b/pkg/macos/dispatch/queue.zig index cb2ca01c9..7e161c04d 100644 --- a/pkg/macos/dispatch/queue.zig +++ b/pkg/macos/dispatch/queue.zig @@ -1,5 +1,5 @@ const std = @import("std"); -const c = @import("c.zig").c; +const c = @import("c"); pub const Queue = *anyopaque; // dispatch_queue_t diff --git a/pkg/macos/foundation.zig b/pkg/macos/foundation.zig index d4f634091..02de85007 100644 --- a/pkg/macos/foundation.zig +++ b/pkg/macos/foundation.zig @@ -9,7 +9,7 @@ const string = @import("foundation/string.zig"); const typepkg = @import("foundation/type.zig"); const url = @import("foundation/url.zig"); -pub const c = @import("foundation/c.zig").c; +pub const c = @import("c"); pub const Array = array.Array; pub const MutableArray = array.MutableArray; pub const AttributedString = attributed_string.AttributedString; diff --git a/pkg/macos/foundation/array.zig b/pkg/macos/foundation/array.zig index 7b580eb03..98fc31b3e 100644 --- a/pkg/macos/foundation/array.zig +++ b/pkg/macos/foundation/array.zig @@ -1,7 +1,7 @@ const std = @import("std"); const Allocator = std.mem.Allocator; const base = @import("base.zig"); -const c = @import("c.zig").c; +const c = @import("c"); const cftype = @import("type.zig"); const ComparisonResult = base.ComparisonResult; const Range = base.Range; diff --git a/pkg/macos/foundation/attributed_string.zig b/pkg/macos/foundation/attributed_string.zig index c7f27d7d7..d236a023b 100644 --- a/pkg/macos/foundation/attributed_string.zig +++ b/pkg/macos/foundation/attributed_string.zig @@ -3,7 +3,7 @@ const assert = std.debug.assert; const Allocator = std.mem.Allocator; const foundation = @import("../foundation.zig"); const text = @import("../text.zig"); -const c = @import("c.zig").c; +const c = @import("c"); pub const AttributedString = opaque { pub fn create( diff --git a/pkg/macos/foundation/base.zig b/pkg/macos/foundation/base.zig index b926523fa..5cac6efed 100644 --- a/pkg/macos/foundation/base.zig +++ b/pkg/macos/foundation/base.zig @@ -1,6 +1,6 @@ const std = @import("std"); const assert = std.debug.assert; -const c = @import("c.zig").c; +const c = @import("c"); pub const ComparisonResult = enum(c_int) { less = -1, diff --git a/pkg/macos/foundation/c.zig b/pkg/macos/foundation/c.zig deleted file mode 100644 index 1a7d1627e..000000000 --- a/pkg/macos/foundation/c.zig +++ /dev/null @@ -1 +0,0 @@ -pub const c = @import("../main.zig").c; diff --git a/pkg/macos/foundation/character_set.zig b/pkg/macos/foundation/character_set.zig index d80ca45dc..1a24280f1 100644 --- a/pkg/macos/foundation/character_set.zig +++ b/pkg/macos/foundation/character_set.zig @@ -2,7 +2,7 @@ const std = @import("std"); const assert = std.debug.assert; const Allocator = std.mem.Allocator; const foundation = @import("../foundation.zig"); -const c = @import("c.zig").c; +const c = @import("c"); pub const CharacterSet = opaque { pub fn createWithCharactersInString( diff --git a/pkg/macos/foundation/data.zig b/pkg/macos/foundation/data.zig index c06da65b7..53cb6c7b2 100644 --- a/pkg/macos/foundation/data.zig +++ b/pkg/macos/foundation/data.zig @@ -1,7 +1,7 @@ const std = @import("std"); const Allocator = std.mem.Allocator; const foundation = @import("../foundation.zig"); -const c = @import("c.zig").c; +const c = @import("c"); pub const Data = opaque { pub fn createWithBytesNoCopy(data: []const u8) Allocator.Error!*Data { diff --git a/pkg/macos/foundation/dictionary.zig b/pkg/macos/foundation/dictionary.zig index a529442ac..6baca98ec 100644 --- a/pkg/macos/foundation/dictionary.zig +++ b/pkg/macos/foundation/dictionary.zig @@ -2,7 +2,7 @@ const std = @import("std"); const assert = std.debug.assert; const Allocator = std.mem.Allocator; const foundation = @import("../foundation.zig"); -const c = @import("c.zig").c; +const c = @import("c"); pub const Dictionary = opaque { pub fn create( diff --git a/pkg/macos/foundation/number.zig b/pkg/macos/foundation/number.zig index 88bf9edf6..11f6a4afe 100644 --- a/pkg/macos/foundation/number.zig +++ b/pkg/macos/foundation/number.zig @@ -1,7 +1,7 @@ const std = @import("std"); const Allocator = std.mem.Allocator; const foundation = @import("../foundation.zig"); -const c = @import("c.zig").c; +const c = @import("c"); pub const Number = opaque { pub fn create( diff --git a/pkg/macos/foundation/string.zig b/pkg/macos/foundation/string.zig index 2f679fef4..a7b61d889 100644 --- a/pkg/macos/foundation/string.zig +++ b/pkg/macos/foundation/string.zig @@ -2,7 +2,7 @@ const std = @import("std"); const assert = std.debug.assert; const Allocator = std.mem.Allocator; const foundation = @import("../foundation.zig"); -const c = @import("c.zig").c; +const c = @import("c"); pub const String = opaque { pub fn createWithBytes( diff --git a/pkg/macos/foundation/url.zig b/pkg/macos/foundation/url.zig index b48a71817..a7e1b8fb8 100644 --- a/pkg/macos/foundation/url.zig +++ b/pkg/macos/foundation/url.zig @@ -1,7 +1,7 @@ const std = @import("std"); const Allocator = std.mem.Allocator; const foundation = @import("../foundation.zig"); -const c = @import("c.zig").c; +const c = @import("c"); pub const URL = opaque { pub fn createWithString(str: *foundation.String, base: ?*URL) Allocator.Error!*URL { diff --git a/pkg/macos/graphics.zig b/pkg/macos/graphics.zig index 5195da4a5..e9447aeef 100644 --- a/pkg/macos/graphics.zig +++ b/pkg/macos/graphics.zig @@ -6,7 +6,7 @@ const geometry = @import("graphics/geometry.zig"); const image = @import("graphics/image.zig"); const path = @import("graphics/path.zig"); -pub const c = @import("graphics/c.zig").c; +pub const c = @import("c"); pub const AffineTransform = affine_transform.AffineTransform; pub const BitmapContext = bitmap_context.BitmapContext; pub const ColorSpace = color_space.ColorSpace; diff --git a/pkg/macos/graphics/affine_transform.zig b/pkg/macos/graphics/affine_transform.zig index e649e7a18..c54d6503d 100644 --- a/pkg/macos/graphics/affine_transform.zig +++ b/pkg/macos/graphics/affine_transform.zig @@ -1,6 +1,6 @@ const std = @import("std"); const assert = std.debug.assert; -const c = @import("c.zig").c; +const c = @import("c"); pub const AffineTransform = extern struct { a: c.CGFloat, diff --git a/pkg/macos/graphics/bitmap_context.zig b/pkg/macos/graphics/bitmap_context.zig index 7db5577f6..81fb1795b 100644 --- a/pkg/macos/graphics/bitmap_context.zig +++ b/pkg/macos/graphics/bitmap_context.zig @@ -3,7 +3,7 @@ const assert = std.debug.assert; const Allocator = std.mem.Allocator; const graphics = @import("../graphics.zig"); const Context = @import("context.zig").Context; -const c = @import("c.zig").c; +const c = @import("c"); pub const BitmapContext = opaque { pub const context = Context(BitmapContext); diff --git a/pkg/macos/graphics/c.zig b/pkg/macos/graphics/c.zig deleted file mode 100644 index 1a7d1627e..000000000 --- a/pkg/macos/graphics/c.zig +++ /dev/null @@ -1 +0,0 @@ -pub const c = @import("../main.zig").c; diff --git a/pkg/macos/graphics/color_space.zig b/pkg/macos/graphics/color_space.zig index 16960591b..f68aebcb4 100644 --- a/pkg/macos/graphics/color_space.zig +++ b/pkg/macos/graphics/color_space.zig @@ -1,7 +1,7 @@ const std = @import("std"); const assert = std.debug.assert; const Allocator = std.mem.Allocator; -const c = @import("c.zig").c; +const c = @import("c"); pub const ColorSpace = opaque { pub fn createDeviceGray() Allocator.Error!*ColorSpace { diff --git a/pkg/macos/graphics/context.zig b/pkg/macos/graphics/context.zig index 77e4344e0..0369235f3 100644 --- a/pkg/macos/graphics/context.zig +++ b/pkg/macos/graphics/context.zig @@ -2,7 +2,7 @@ const std = @import("std"); const assert = std.debug.assert; const Allocator = std.mem.Allocator; const graphics = @import("../graphics.zig"); -const c = @import("c.zig").c; +const c = @import("c"); /// Returns a struct that has all the shared context functions for the /// given type. diff --git a/pkg/macos/graphics/font.zig b/pkg/macos/graphics/font.zig index c310c62a2..2c369ecf8 100644 --- a/pkg/macos/graphics/font.zig +++ b/pkg/macos/graphics/font.zig @@ -1,3 +1,3 @@ -const c = @import("c.zig").c; +const c = @import("c"); pub const Glyph = c.CGGlyph; diff --git a/pkg/macos/graphics/geometry.zig b/pkg/macos/graphics/geometry.zig index 66937403c..fca765c33 100644 --- a/pkg/macos/graphics/geometry.zig +++ b/pkg/macos/graphics/geometry.zig @@ -1,6 +1,6 @@ const std = @import("std"); const assert = std.debug.assert; -const c = @import("c.zig").c; +const c = @import("c"); pub const Point = extern struct { x: c.CGFloat, diff --git a/pkg/macos/graphics/image.zig b/pkg/macos/graphics/image.zig index 879384b12..342efc037 100644 --- a/pkg/macos/graphics/image.zig +++ b/pkg/macos/graphics/image.zig @@ -3,7 +3,7 @@ const assert = std.debug.assert; const Allocator = std.mem.Allocator; const graphics = @import("../graphics.zig"); const context = @import("context.zig"); -const c = @import("c.zig").c; +const c = @import("c"); pub const ImageAlphaInfo = enum(c_uint) { none = c.kCGImageAlphaNone, diff --git a/pkg/macos/graphics/path.zig b/pkg/macos/graphics/path.zig index 7f549709d..9e3a3daec 100644 --- a/pkg/macos/graphics/path.zig +++ b/pkg/macos/graphics/path.zig @@ -3,7 +3,7 @@ const assert = std.debug.assert; const Allocator = std.mem.Allocator; const foundation = @import("../foundation.zig"); const graphics = @import("../graphics.zig"); -const c = @import("c.zig").c; +const c = @import("c"); pub const Path = opaque { pub fn createWithRect( diff --git a/pkg/macos/iosurface.zig b/pkg/macos/iosurface.zig index 9d2e750cf..7025343af 100644 --- a/pkg/macos/iosurface.zig +++ b/pkg/macos/iosurface.zig @@ -1,6 +1,6 @@ const iosurface = @import("iosurface/iosurface.zig"); -pub const c = @import("iosurface/c.zig").c; +pub const c = @import("c"); pub const IOSurface = iosurface.IOSurface; test { diff --git a/pkg/macos/iosurface/c.zig b/pkg/macos/iosurface/c.zig deleted file mode 100644 index 1a7d1627e..000000000 --- a/pkg/macos/iosurface/c.zig +++ /dev/null @@ -1 +0,0 @@ -pub const c = @import("../main.zig").c; diff --git a/pkg/macos/iosurface/iosurface.zig b/pkg/macos/iosurface/iosurface.zig index 37f8712ba..32a201b6c 100644 --- a/pkg/macos/iosurface/iosurface.zig +++ b/pkg/macos/iosurface/iosurface.zig @@ -1,7 +1,7 @@ const std = @import("std"); const assert = std.debug.assert; const Allocator = std.mem.Allocator; -const c = @import("c.zig").c; +const c = @import("c"); const foundation = @import("../foundation.zig"); const graphics = @import("../graphics.zig"); const video = @import("../video.zig"); diff --git a/pkg/macos/main.zig b/pkg/macos/main.zig index e4f4b9504..4b705ffa1 100644 --- a/pkg/macos/main.zig +++ b/pkg/macos/main.zig @@ -1,5 +1,3 @@ -const builtin = @import("builtin"); - pub const carbon = @import("carbon.zig"); pub const foundation = @import("foundation.zig"); pub const animation = @import("animation.zig"); @@ -10,25 +8,7 @@ pub const text = @import("text.zig"); pub const video = @import("video.zig"); pub const iosurface = @import("iosurface.zig"); -// All of our C imports consolidated into one place. We used to -// import them one by one in each package but Zig 0.14 has some -// kind of issue with that I wasn't able to minimize. -pub const c = @cImport({ - @cInclude("CoreFoundation/CoreFoundation.h"); - @cInclude("CoreGraphics/CoreGraphics.h"); - @cInclude("CoreText/CoreText.h"); - @cInclude("CoreVideo/CoreVideo.h"); - @cInclude("CoreVideo/CVPixelBuffer.h"); - @cInclude("QuartzCore/CALayer.h"); - @cInclude("IOSurface/IOSurfaceRef.h"); - @cInclude("dispatch/dispatch.h"); - @cInclude("os/log.h"); - @cInclude("os/signpost.h"); - - if (builtin.os.tag == .macos) { - @cInclude("Carbon/Carbon.h"); - } -}); +pub const c = @import("c"); test { @import("std").testing.refAllDecls(@This()); diff --git a/pkg/macos/os.zig b/pkg/macos/os.zig index 9716a9abc..853595c92 100644 --- a/pkg/macos/os.zig +++ b/pkg/macos/os.zig @@ -1,6 +1,6 @@ const log = @import("os/log.zig"); -pub const c = @import("os/c.zig"); +pub const c = @import("c"); pub const signpost = @import("os/signpost.zig"); pub const Log = log.Log; pub const LogType = log.LogType; diff --git a/pkg/macos/os/c.zig b/pkg/macos/os/c.zig deleted file mode 100644 index 1a7d1627e..000000000 --- a/pkg/macos/os/c.zig +++ /dev/null @@ -1 +0,0 @@ -pub const c = @import("../main.zig").c; diff --git a/pkg/macos/os/log.zig b/pkg/macos/os/log.zig index 219c914da..28d19a0f5 100644 --- a/pkg/macos/os/log.zig +++ b/pkg/macos/os/log.zig @@ -1,7 +1,7 @@ const std = @import("std"); const assert = std.debug.assert; const Allocator = std.mem.Allocator; -const c = @import("c.zig").c; +const c = @import("c"); pub const Log = opaque { pub fn create( diff --git a/pkg/macos/os/signpost.zig b/pkg/macos/os/signpost.zig index 2bd12566f..d556757e5 100644 --- a/pkg/macos/os/signpost.zig +++ b/pkg/macos/os/signpost.zig @@ -1,7 +1,7 @@ const std = @import("std"); const assert = std.debug.assert; const Allocator = std.mem.Allocator; -const c = @import("c.zig").c; +const c = @import("c"); const logpkg = @import("log.zig"); const Log = logpkg.Log; diff --git a/pkg/macos/text.zig b/pkg/macos/text.zig index bfaa388b3..3bfc1b9bc 100644 --- a/pkg/macos/text.zig +++ b/pkg/macos/text.zig @@ -10,7 +10,7 @@ const paragraph_style = @import("text/paragraph_style.zig"); const run = @import("text/run.zig"); const stylized_strings = @import("text/stylized_strings.zig"); -pub const c = @import("text/c.zig").c; +pub const c = @import("c"); pub const Font = font.Font; pub const FontTableTag = font.FontTableTag; pub const FontCollection = font_collection.FontCollection; diff --git a/pkg/macos/text/c.zig b/pkg/macos/text/c.zig deleted file mode 100644 index 1a7d1627e..000000000 --- a/pkg/macos/text/c.zig +++ /dev/null @@ -1 +0,0 @@ -pub const c = @import("../main.zig").c; diff --git a/pkg/macos/text/font.zig b/pkg/macos/text/font.zig index ea37891f5..65fc44add 100644 --- a/pkg/macos/text/font.zig +++ b/pkg/macos/text/font.zig @@ -4,7 +4,7 @@ const Allocator = std.mem.Allocator; const foundation = @import("../foundation.zig"); const graphics = @import("../graphics.zig"); const text = @import("../text.zig"); -const c = @import("c.zig").c; +const c = @import("c"); pub const Font = opaque { pub fn createWithFontDescriptor(desc: *const text.FontDescriptor, size: f32) Allocator.Error!*Font { diff --git a/pkg/macos/text/font_collection.zig b/pkg/macos/text/font_collection.zig index 8b4a86a6f..68c47dc7b 100644 --- a/pkg/macos/text/font_collection.zig +++ b/pkg/macos/text/font_collection.zig @@ -2,7 +2,7 @@ const std = @import("std"); const Allocator = std.mem.Allocator; const foundation = @import("../foundation.zig"); const text = @import("../text.zig"); -const c = @import("c.zig").c; +const c = @import("c"); pub const FontCollection = opaque { pub fn createFromAvailableFonts() Allocator.Error!*FontCollection { diff --git a/pkg/macos/text/font_descriptor.zig b/pkg/macos/text/font_descriptor.zig index 563165bc7..c8655a230 100644 --- a/pkg/macos/text/font_descriptor.zig +++ b/pkg/macos/text/font_descriptor.zig @@ -1,7 +1,7 @@ const std = @import("std"); const Allocator = std.mem.Allocator; const foundation = @import("../foundation.zig"); -const c = @import("c.zig").c; +const c = @import("c"); pub const FontDescriptor = opaque { pub fn createWithNameAndSize(name: *foundation.String, size: f64) Allocator.Error!*FontDescriptor { diff --git a/pkg/macos/text/font_manager.zig b/pkg/macos/text/font_manager.zig index 988da1220..ebea502f5 100644 --- a/pkg/macos/text/font_manager.zig +++ b/pkg/macos/text/font_manager.zig @@ -2,7 +2,7 @@ const std = @import("std"); const Allocator = std.mem.Allocator; const foundation = @import("../foundation.zig"); const FontDescriptor = @import("./font_descriptor.zig").FontDescriptor; -const c = @import("c.zig").c; +const c = @import("c"); pub fn createFontDescriptorsFromURL(url: *foundation.URL) ?*foundation.Array { return @ptrFromInt(@intFromPtr(c.CTFontManagerCreateFontDescriptorsFromURL( diff --git a/pkg/macos/text/frame.zig b/pkg/macos/text/frame.zig index 979134a12..d8d452199 100644 --- a/pkg/macos/text/frame.zig +++ b/pkg/macos/text/frame.zig @@ -4,7 +4,7 @@ const Allocator = std.mem.Allocator; const foundation = @import("../foundation.zig"); const graphics = @import("../graphics.zig"); const text = @import("../text.zig"); -const c = @import("c.zig").c; +const c = @import("c"); pub const Frame = opaque { pub fn release(self: *Frame) void { diff --git a/pkg/macos/text/framesetter.zig b/pkg/macos/text/framesetter.zig index dbd82762c..0c9a5dc39 100644 --- a/pkg/macos/text/framesetter.zig +++ b/pkg/macos/text/framesetter.zig @@ -4,7 +4,7 @@ const Allocator = std.mem.Allocator; const foundation = @import("../foundation.zig"); const graphics = @import("../graphics.zig"); const text = @import("../text.zig"); -const c = @import("c.zig").c; +const c = @import("c"); pub const Framesetter = opaque { pub fn createWithAttributedString(str: *foundation.AttributedString) Allocator.Error!*Framesetter { diff --git a/pkg/macos/text/line.zig b/pkg/macos/text/line.zig index 248f8e645..33b73719b 100644 --- a/pkg/macos/text/line.zig +++ b/pkg/macos/text/line.zig @@ -4,7 +4,7 @@ const Allocator = std.mem.Allocator; const foundation = @import("../foundation.zig"); const graphics = @import("../graphics.zig"); const text = @import("../text.zig"); -const c = @import("c.zig").c; +const c = @import("c"); pub const Line = opaque { pub fn createWithAttributedString(str: *foundation.AttributedString) Allocator.Error!*Line { diff --git a/pkg/macos/text/paragraph_style.zig b/pkg/macos/text/paragraph_style.zig index f1d7fe957..ae6d29845 100644 --- a/pkg/macos/text/paragraph_style.zig +++ b/pkg/macos/text/paragraph_style.zig @@ -4,7 +4,7 @@ const Allocator = std.mem.Allocator; const foundation = @import("../foundation.zig"); const graphics = @import("../graphics.zig"); const text = @import("../text.zig"); -const c = @import("c.zig").c; +const c = @import("c"); // https://developer.apple.com/documentation/coretext/ctparagraphstyle?language=objc pub const ParagraphStyle = opaque { diff --git a/pkg/macos/text/run.zig b/pkg/macos/text/run.zig index 2895bfe34..5d90ef73f 100644 --- a/pkg/macos/text/run.zig +++ b/pkg/macos/text/run.zig @@ -4,7 +4,7 @@ const Allocator = std.mem.Allocator; const foundation = @import("../foundation.zig"); const graphics = @import("../graphics.zig"); const text = @import("../text.zig"); -const c = @import("c.zig").c; +const c = @import("c"); pub const Run = opaque { pub fn release(self: *Run) void { diff --git a/pkg/macos/text/stylized_strings.zig b/pkg/macos/text/stylized_strings.zig index 8e262f9a8..475e65074 100644 --- a/pkg/macos/text/stylized_strings.zig +++ b/pkg/macos/text/stylized_strings.zig @@ -1,5 +1,5 @@ const foundation = @import("../foundation.zig"); -const c = @import("c.zig").c; +const c = @import("c"); pub const StringAttribute = enum { font, diff --git a/pkg/macos/text/typesetter.zig b/pkg/macos/text/typesetter.zig index dc07df980..1704e91c8 100644 --- a/pkg/macos/text/typesetter.zig +++ b/pkg/macos/text/typesetter.zig @@ -4,7 +4,7 @@ const Allocator = std.mem.Allocator; const foundation = @import("../foundation.zig"); const graphics = @import("../graphics.zig"); const text = @import("../text.zig"); -const c = @import("c.zig").c; +const c = @import("c"); pub const Typesetter = opaque { pub fn createWithAttributedStringAndOptions( diff --git a/pkg/macos/video.zig b/pkg/macos/video.zig index d0b1125ab..4d317e9d2 100644 --- a/pkg/macos/video.zig +++ b/pkg/macos/video.zig @@ -1,7 +1,7 @@ const display_link = @import("video/display_link.zig"); const pixel_format = @import("video/pixel_format.zig"); -pub const c = @import("video/c.zig").c; +pub const c = @import("c"); pub const DisplayLink = display_link.DisplayLink; pub const PixelFormat = pixel_format.PixelFormat; diff --git a/pkg/macos/video/c.zig b/pkg/macos/video/c.zig deleted file mode 100644 index 1a7d1627e..000000000 --- a/pkg/macos/video/c.zig +++ /dev/null @@ -1 +0,0 @@ -pub const c = @import("../main.zig").c; diff --git a/pkg/macos/video/display_link.zig b/pkg/macos/video/display_link.zig index 7d6b437f9..58dffc34c 100644 --- a/pkg/macos/video/display_link.zig +++ b/pkg/macos/video/display_link.zig @@ -1,7 +1,7 @@ const std = @import("std"); const assert = std.debug.assert; const Allocator = std.mem.Allocator; -const c = @import("c.zig").c; +const c = @import("c"); pub const DisplayLink = opaque { pub const Error = error{ diff --git a/pkg/macos/video/pixel_format.zig b/pkg/macos/video/pixel_format.zig index 78091daa3..e171f1b88 100644 --- a/pkg/macos/video/pixel_format.zig +++ b/pkg/macos/video/pixel_format.zig @@ -1,4 +1,4 @@ -const c = @import("c.zig").c; +const c = @import("c"); pub const PixelFormat = enum(c_int) { /// 1 bit indexed diff --git a/pkg/oniguruma/build.zig b/pkg/oniguruma/build.zig index efc013b43..a5979f229 100644 --- a/pkg/oniguruma/build.zig +++ b/pkg/oniguruma/build.zig @@ -79,6 +79,15 @@ fn buildLib(b: *std.Build, module: *std.Build.Module, options: anytype) !*std.Bu if (b.lazyDependency("oniguruma", .{})) |upstream| { lib.addIncludePath(upstream.path("src")); module.addIncludePath(upstream.path("src")); + { + const tc = b.addTranslateC(.{ + .root_source_file = b.path("c_import.h"), + .target = target, + .optimize = optimize, + }); + tc.addIncludePath(upstream.path("src")); + module.addImport("c", tc.createModule()); + } lib.addConfigHeader(b.addConfigHeader(.{ .style = .{ .cmake = upstream.path("src/config.h.cmake.in") }, diff --git a/pkg/oniguruma/c.zig b/pkg/oniguruma/c.zig deleted file mode 100644 index 73732f903..000000000 --- a/pkg/oniguruma/c.zig +++ /dev/null @@ -1,3 +0,0 @@ -pub const c = @cImport({ - @cInclude("oniguruma.h"); -}); diff --git a/pkg/oniguruma/c_import.h b/pkg/oniguruma/c_import.h new file mode 100644 index 000000000..5dc9eb3bc --- /dev/null +++ b/pkg/oniguruma/c_import.h @@ -0,0 +1 @@ +#include "oniguruma.h" diff --git a/pkg/oniguruma/errors.zig b/pkg/oniguruma/errors.zig index d63a481bd..f409f2cd7 100644 --- a/pkg/oniguruma/errors.zig +++ b/pkg/oniguruma/errors.zig @@ -1,4 +1,4 @@ -const c = @import("c.zig").c; +const c = @import("c"); const Encoding = @import("types.zig").Encoding; /// Maximum error message length. diff --git a/pkg/oniguruma/init.zig b/pkg/oniguruma/init.zig index ea64724c2..270866444 100644 --- a/pkg/oniguruma/init.zig +++ b/pkg/oniguruma/init.zig @@ -1,4 +1,4 @@ -const c = @import("c.zig").c; +const c = @import("c"); const Encoding = @import("types.zig").Encoding; const errors = @import("errors.zig"); diff --git a/pkg/oniguruma/main.zig b/pkg/oniguruma/main.zig index 2541cc358..26b2a4ca5 100644 --- a/pkg/oniguruma/main.zig +++ b/pkg/oniguruma/main.zig @@ -4,7 +4,7 @@ const regex = @import("regex.zig"); const region = @import("region.zig"); const types = @import("types.zig"); -pub const c = @import("c.zig"); +pub const c = @import("c"); pub const testing = @import("testing.zig"); pub const errors = @import("errors.zig"); diff --git a/pkg/oniguruma/match_param.zig b/pkg/oniguruma/match_param.zig index b28258ff0..207ab8e56 100644 --- a/pkg/oniguruma/match_param.zig +++ b/pkg/oniguruma/match_param.zig @@ -1,4 +1,4 @@ -const c = @import("c.zig").c; +const c = @import("c"); const errors = @import("errors.zig"); const Error = errors.Error; diff --git a/pkg/oniguruma/regex.zig b/pkg/oniguruma/regex.zig index fd920e01a..a64f95595 100644 --- a/pkg/oniguruma/regex.zig +++ b/pkg/oniguruma/regex.zig @@ -1,5 +1,5 @@ const std = @import("std"); -const c = @import("c.zig").c; +const c = @import("c"); const types = @import("types.zig"); const errors = @import("errors.zig"); const testEnsureInit = @import("testing.zig").ensureInit; diff --git a/pkg/oniguruma/region.zig b/pkg/oniguruma/region.zig index 8c5c7a528..f9678c2b3 100644 --- a/pkg/oniguruma/region.zig +++ b/pkg/oniguruma/region.zig @@ -1,5 +1,5 @@ const std = @import("std"); -const c = @import("c.zig").c; +const c = @import("c"); pub const Region = extern struct { allocated: c_int = 0, diff --git a/pkg/oniguruma/types.zig b/pkg/oniguruma/types.zig index 84a0a7c95..a5276c5b2 100644 --- a/pkg/oniguruma/types.zig +++ b/pkg/oniguruma/types.zig @@ -1,5 +1,5 @@ const std = @import("std"); -const c = @import("c.zig").c; +const c = @import("c"); pub const Encoding = opaque { pub const ascii: *Encoding = @ptrCast(c.ONIG_ENCODING_ASCII()); diff --git a/pkg/opengl/Buffer.zig b/pkg/opengl/Buffer.zig index 609342958..bb04b75dd 100644 --- a/pkg/opengl/Buffer.zig +++ b/pkg/opengl/Buffer.zig @@ -1,7 +1,7 @@ const Buffer = @This(); const std = @import("std"); -const c = @import("c.zig").c; +const c = @import("c"); const errors = @import("errors.zig"); const glad = @import("glad.zig"); diff --git a/pkg/opengl/Framebuffer.zig b/pkg/opengl/Framebuffer.zig index ea1f0d2ba..f1bca9da1 100644 --- a/pkg/opengl/Framebuffer.zig +++ b/pkg/opengl/Framebuffer.zig @@ -1,7 +1,7 @@ const Framebuffer = @This(); const std = @import("std"); -const c = @import("c.zig").c; +const c = @import("c"); const errors = @import("errors.zig"); const glad = @import("glad.zig"); const Texture = @import("Texture.zig"); diff --git a/pkg/opengl/Program.zig b/pkg/opengl/Program.zig index ee77582c1..c563aebdb 100644 --- a/pkg/opengl/Program.zig +++ b/pkg/opengl/Program.zig @@ -4,7 +4,7 @@ const std = @import("std"); const assert = std.debug.assert; const log = std.log.scoped(.opengl); -const c = @import("c.zig").c; +const c = @import("c"); const Shader = @import("Shader.zig"); const errors = @import("errors.zig"); const glad = @import("glad.zig"); diff --git a/pkg/opengl/Renderbuffer.zig b/pkg/opengl/Renderbuffer.zig index ef21287f7..2f4647d60 100644 --- a/pkg/opengl/Renderbuffer.zig +++ b/pkg/opengl/Renderbuffer.zig @@ -1,7 +1,7 @@ const Renderbuffer = @This(); const std = @import("std"); -const c = @import("c.zig").c; +const c = @import("c"); const errors = @import("errors.zig"); const glad = @import("glad.zig"); diff --git a/pkg/opengl/Sampler.zig b/pkg/opengl/Sampler.zig index f5c15699f..82c4c1505 100644 --- a/pkg/opengl/Sampler.zig +++ b/pkg/opengl/Sampler.zig @@ -1,7 +1,7 @@ const Sampler = @This(); const std = @import("std"); -const c = @import("c.zig").c; +const c = @import("c"); const errors = @import("errors.zig"); const glad = @import("glad.zig"); const Texture = @import("Texture.zig"); diff --git a/pkg/opengl/Shader.zig b/pkg/opengl/Shader.zig index 8973ace30..0084c8729 100644 --- a/pkg/opengl/Shader.zig +++ b/pkg/opengl/Shader.zig @@ -4,7 +4,7 @@ const std = @import("std"); const assert = std.debug.assert; const log = std.log.scoped(.opengl); -const c = @import("c.zig").c; +const c = @import("c"); const errors = @import("errors.zig"); const glad = @import("glad.zig"); diff --git a/pkg/opengl/Texture.zig b/pkg/opengl/Texture.zig index 03e794855..fea6ce3e6 100644 --- a/pkg/opengl/Texture.zig +++ b/pkg/opengl/Texture.zig @@ -1,7 +1,7 @@ const Texture = @This(); const std = @import("std"); -const c = @import("c.zig").c; +const c = @import("c"); const errors = @import("errors.zig"); const glad = @import("glad.zig"); diff --git a/pkg/opengl/VertexArray.zig b/pkg/opengl/VertexArray.zig index 44bf31621..3817f8fa0 100644 --- a/pkg/opengl/VertexArray.zig +++ b/pkg/opengl/VertexArray.zig @@ -1,6 +1,6 @@ const VertexArray = @This(); -const c = @import("c.zig").c; +const c = @import("c"); const glad = @import("glad.zig"); const errors = @import("errors.zig"); diff --git a/pkg/opengl/build.zig b/pkg/opengl/build.zig index f472053ed..3710af9f2 100644 --- a/pkg/opengl/build.zig +++ b/pkg/opengl/build.zig @@ -1,6 +1,21 @@ const std = @import("std"); pub fn build(b: *std.Build) !void { - const module = b.addModule("opengl", .{ .root_source_file = b.path("main.zig") }); + const target = b.standardTargetOptions(.{}); + const optimize = b.standardOptimizeOption(.{}); + + const module = b.addModule("opengl", .{ + .root_source_file = b.path("main.zig"), + .target = target, + .optimize = optimize, + }); module.addIncludePath(b.path("../../vendor/glad/include")); + + const c = b.addTranslateC(.{ + .root_source_file = b.path("c_import.h"), + .target = target, + .optimize = optimize, + }); + c.addIncludePath(b.path("../../vendor/glad/include")); + module.addImport("c", c.createModule()); } diff --git a/pkg/opengl/c.zig b/pkg/opengl/c.zig deleted file mode 100644 index fc95ee94c..000000000 --- a/pkg/opengl/c.zig +++ /dev/null @@ -1,3 +0,0 @@ -pub const c = @cImport({ - @cInclude("glad/gl.h"); -}); diff --git a/pkg/opengl/c_import.h b/pkg/opengl/c_import.h new file mode 100644 index 000000000..00751570c --- /dev/null +++ b/pkg/opengl/c_import.h @@ -0,0 +1 @@ +#include "glad/gl.h" diff --git a/pkg/opengl/draw.zig b/pkg/opengl/draw.zig index 50110f605..8c205864a 100644 --- a/pkg/opengl/draw.zig +++ b/pkg/opengl/draw.zig @@ -1,4 +1,4 @@ -const c = @import("c.zig").c; +const c = @import("c"); const errors = @import("errors.zig"); const glad = @import("glad.zig"); const Primitive = @import("primitives.zig").Primitive; diff --git a/pkg/opengl/errors.zig b/pkg/opengl/errors.zig index ec0464604..cfae2c276 100644 --- a/pkg/opengl/errors.zig +++ b/pkg/opengl/errors.zig @@ -1,5 +1,5 @@ const std = @import("std"); -const c = @import("c.zig").c; +const c = @import("c"); const glad = @import("glad.zig"); pub const Error = error{ diff --git a/pkg/opengl/extensions.zig b/pkg/opengl/extensions.zig index 5fdbada93..1c49bdbce 100644 --- a/pkg/opengl/extensions.zig +++ b/pkg/opengl/extensions.zig @@ -1,5 +1,5 @@ const std = @import("std"); -const c = @import("c.zig").c; +const c = @import("c"); const errors = @import("errors.zig"); const glad = @import("glad.zig"); diff --git a/pkg/opengl/glad.zig b/pkg/opengl/glad.zig index 663e75e12..d766a60b6 100644 --- a/pkg/opengl/glad.zig +++ b/pkg/opengl/glad.zig @@ -1,5 +1,5 @@ const std = @import("std"); -const c = @import("c.zig").c; +const c = @import("c"); pub const Context = c.GladGLContext; diff --git a/pkg/opengl/main.zig b/pkg/opengl/main.zig index 2f22154c6..4abbf7ee7 100644 --- a/pkg/opengl/main.zig +++ b/pkg/opengl/main.zig @@ -11,7 +11,7 @@ //! WARNING: Lots of performance improvements that we can make with Zig //! comptime help. I'm deferring this until later but have some fun ideas. -pub const c = @import("c.zig").c; +pub const c = @import("c"); pub const glad = @import("glad.zig"); pub const ext = @import("extensions.zig"); pub const Buffer = @import("Buffer.zig"); diff --git a/pkg/opengl/primitives.zig b/pkg/opengl/primitives.zig index e12f51a66..c5235e9af 100644 --- a/pkg/opengl/primitives.zig +++ b/pkg/opengl/primitives.zig @@ -1,4 +1,4 @@ -pub const c = @import("c.zig").c; +pub const c = @import("c"); pub const Primitive = enum(c_int) { point = c.GL_POINTS, diff --git a/pkg/sentry/build.zig b/pkg/sentry/build.zig index 3c88df56d..3025a63c9 100644 --- a/pkg/sentry/build.zig +++ b/pkg/sentry/build.zig @@ -46,6 +46,23 @@ pub fn build(b: *std.Build) !void { if (b.lazyDependency("sentry", .{})) |upstream| { module.addIncludePath(upstream.path("include")); + + const tc = b.addTranslateC(.{ + .root_source_file = b.path("c_import.h"), + .target = target, + .optimize = optimize, + }); + if (target.result.os.tag.isDarwin()) { + const libc = try std.zig.LibCInstallation.findNative(.{ + .allocator = b.allocator, + .target = &target.result, + .verbose = false, + }); + tc.addSystemIncludePath(.{ .cwd_relative = libc.sys_include_dir.? }); + } + tc.addIncludePath(upstream.path("include")); + module.addImport("c", tc.createModule()); + lib.addIncludePath(upstream.path("include")); lib.addIncludePath(upstream.path("src")); lib.addCSourceFiles(.{ diff --git a/pkg/sentry/c.zig b/pkg/sentry/c.zig deleted file mode 100644 index 4a0184a8d..000000000 --- a/pkg/sentry/c.zig +++ /dev/null @@ -1,3 +0,0 @@ -pub const c = @cImport({ - @cInclude("sentry.h"); -}); diff --git a/pkg/sentry/c_import.h b/pkg/sentry/c_import.h new file mode 100644 index 000000000..aaac9cbb4 --- /dev/null +++ b/pkg/sentry/c_import.h @@ -0,0 +1 @@ +#include "sentry.h" diff --git a/pkg/sentry/envelope.zig b/pkg/sentry/envelope.zig index 0d0e38e12..ff9b7c458 100644 --- a/pkg/sentry/envelope.zig +++ b/pkg/sentry/envelope.zig @@ -1,6 +1,6 @@ const std = @import("std"); const assert = std.debug.assert; -const c = @import("c.zig").c; +const c = @import("c"); const Value = @import("value.zig").Value; /// sentry_envelope_t diff --git a/pkg/sentry/main.zig b/pkg/sentry/main.zig index 35fc57dfe..f6066cc70 100644 --- a/pkg/sentry/main.zig +++ b/pkg/sentry/main.zig @@ -1,4 +1,4 @@ -pub const c = @import("c.zig").c; +pub const c = @import("c"); const transport = @import("transport.zig"); diff --git a/pkg/sentry/transport.zig b/pkg/sentry/transport.zig index 747187211..c421c4b63 100644 --- a/pkg/sentry/transport.zig +++ b/pkg/sentry/transport.zig @@ -1,6 +1,6 @@ const std = @import("std"); const assert = std.debug.assert; -const c = @import("c.zig").c; +const c = @import("c"); const Envelope = @import("envelope.zig").Envelope; /// sentry_transport_t diff --git a/pkg/sentry/uuid.zig b/pkg/sentry/uuid.zig index 07268fdaf..1a942248c 100644 --- a/pkg/sentry/uuid.zig +++ b/pkg/sentry/uuid.zig @@ -1,6 +1,6 @@ const std = @import("std"); const assert = std.debug.assert; -const c = @import("c.zig").c; +const c = @import("c"); /// sentry_uuid_t pub const UUID = struct { diff --git a/pkg/sentry/value.zig b/pkg/sentry/value.zig index 0c839ecd7..2092ca379 100644 --- a/pkg/sentry/value.zig +++ b/pkg/sentry/value.zig @@ -1,6 +1,6 @@ const std = @import("std"); const assert = std.debug.assert; -const c = @import("c.zig").c; +const c = @import("c"); const Level = @import("level.zig").Level; /// sentry_value_t diff --git a/pkg/spirv-cross/build.zig b/pkg/spirv-cross/build.zig index 72ce61eb6..4cabb0668 100644 --- a/pkg/spirv-cross/build.zig +++ b/pkg/spirv-cross/build.zig @@ -88,6 +88,15 @@ fn buildSpirvCross( if (b.lazyDependency("spirv_cross", .{})) |upstream| { lib.addIncludePath(upstream.path("")); module.addIncludePath(upstream.path("")); + { + const tc = b.addTranslateC(.{ + .root_source_file = b.path("c_import.h"), + .target = target, + .optimize = optimize, + }); + tc.addIncludePath(upstream.path("")); + module.addImport("c", tc.createModule()); + } lib.addCSourceFiles(.{ .root = upstream.path(""), .flags = flags.items, diff --git a/pkg/spirv-cross/c.zig b/pkg/spirv-cross/c.zig deleted file mode 100644 index 08a999a3b..000000000 --- a/pkg/spirv-cross/c.zig +++ /dev/null @@ -1,3 +0,0 @@ -pub const c = @cImport({ - @cInclude("spirv_cross_c.h"); -}); diff --git a/pkg/spirv-cross/c_import.h b/pkg/spirv-cross/c_import.h new file mode 100644 index 000000000..d87fb59c9 --- /dev/null +++ b/pkg/spirv-cross/c_import.h @@ -0,0 +1 @@ +#include "spirv_cross_c.h" diff --git a/pkg/spirv-cross/main.zig b/pkg/spirv-cross/main.zig index 1ef5493ba..a068e467c 100644 --- a/pkg/spirv-cross/main.zig +++ b/pkg/spirv-cross/main.zig @@ -1 +1 @@ -pub const c = @import("c.zig").c; +pub const c = @import("c"); diff --git a/pkg/wuffs/build.zig b/pkg/wuffs/build.zig index 3d9f83daa..9919905d9 100644 --- a/pkg/wuffs/build.zig +++ b/pkg/wuffs/build.zig @@ -1,5 +1,19 @@ const std = @import("std"); +/// All the C macros defined so that the header matches the build. +const defines: []const []const u8 = &.{ + "WUFFS_CONFIG__MODULES", + "WUFFS_CONFIG__MODULE__AUX__BASE", + "WUFFS_CONFIG__MODULE__AUX__IMAGE", + "WUFFS_CONFIG__MODULE__BASE", + "WUFFS_CONFIG__MODULE__ADLER32", + "WUFFS_CONFIG__MODULE__CRC32", + "WUFFS_CONFIG__MODULE__DEFLATE", + "WUFFS_CONFIG__MODULE__JPEG", + "WUFFS_CONFIG__MODULE__PNG", + "WUFFS_CONFIG__MODULE__ZLIB", +}; + pub fn build(b: *std.Build) !void { const target = b.standardTargetOptions(.{}); const optimize = b.standardOptimizeOption(.{}); @@ -20,12 +34,32 @@ pub fn build(b: *std.Build) !void { var flags: std.ArrayList([]const u8) = .empty; defer flags.deinit(b.allocator); try flags.append(b.allocator, "-DWUFFS_IMPLEMENTATION"); - inline for (@import("src/c.zig").defines) |key| { + inline for (defines) |key| { try flags.append(b.allocator, "-D" ++ key); } if (b.lazyDependency("wuffs", .{})) |wuffs_dep| { module.addIncludePath(wuffs_dep.path("release/c")); + { + const tc = b.addTranslateC(.{ + .root_source_file = b.path("src/c_import.h"), + .target = target, + .optimize = optimize, + }); + if (target.result.os.tag.isDarwin()) { + const libc = try std.zig.LibCInstallation.findNative(.{ + .allocator = b.allocator, + .target = &target.result, + .verbose = false, + }); + tc.addSystemIncludePath(.{ .cwd_relative = libc.sys_include_dir.? }); + } + tc.addIncludePath(wuffs_dep.path("release/c")); + inline for (defines) |key| { + tc.defineCMacro(key, "1"); + } + module.addImport("c", tc.createModule()); + } module.addCSourceFile(.{ .file = wuffs_dep.path("release/c/wuffs-v0.4.c"), .flags = flags.items, diff --git a/pkg/wuffs/src/c.zig b/pkg/wuffs/src/c.zig deleted file mode 100644 index d94247df3..000000000 --- a/pkg/wuffs/src/c.zig +++ /dev/null @@ -1,18 +0,0 @@ -pub const c = @cImport({ - for (defines) |d| @cDefine(d, "1"); - @cInclude("wuffs-v0.4.c"); -}); - -/// All the C macros defined so that the header matches the build. -pub const defines: []const []const u8 = &[_][]const u8{ - "WUFFS_CONFIG__MODULES", - "WUFFS_CONFIG__MODULE__AUX__BASE", - "WUFFS_CONFIG__MODULE__AUX__IMAGE", - "WUFFS_CONFIG__MODULE__BASE", - "WUFFS_CONFIG__MODULE__ADLER32", - "WUFFS_CONFIG__MODULE__CRC32", - "WUFFS_CONFIG__MODULE__DEFLATE", - "WUFFS_CONFIG__MODULE__JPEG", - "WUFFS_CONFIG__MODULE__PNG", - "WUFFS_CONFIG__MODULE__ZLIB", -}; diff --git a/pkg/wuffs/src/c_import.h b/pkg/wuffs/src/c_import.h new file mode 100644 index 000000000..2bfbb8dc5 --- /dev/null +++ b/pkg/wuffs/src/c_import.h @@ -0,0 +1 @@ +#include "wuffs-v0.4.c" diff --git a/pkg/wuffs/src/error.zig b/pkg/wuffs/src/error.zig index 0be55cf4e..80e280a9b 100644 --- a/pkg/wuffs/src/error.zig +++ b/pkg/wuffs/src/error.zig @@ -1,6 +1,6 @@ const std = @import("std"); -const c = @import("c.zig").c; +const c = @import("c"); pub const Error = std.mem.Allocator.Error || error{ WuffsError, Overflow }; diff --git a/pkg/wuffs/src/jpeg.zig b/pkg/wuffs/src/jpeg.zig index 69d91c8a9..85e5408da 100644 --- a/pkg/wuffs/src/jpeg.zig +++ b/pkg/wuffs/src/jpeg.zig @@ -1,6 +1,6 @@ const std = @import("std"); const Allocator = std.mem.Allocator; -const c = @import("c.zig").c; +const c = @import("c"); const Error = @import("error.zig").Error; const check = @import("error.zig").check; const ImageData = @import("main.zig").ImageData; diff --git a/pkg/wuffs/src/png.zig b/pkg/wuffs/src/png.zig index 57a0e63bb..2128a401c 100644 --- a/pkg/wuffs/src/png.zig +++ b/pkg/wuffs/src/png.zig @@ -1,6 +1,6 @@ const std = @import("std"); const Allocator = std.mem.Allocator; -const c = @import("c.zig").c; +const c = @import("c"); const Error = @import("error.zig").Error; const check = @import("error.zig").check; const ImageData = @import("main.zig").ImageData; diff --git a/pkg/wuffs/src/swizzle.zig b/pkg/wuffs/src/swizzle.zig index 352cf2b50..27ee090c5 100644 --- a/pkg/wuffs/src/swizzle.zig +++ b/pkg/wuffs/src/swizzle.zig @@ -1,7 +1,7 @@ const std = @import("std"); const Allocator = std.mem.Allocator; const assert = std.debug.assert; -const c = @import("c.zig").c; +const c = @import("c"); const Error = @import("error.zig").Error; const log = std.log.scoped(.wuffs_swizzler);