summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMitchell Hashimoto <mitchell.hashimoto@gmail.com>2022-08-20 10:24:49 -0700
committerMitchell Hashimoto <mitchell.hashimoto@gmail.com>2022-08-20 10:24:49 -0700
commit728df4af1660a8488a960a94a4704782d1930baf (patch)
treefd74659583c396c190f40ed10b3dfd33e56f0017
parent583eec0fe631a2d868dd24cac34c2620b2fa2692 (diff)
build libpng and link freetype to it
-rw-r--r--.gitmodules3
-rw-r--r--build.zig16
-rw-r--r--pkg/freetype/build.zig29
-rw-r--r--pkg/libpng/build.zig98
-rw-r--r--pkg/libpng/pnglibconf.h219
-rw-r--r--pkg/zlib/build.zig2
m---------vendor/libpng0
7 files changed, 363 insertions, 4 deletions
diff --git a/.gitmodules b/.gitmodules
index e9cf6369c..fcee35578 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -16,3 +16,6 @@
[submodule "vendor/zlib"]
path = vendor/zlib
url = https://github.com/madler/zlib.git
+[submodule "vendor/libpng"]
+ path = vendor/libpng
+ url = https://github.com/glennrp/libpng.git
diff --git a/build.zig b/build.zig
index f0fcbe703..2614fee9d 100644
--- a/build.zig
+++ b/build.zig
@@ -5,6 +5,8 @@ const LibExeObjStep = std.build.LibExeObjStep;
const glfw = @import("vendor/mach/glfw/build.zig");
const freetype = @import("pkg/freetype/build.zig");
const libuv = @import("pkg/libuv/build.zig");
+const libpng = @import("pkg/libpng/build.zig");
+const zlib = @import("pkg/zlib/build.zig");
const tracylib = @import("pkg/tracy/build.zig");
const system_sdk = @import("vendor/mach/glfw/system_sdk.zig");
@@ -143,9 +145,21 @@ fn addDeps(
step.addIncludeDir("vendor/glad/include/");
step.addCSourceFile("vendor/glad/src/gl.c", &.{});
+ const zlib_step = try zlib.link(b, step);
+ const libpng_step = try libpng.link(b, step, .{
+ .zlib = .{
+ .step = zlib_step,
+ .include = zlib.include_path,
+ },
+ });
+
// Freetype
step.addPackage(freetype.pkg);
- _ = try freetype.link(b, step);
+ _ = try freetype.link(b, step, .{
+ .libpng = freetype.Options.Libpng{
+ .step = libpng_step,
+ },
+ });
// Glfw
step.addPackage(glfw.pkg);
diff --git a/pkg/freetype/build.zig b/pkg/freetype/build.zig
index 7c152d5cc..4a407ea73 100644
--- a/pkg/freetype/build.zig
+++ b/pkg/freetype/build.zig
@@ -14,8 +14,22 @@ fn thisDir() []const u8 {
return std.fs.path.dirname(@src().file) orelse ".";
}
-pub fn link(b: *std.build.Builder, step: *std.build.LibExeObjStep) !*std.build.LibExeObjStep {
- const lib = try buildFreetype(b, step);
+pub const Options = struct {
+ libpng: Libpng = .{},
+
+ pub const Libpng = struct {
+ enabled: bool = false,
+ step: ?*std.build.LibExeObjStep = null,
+ include: ?[]const u8 = null,
+ };
+};
+
+pub fn link(
+ b: *std.build.Builder,
+ step: *std.build.LibExeObjStep,
+ opt: Options,
+) !*std.build.LibExeObjStep {
+ const lib = try buildFreetype(b, step, opt);
step.linkLibrary(lib);
step.addIncludePath(include_path);
step.addIncludePath(include_path_self);
@@ -25,6 +39,7 @@ pub fn link(b: *std.build.Builder, step: *std.build.LibExeObjStep) !*std.build.L
pub fn buildFreetype(
b: *std.build.Builder,
step: *std.build.LibExeObjStep,
+ opt: Options,
) !*std.build.LibExeObjStep {
const target = step.target;
const lib = b.addStaticLibrary("freetype", null);
@@ -36,6 +51,15 @@ pub fn buildFreetype(
// Link
lib.linkLibC();
+ if (opt.libpng.enabled) {
+ if (opt.libpng.step) |libpng|
+ lib.linkLibrary(libpng)
+ else
+ lib.linkSystemLibrary("libpng");
+
+ if (opt.libpng.include) |dir|
+ lib.addIncludePath(dir);
+ }
// Compile
var flags = std.ArrayList([]const u8).init(b.allocator);
@@ -47,6 +71,7 @@ pub fn buildFreetype(
"-DHAVE_UNISTD_H",
"-DHAVE_FCNTL_H",
});
+ if (opt.libpng.enabled) try flags.append("-DFT_CONFIG_OPTION_USE_PNG");
// C files
lib.addCSourceFiles(srcs, flags.items);
diff --git a/pkg/libpng/build.zig b/pkg/libpng/build.zig
new file mode 100644
index 000000000..2edc66248
--- /dev/null
+++ b/pkg/libpng/build.zig
@@ -0,0 +1,98 @@
+const std = @import("std");
+
+/// Directories with our includes.
+const root = thisDir() ++ "../../../vendor/libpng/";
+const include_path = root;
+const include_path_pnglibconf = thisDir();
+
+pub const pkg = std.build.Pkg{
+ .name = "libpng",
+ .source = .{ .path = thisDir() ++ "/main.zig" },
+};
+
+fn thisDir() []const u8 {
+ return std.fs.path.dirname(@src().file) orelse ".";
+}
+
+pub const Options = struct {
+ zlib: Zlib = .{},
+
+ pub const Zlib = struct {
+ step: ?*std.build.LibExeObjStep = null,
+ include: ?[]const u8 = null,
+ };
+};
+
+pub fn link(
+ b: *std.build.Builder,
+ step: *std.build.LibExeObjStep,
+ opt: Options,
+) !*std.build.LibExeObjStep {
+ const lib = try buildLib(b, step, opt);
+ step.linkLibrary(lib);
+ step.addIncludePath(include_path);
+ return lib;
+}
+
+pub fn buildLib(
+ b: *std.build.Builder,
+ step: *std.build.LibExeObjStep,
+ opt: Options,
+) !*std.build.LibExeObjStep {
+ const target = step.target;
+ const lib = b.addStaticLibrary("libpng", null);
+ lib.setTarget(step.target);
+ lib.setBuildMode(step.build_mode);
+
+ // Include
+ lib.addIncludePath(include_path);
+ lib.addIncludePath(include_path_pnglibconf);
+
+ // Link
+ lib.linkLibC();
+ if (target.isLinux()) {
+ lib.linkSystemLibrary("m");
+ }
+
+ if (opt.zlib.step) |zlib|
+ lib.linkLibrary(zlib)
+ else
+ lib.linkSystemLibrary("z");
+
+ if (opt.zlib.include) |dir|
+ lib.addIncludePath(dir);
+
+ // Compile
+ var flags = std.ArrayList([]const u8).init(b.allocator);
+ defer flags.deinit();
+
+ try flags.appendSlice(&.{
+ "-DPNG_ARM_NEON_OPT=0",
+ "-DPNG_POWERPC_VSX_OPT=0",
+ "-DPNG_INTEL_SSE_OPT=0",
+ "-DPNG_MIPS_MSA_OPT=0",
+ });
+
+ // C files
+ lib.addCSourceFiles(srcs, flags.items);
+
+ return lib;
+}
+
+const srcs = &.{
+ root ++ "png.c",
+ root ++ "pngerror.c",
+ root ++ "pngget.c",
+ root ++ "pngmem.c",
+ root ++ "pngpread.c",
+ root ++ "pngread.c",
+ root ++ "pngrio.c",
+ root ++ "pngrtran.c",
+ root ++ "pngrutil.c",
+ root ++ "pngset.c",
+ root ++ "pngtrans.c",
+ root ++ "pngwio.c",
+ root ++ "pngwrite.c",
+ root ++ "pngwtran.c",
+ root ++ "pngwutil.c",
+};
diff --git a/pkg/libpng/pnglibconf.h b/pkg/libpng/pnglibconf.h
new file mode 100644
index 000000000..b39c38c71
--- /dev/null
+++ b/pkg/libpng/pnglibconf.h
@@ -0,0 +1,219 @@
+/* pnglibconf.h - library build configuration */
+
+/* libpng version 1.6.38.git */
+
+/* Copyright (c) 2018-2020 Cosmin Truta */
+/* Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson */
+
+/* This code is released under the libpng license. */
+/* For conditions of distribution and use, see the disclaimer */
+/* and license in png.h */
+
+/* pnglibconf.h */
+/* Machine generated file: DO NOT EDIT */
+/* Derived from: scripts/pnglibconf.dfa */
+#ifndef PNGLCONF_H
+#define PNGLCONF_H
+/* options */
+#define PNG_16BIT_SUPPORTED
+#define PNG_ALIGNED_MEMORY_SUPPORTED
+/*#undef PNG_ARM_NEON_API_SUPPORTED*/
+/*#undef PNG_ARM_NEON_CHECK_SUPPORTED*/
+#define PNG_BENIGN_ERRORS_SUPPORTED
+#define PNG_BENIGN_READ_ERRORS_SUPPORTED
+/*#undef PNG_BENIGN_WRITE_ERRORS_SUPPORTED*/
+#define PNG_BUILD_GRAYSCALE_PALETTE_SUPPORTED
+#define PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED
+#define PNG_COLORSPACE_SUPPORTED
+#define PNG_CONSOLE_IO_SUPPORTED
+#define PNG_CONVERT_tIME_SUPPORTED
+#define PNG_EASY_ACCESS_SUPPORTED
+/*#undef PNG_ERROR_NUMBERS_SUPPORTED*/
+#define PNG_ERROR_TEXT_SUPPORTED
+#define PNG_FIXED_POINT_SUPPORTED
+#define PNG_FLOATING_ARITHMETIC_SUPPORTED
+#define PNG_FLOATING_POINT_SUPPORTED
+#define PNG_FORMAT_AFIRST_SUPPORTED
+#define PNG_FORMAT_BGR_SUPPORTED
+#define PNG_GAMMA_SUPPORTED
+#define PNG_GET_PALETTE_MAX_SUPPORTED
+#define PNG_HANDLE_AS_UNKNOWN_SUPPORTED
+#define PNG_INCH_CONVERSIONS_SUPPORTED
+#define PNG_INFO_IMAGE_SUPPORTED
+#define PNG_IO_STATE_SUPPORTED
+#define PNG_MNG_FEATURES_SUPPORTED
+#define PNG_POINTER_INDEXING_SUPPORTED
+/*#undef PNG_POWERPC_VSX_API_SUPPORTED*/
+/*#undef PNG_POWERPC_VSX_CHECK_SUPPORTED*/
+#define PNG_PROGRESSIVE_READ_SUPPORTED
+#define PNG_READ_16BIT_SUPPORTED
+#define PNG_READ_ALPHA_MODE_SUPPORTED
+#define PNG_READ_ANCILLARY_CHUNKS_SUPPORTED
+#define PNG_READ_BACKGROUND_SUPPORTED
+#define PNG_READ_BGR_SUPPORTED
+#define PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED
+#define PNG_READ_COMPOSITE_NODIV_SUPPORTED
+#define PNG_READ_COMPRESSED_TEXT_SUPPORTED
+#define PNG_READ_EXPAND_16_SUPPORTED
+#define PNG_READ_EXPAND_SUPPORTED
+#define PNG_READ_FILLER_SUPPORTED
+#define PNG_READ_GAMMA_SUPPORTED
+#define PNG_READ_GET_PALETTE_MAX_SUPPORTED
+#define PNG_READ_GRAY_TO_RGB_SUPPORTED
+#define PNG_READ_INTERLACING_SUPPORTED
+#define PNG_READ_INT_FUNCTIONS_SUPPORTED
+#define PNG_READ_INVERT_ALPHA_SUPPORTED
+#define PNG_READ_INVERT_SUPPORTED
+#define PNG_READ_OPT_PLTE_SUPPORTED
+#define PNG_READ_PACKSWAP_SUPPORTED
+#define PNG_READ_PACK_SUPPORTED
+#define PNG_READ_QUANTIZE_SUPPORTED
+#define PNG_READ_RGB_TO_GRAY_SUPPORTED
+#define PNG_READ_SCALE_16_TO_8_SUPPORTED
+#define PNG_READ_SHIFT_SUPPORTED
+#define PNG_READ_STRIP_16_TO_8_SUPPORTED
+#define PNG_READ_STRIP_ALPHA_SUPPORTED
+#define PNG_READ_SUPPORTED
+#define PNG_READ_SWAP_ALPHA_SUPPORTED
+#define PNG_READ_SWAP_SUPPORTED
+#define PNG_READ_TEXT_SUPPORTED
+#define PNG_READ_TRANSFORMS_SUPPORTED
+#define PNG_READ_UNKNOWN_CHUNKS_SUPPORTED
+#define PNG_READ_USER_CHUNKS_SUPPORTED
+#define PNG_READ_USER_TRANSFORM_SUPPORTED
+#define PNG_READ_bKGD_SUPPORTED
+#define PNG_READ_cHRM_SUPPORTED
+#define PNG_READ_eXIf_SUPPORTED
+#define PNG_READ_gAMA_SUPPORTED
+#define PNG_READ_hIST_SUPPORTED
+#define PNG_READ_iCCP_SUPPORTED
+#define PNG_READ_iTXt_SUPPORTED
+#define PNG_READ_oFFs_SUPPORTED
+#define PNG_READ_pCAL_SUPPORTED
+#define PNG_READ_pHYs_SUPPORTED
+#define PNG_READ_sBIT_SUPPORTED
+#define PNG_READ_sCAL_SUPPORTED
+#define PNG_READ_sPLT_SUPPORTED
+#define PNG_READ_sRGB_SUPPORTED
+#define PNG_READ_tEXt_SUPPORTED
+#define PNG_READ_tIME_SUPPORTED
+#define PNG_READ_tRNS_SUPPORTED
+#define PNG_READ_zTXt_SUPPORTED
+#define PNG_SAVE_INT_32_SUPPORTED
+#define PNG_SAVE_UNKNOWN_CHUNKS_SUPPORTED
+#define PNG_SEQUENTIAL_READ_SUPPORTED
+#define PNG_SETJMP_SUPPORTED
+#define PNG_SET_OPTION_SUPPORTED
+#define PNG_SET_UNKNOWN_CHUNKS_SUPPORTED
+#define PNG_SET_USER_LIMITS_SUPPORTED
+#define PNG_SIMPLIFIED_READ_AFIRST_SUPPORTED
+#define PNG_SIMPLIFIED_READ_BGR_SUPPORTED
+#define PNG_SIMPLIFIED_READ_SUPPORTED
+#define PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED
+#define PNG_SIMPLIFIED_WRITE_BGR_SUPPORTED
+#define PNG_SIMPLIFIED_WRITE_STDIO_SUPPORTED
+#define PNG_SIMPLIFIED_WRITE_SUPPORTED
+#define PNG_STDIO_SUPPORTED
+#define PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED
+#define PNG_TEXT_SUPPORTED
+#define PNG_TIME_RFC1123_SUPPORTED
+#define PNG_UNKNOWN_CHUNKS_SUPPORTED
+#define PNG_USER_CHUNKS_SUPPORTED
+#define PNG_USER_LIMITS_SUPPORTED
+#define PNG_USER_MEM_SUPPORTED
+#define PNG_USER_TRANSFORM_INFO_SUPPORTED
+#define PNG_USER_TRANSFORM_PTR_SUPPORTED
+#define PNG_WARNINGS_SUPPORTED
+#define PNG_WRITE_16BIT_SUPPORTED
+#define PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED
+#define PNG_WRITE_BGR_SUPPORTED
+#define PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED
+#define PNG_WRITE_COMPRESSED_TEXT_SUPPORTED
+#define PNG_WRITE_CUSTOMIZE_COMPRESSION_SUPPORTED
+#define PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED
+#define PNG_WRITE_FILLER_SUPPORTED
+#define PNG_WRITE_FILTER_SUPPORTED
+#define PNG_WRITE_FLUSH_SUPPORTED
+#define PNG_WRITE_GET_PALETTE_MAX_SUPPORTED
+#define PNG_WRITE_INTERLACING_SUPPORTED
+#define PNG_WRITE_INT_FUNCTIONS_SUPPORTED
+#define PNG_WRITE_INVERT_ALPHA_SUPPORTED
+#define PNG_WRITE_INVERT_SUPPORTED
+#define PNG_WRITE_OPTIMIZE_CMF_SUPPORTED
+#define PNG_WRITE_PACKSWAP_SUPPORTED
+#define PNG_WRITE_PACK_SUPPORTED
+#define PNG_WRITE_SHIFT_SUPPORTED
+#define PNG_WRITE_SUPPORTED
+#define PNG_WRITE_SWAP_ALPHA_SUPPORTED
+#define PNG_WRITE_SWAP_SUPPORTED
+#define PNG_WRITE_TEXT_SUPPORTED
+#define PNG_WRITE_TRANSFORMS_SUPPORTED
+#define PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED
+#define PNG_WRITE_USER_TRANSFORM_SUPPORTED
+#define PNG_WRITE_WEIGHTED_FILTER_SUPPORTED
+#define PNG_WRITE_bKGD_SUPPORTED
+#define PNG_WRITE_cHRM_SUPPORTED
+#define PNG_WRITE_eXIf_SUPPORTED
+#define PNG_WRITE_gAMA_SUPPORTED
+#define PNG_WRITE_hIST_SUPPORTED
+#define PNG_WRITE_iCCP_SUPPORTED
+#define PNG_WRITE_iTXt_SUPPORTED
+#define PNG_WRITE_oFFs_SUPPORTED
+#define PNG_WRITE_pCAL_SUPPORTED
+#define PNG_WRITE_pHYs_SUPPORTED
+#define PNG_WRITE_sBIT_SUPPORTED
+#define PNG_WRITE_sCAL_SUPPORTED
+#define PNG_WRITE_sPLT_SUPPORTED
+#define PNG_WRITE_sRGB_SUPPORTED
+#define PNG_WRITE_tEXt_SUPPORTED
+#define PNG_WRITE_tIME_SUPPORTED
+#define PNG_WRITE_tRNS_SUPPORTED
+#define PNG_WRITE_zTXt_SUPPORTED
+#define PNG_bKGD_SUPPORTED
+#define PNG_cHRM_SUPPORTED
+#define PNG_eXIf_SUPPORTED
+#define PNG_gAMA_SUPPORTED
+#define PNG_hIST_SUPPORTED
+#define PNG_iCCP_SUPPORTED
+#define PNG_iTXt_SUPPORTED
+#define PNG_oFFs_SUPPORTED
+#define PNG_pCAL_SUPPORTED
+#define PNG_pHYs_SUPPORTED
+#define PNG_sBIT_SUPPORTED
+#define PNG_sCAL_SUPPORTED
+#define PNG_sPLT_SUPPORTED
+#define PNG_sRGB_SUPPORTED
+#define PNG_tEXt_SUPPORTED
+#define PNG_tIME_SUPPORTED
+#define PNG_tRNS_SUPPORTED
+#define PNG_zTXt_SUPPORTED
+/* end of options */
+/* settings */
+#define PNG_API_RULE 0
+#define PNG_DEFAULT_READ_MACROS 1
+#define PNG_GAMMA_THRESHOLD_FIXED 5000
+#define PNG_IDAT_READ_SIZE PNG_ZBUF_SIZE
+#define PNG_INFLATE_BUF_SIZE 1024
+#define PNG_LINKAGE_API extern
+#define PNG_LINKAGE_CALLBACK extern
+#define PNG_LINKAGE_DATA extern
+#define PNG_LINKAGE_FUNCTION extern
+#define PNG_MAX_GAMMA_8 11
+#define PNG_QUANTIZE_BLUE_BITS 5
+#define PNG_QUANTIZE_GREEN_BITS 5
+#define PNG_QUANTIZE_RED_BITS 5
+#define PNG_TEXT_Z_DEFAULT_COMPRESSION (-1)
+#define PNG_TEXT_Z_DEFAULT_STRATEGY 0
+#define PNG_USER_CHUNK_CACHE_MAX 1000
+#define PNG_USER_CHUNK_MALLOC_MAX 8000000
+#define PNG_USER_HEIGHT_MAX 1000000
+#define PNG_USER_WIDTH_MAX 1000000
+#define PNG_ZBUF_SIZE 8192
+#define PNG_ZLIB_VERNUM 0 /* unknown */
+#define PNG_Z_DEFAULT_COMPRESSION (-1)
+#define PNG_Z_DEFAULT_NOFILTER_STRATEGY 0
+#define PNG_Z_DEFAULT_STRATEGY 1
+#define PNG_sCAL_PRECISION 5
+#define PNG_sRGB_PROFILE_CHECKS 2
+/* end of settings */
+#endif /* PNGLCONF_H */
diff --git a/pkg/zlib/build.zig b/pkg/zlib/build.zig
index bc41daa00..17a5c86e1 100644
--- a/pkg/zlib/build.zig
+++ b/pkg/zlib/build.zig
@@ -2,7 +2,7 @@ const std = @import("std");
/// Directories with our includes.
const root = thisDir() ++ "../../../vendor/zlib/";
-const include_path = root;
+pub const include_path = root;
pub const pkg = std.build.Pkg{
.name = "zlib",
diff --git a/vendor/libpng b/vendor/libpng
new file mode 160000
+Subproject a37d4836519517bdce6cb9d956092321eca3e73