Как реплицировать подстановочный знак Makefile и patsubst в Justfile?

При компиляции кода C вам необходимо преобразовать каждый .c в .o. К сожалению, у gcc нет такой возможности. Поэтому вам нужно использовать файл make, который это делает.

Код ниже представляет собой простой пример использования для этого функций Makefile wildcard и patsubst.

Подстановочный знак прост, он просто подстановочный (src/*.c). Для меня patsubst — самая сложная часть. Он заменяет каждую строку, полученную из подстановочного знака, так, чтобы она выглядела ('obj/*.o').

После этого он запускается gcc для каждой полученной отдельной строки. Я просматривал документацию justhttps://just.systems/man/en/chapter_1.html, но не смог заставить ее работать.

# Define source directory
SRC_DIR := src

# Define object directory
OBJ_DIR := obj

# Define source files using wildcard function
SRC_FILES := $(wildcard $(SRC_DIR)/*.c)

# Define object files using patsubst function
OBJ_FILES := $(patsubst $(SRC_DIR)/%.c,$(OBJ_DIR)/%.o,$(SRC_FILES))

# Compiler
CC := gcc

# Compiler flags
CFLAGS := -Wall -Wextra -Iinclude

# Target executable
TARGET := my_program

# Default rule to build the executable
$(TARGET): $(OBJ_FILES)
    $(CC) $^ -o $@

# Rule to compile source files into object files
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
    $(CC) $(CFLAGS) -c $< -o $@

# Clean rule
clean:
    rm -f $(OBJ_DIR)/*.o $(TARGET)

Согласно документации, «just — это средство выполнения команд, а не система сборки». Его синтаксис вдохновлен make, но если вашей целью является создание программного обеспечения, то make предназначен для этого, а just явно не предназначен.

John Bollinger 07.04.2024 18:48

@gulpr, хорошо... Есть ли однострочник, который может это сделать? Это не работает: gcc -c src/*.c -o obj/

Al-Baraa El-Hag 07.04.2024 19:14

Вывод неверный.

gulpr 07.04.2024 19:22

@gulpr. О каком выводе вы говорите?

Al-Baraa El-Hag 07.04.2024 19:30

@Al-BaraaEl-Hag, меня это предложение также раздражает, не говоря уже о том, что его легко понять неправильно. Я чуть не вырезал это, потому что это все равно неуместно. Вопрос не в том, насколько «умен» gcc или любой другой компилятор. Gcc не нуждается в такой функции, поскольку ей не обязательно работать в вакууме. Действительно, подумайте, зачем вам вообще нужна такая функция. Вы можете создать несколько исходных файлов непосредственно в исполняемый файл. Основная причина не делать этого — использовать make для уменьшения ненужной перекомпиляции.

John Bollinger 07.04.2024 19:31

@ Джон Боллинджер. Я отредактировал эту часть. И да, это имеет смысл.

Al-Baraa El-Hag 07.04.2024 19:32

Вы используете Make или Just? Если просто, то почему?

HolyBlackCat 07.04.2024 19:36

@HolyBlackCat Сейчас я использую Make. Но я хотел посмотреть, стоит ли мне переходить в Just. На их странице на github написано: «just имеет массу полезных функций и множество улучшений по сравнению с make». Я предполагаю, что это означало, что он может делать все, что делает Make, и даже больше.

Al-Baraa El-Hag 07.04.2024 19:39

Честно говоря, это не кажется хорошей идеей. Я никогда об этом не слышал. Написание make-файлов вручную — это одно (в наши дни это кажется непопулярным, но я все еще считаю это жизнеспособным), но вместо этого выучить какой-то непонятный диалект? Это явно говорит о том, что это не система сборки? Если вам не нравится Make, я бы изучил что-нибудь популярное, например CMake или Meson.

HolyBlackCat 07.04.2024 19:53

@HolyBlackCat просматриваю документацию, мне нравится Meson. Вместо этого я начну использовать это, спасибо!

Al-Baraa El-Hag 07.04.2024 19:58

Как я уже отмечал, just не предназначен для создания программного обеспечения. make есть. Я уверен, что just действительно имеет некоторые значительные улучшения по сравнению с make в плане выполнения своего предназначения — быть командным бегуном. Он также позволяет избежать (опять же, согласно документации) многих функций. Переезд с make на make мне кажется нецелесообразным. Это все равно, что обменять мой фронтальный погрузчик на отличный новый эвакуатор, панель управления которого напоминает фронтальный погрузчик. Без сомнения, это превосходный эвакуатор, но он не подходит для работ, которые выполняет фронтальный погрузчик.

John Bollinger 07.04.2024 20:00

@Al-BaraaEl-Hag Я бы посоветовал Cmake

gulpr 07.04.2024 20:06

Я не уверен, почему вы вообще чувствуете необходимость двигаться, если у вас уже есть работающая система сборки, но в этом случае Meson действительно кажется лучшей альтернативой, чем just. Есть и другие. У всех есть свои сильные и слабые стороны.

John Bollinger 07.04.2024 20:07
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
13
110
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не создал полный make-файл, но вот код для подстановочного знака и patsubst:

# Define source directory
SRC_DIR := 'src'

# Define object directory
OBJ_DIR := 'obj'

# Define source files using wildcard
SRC_FILES := `echo src/*.c`

# Define object files
OBJ_FILES := replace_regex(SRC_FILES, SRC_DIR / '([^/]+)\.c(\s|$)', OBJ_DIR / '${1}.o$2')    

run:
    @echo {{SRC_FILES}}
    @echo {{OBJ_FILES}}

Другие вопросы по теме