hitakiri
@hitakiri

Как корректно разделить части кода для компиляции на разных ОС?

Здравствуйте. Задался вопросом о том как кастомизировать компиляцию кода относительно заданных свойств. К примеру относительно ос для которой идет сборка. Сам нашел два способа, но оба способа так себе выглядят:
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 уже некорректы.
  • Вопрос задан
  • 33 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы