Здравствуйте. Задался вопросом о том как кастомизировать компиляцию кода относительно заданных свойств. К примеру относительно ос для которой идет сборка. Сам нашел два способа, но оба способа так себе выглядят:
1. Вынести код под отдельную ос в файл\файлы и подгружать их как модуль.
if (builtin.os.tag == .linux) {
exe.root_module.addAnonymousImport("window_api", .{
.root_source_file = .{ .path = "src/windowX11.zig" },
});
} else {
exe.root_module.addAnonymousImport("window_api", .{
.root_source_file = .{ .path = "src/windowNT.zig" },
});
}
затем добавляем модуль в рабочий файл к примеру main.zig
const w = @import("window_api");
Всё работает отлично, но если есть тип который необходимо использовать во всех трех файлах (main.zig, windowNT.zig, windowX11.zig) и он находится в стороннем файле (types.zig), то подключить и к "root" части программы и к модулю одновременно его нельзя.
2. Просто с помошью
if и
builtin.os.tag создавать ветвление кода.
К примеру в самом main.zig
const c = @cImport({
if (builtin.os.tag == .linux) {
@cInclude("X11/Xlib.h");
}
if (builtin.os.tag == .windows) {
@cInclude("windows.h");
@cInclude("windowsx.h");
}
});
fn Window() type {
if (builtin.os.tag == .linux) {
return struct {...}
}
if (builtin.os.tag == .windows) {
return struct {...}
}
Тоже работает, но выглядит не очень чисто, плюс
zls пока не корректно работает с
builtin
Соответственно вопрос, возможно ли просто подключать файлы (без создания отдельного модуля), для выбора компиляции или есть иные свойства
build.zig. Просто документация по build.zig достаточно скудная, а старые примеры из версий 0.6 - 0.8 уже некорректы.