vak: (Daemon)
[personal profile] vak
Оказывается, можно использовать утилиту swift вместо make или cmake для чисто C/C++ проектов. Хоть на маке, хоть на Линуксе. Вот пример.

Создадим папку src и в ней файл main.cpp. Положим туда классический пример Hello World.
$ mkdir src
$ cat > src/hello.cpp
#include <iostream>

int main()
{
std::cout << "hello world!\n";
}
^D
Сделаем скрипт сборки для swift.
$ cat > Package.swift
// swift-tools-version: 6.2
import PackageDescription

let package = Package(
name: "Hello",
products: [
.executable(
name: "hello",
targets: ["Hello"],
),
],
targets: [
.executableTarget(
name: "Hello",
path: "src",
),
],
)
^D
Компилируем и запускаем.
$ swift run
Building for debugging...
[3/3] Linking hello
Build of product 'hello' complete! (0.49s)
hello world!
Напомню, что компилятор Swift на Линуксе ставится командами:
wget https://download.swift.org/swift-6.2-release/ubuntu2404/swift-6.2-RELEASE/swift-6.2-RELEASE-ubuntu24.04.tar.gz
tar xf swift-6.2-RELEASE-ubuntu24.04.tar.gz -C /opt
После этого в файле ~/.bashrc устанавливаем алиас:
alias swift='/opt/swift-6.2-RELEASE-ubuntu24.04/usr/bin/swift'
Проверяем:
$ swift --version
Swift version 6.2 (swift-6.2-RELEASE)
Target: x86_64-unknown-linux-gnu

Date: 2025-09-24 18:39 (UTC)
From: [personal profile] begoon
Zig имеет похожий декларативный файл build.zig для оркестарции билдов.

Date: 2025-09-24 20:19 (UTC)
fenikso: (Default)
From: [personal profile] fenikso
Zig действительно интересный

Date: 2025-09-25 00:18 (UTC)
ircicq: (Default)
From: [personal profile] ircicq
C# с компиляцией в нативный код.

Date: 2025-09-25 13:06 (UTC)
From: [personal profile] begoon
ваш пример можно скомпились вот таким build.zig (zig 0.15+)

const std = @import("std");

pub fn build(b: *std.Build) void {
    const target = b.standardTargetOptions(.{});
    const optimize = b.standardOptimizeOption(.{});

    // Root module for a pure C/C++ program
    const mod = b.createModule(.{
        .target = target,
        .optimize = optimize,
    });

    // Add your C++ source (add flags like "-std=c++20" if desired)
    mod.addCSourceFile(.{
        .file = b.path("src/hello.cpp"),
        .flags = &.{}, // e.g. &.{"-std=c++17"}
    });

    const exe = b.addExecutable(.{
        .name = "hello",
        .root_module = mod,
    });

    exe.linkLibC();
    exe.linkLibCpp();

    b.installArtifact(exe);

    const run_cmd = b.addRunArtifact(exe);
    if (b.args) |args| run_cmd.addArgs(args);
    b.step("run", "Run the executable").dependOn(&run_cmd.step);
}


далее "zig build run"

Date: 2025-09-26 06:12 (UTC)
From: [personal profile] begoon
Согласен. На простом примере в zig надо писать больше, но при усложнении проекта, когда надо компилировать разные наборы файлов в зависимости от чего-то, генерировать какие асеты налету и пр., сложность быстро нивелируется.

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

https://just.systems/