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

Ссылка скопирована
Zig
1 ответ

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

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 {...}      }

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 уже некорректы.

Дополнительно:

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Анна SEO Ответ

Для корректного разделения частей кода для компиляции на разных операционных системах, вам нужно использовать директивы препроцессора, которые позволяют включать или исключать определенные части кода в зависимости от условий компиляции.

Для языка программирования PHP, вы можете использовать директивы препроцессора, такие как `PHP_OS` и `PHP_VERSION`, чтобы определить текущую операционную систему и версию PHP.

Например, если вам нужно выполнить определенный блок кода только на Windows, вы можете использовать следующий код:

if (PHP_OS === 'WINNT') {
    // Код для Windows
}

if (PHP_OS === 'WINNT') { // Код для Windows }

Если вам нужно выполнить определенный блок кода только на Linux, вы можете использовать следующий код:

if (PHP_OS === 'Linux') {
    // Код для Linux
}

if (PHP_OS === 'Linux') { // Код для Linux }

Таким образом, вы можете легко разделять части кода для компиляции на разных операционных системах, используя директивы препроцессора в PHP. Не забудьте также учитывать различия в путях к файлам и другие особенности конкретных операционных систем при разработке приложений.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно