Объедините несколько источников в несколько целей в каталоге

близкие. Я изучаю GNU-Make, и у меня следующая структура проекта:

~/projects
    /sysCalls
        ex1.c
        ex2.c
        ex3.c
        ex4.c
        ex5.c
        ex6.c
        ex7.c

Каждый .c источник очень прост, имеет свою собственную main функцию и должен быть встроен в соответствующий двоичный файл (желательно названный в честь его источника). Но я хочу встроить в bin каталог (добавленный в мой .gitignore файл).

Мой текущий Makefile:

CC := gcc
CFLAGS := -Wall -g
SRC := $(wildcard *.c)
TARGET := $(SRC:.c=)

all: bin $(TARGET)
    mv $(TARGET) bin/

bin:
    mkdir bin

clean:
    rm -fr bin/

Он работает, как ожидалось, но всегда собирает все исходники. И мне не нравится переносить все на bin "вручную".

Есть какие-нибудь советы или идеи о том, как можно улучшить этот Makefile?


person Taschetto    schedule 19.08.2014    source источник


Ответы (2)


Благодаря ответу Этана Рейснера я нашел то, что я думаю, это решение.

CC := gcc
CFLAGS := -Wall -g
SRC := $(wildcard *.c)
TARGET := $(SRC:%.c=bin/%)

all: | bin $(TARGET)

bin/% : %.c
    $(CC) $(CFLAGS) $< -o $@

bin:
    mkdir bin

clean:
    rm -fr bin/

Ключевым моментом было использование правила bin/% : %.c.

person Taschetto    schedule 19.08.2014
comment
Только заказ на $(TARGET), вероятно, не то, что вы действительно хотите (хотя это может не иметь большого значения для такой цели, как all здесь). - person Etan Reisner; 20.08.2014
comment
В вашем правиле bin/% также отсутствует пробел между $< и -o. При этом вы могли бы вообще избежать необходимости в этом правиле, используя вместо него vpath. - person Etan Reisner; 20.08.2014

Замените строку TARGET на

TARGET := $(addprefix bin/,$(SRC:.c=))

и добавить (с соответствующим правилом компиляции / связывания)

bin/%: %.c

И make по-прежнему будет создавать любые устаревшие двоичные файлы, а make bin/ex1 будет создавать только этот единственный двоичный файл непосредственно в каталоге bin.

Порядок операций с целью all не является надежным перед аргументом -j.

Для GNU make это то, для чего нужны order-only prerequisites.

person Etan Reisner    schedule 19.08.2014
comment
Спасибо! Ваш ответ направил меня в правильном направлении. Но добавление / bin к TARGET сработало только для первого элемента. Мне пришлось использовать функцию $ (addprefix ...). - person Taschetto; 19.08.2014
comment
$(addprefix bin/,$(SRC:.c=)) можно заменить на $(SRC:%.c=bin/%). - person Chnossos; 20.08.2014