Swift вместо make
2025-09-23 23:07Оказывается, можно использовать утилиту swift вместо make или cmake для чисто C/C++ проектов. Хоть на маке, хоть на Линуксе. Вот пример.
Создадим папку src и в ней файл main.cpp. Положим туда классический пример Hello World.
Создадим папку src и в ней файл main.cpp. Положим туда классический пример Hello World.
Сделаем скрипт сборки для swift.$ mkdir src
$ cat > src/hello.cpp
#include <iostream>
int main()
{
std::cout << "hello world!\n";
}
^D
Компилируем и запускаем.$ 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 на Линуксе ставится командами:$ swift run
Building for debugging...
[3/3] Linking hello
Build of product 'hello' complete! (0.49s)
hello world!
После этого в файле ~/.bashrc устанавливаем алиас: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
Проверяем: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

no subject
Date: 2025-09-24 18:39 (UTC)no subject
Date: 2025-09-24 19:55 (UTC)no subject
Date: 2025-09-24 20:19 (UTC)no subject
Date: 2025-09-25 00:18 (UTC)no subject
Date: 2025-09-25 13:06 (UTC)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"
no subject
Date: 2025-09-25 19:25 (UTC)Приветствую на Дриме, by the way. Присоединяйся, здесь клёво.
no subject
Date: 2025-09-26 06:12 (UTC)Ну и чтоб уж точно два раза не вставать, поделюсь, что если make используется часто как запускалка сценариев, без темы графа зависимостей, я практически все проекты перевел на just. Там базовый подход как у make, но много приятных плюшек.
https://just.systems/
no subject
Date: 2025-09-26 06:41 (UTC)Мне в этом смысле симпатичен waf. Всё делается на Питоне. Вот пример скрипта: https://github.com/sergev/sdwriter/blob/master/wscript
Прикол ещё и в том, что для сборки через waf не надо устанавливать никакого дополнительного софта. Сам файл waf добавляешь в корень своего проекта, и прямо там запускаешь. Занимает всего 100 килобайт - хорошо утоптанный переносимый питоновский скрипт.