Как мне написать «выборочный» Makefile? - PullRequest
0 голосов
/ 07 октября 2018

вопрос noob здесь.

У меня есть каталог с большим количеством .c файлов, это в основном функции libc, которые я сам кодирую как упражнение.

Я пишу немного основного() в этих файлах для проверки функций, и я хочу написать Makefile, который позволит мне скомпилировать только файл, который я хочу проверить, например:

make memset.c

И получить только исполняемый коднаписал в memset.c.

Я пытался сделать что-то вроде этого:

CC = gcc
CFLAGS = -Wall -Wextra -pedantic

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

Но, очевидно, это не работает.Я не знаю, что поставить вместо «всего».Я знаю, что это очень просто, но мне не удалось это сделать, и я провел исследование, но не нашел ответа на этот конкретный вопрос.

Заранее спасибо за вашу помощь.

Ответы [ 4 ]

0 голосов
/ 18 января 2019

У вас уже есть выборочная компиляция исполняемого файла:

CC = gcc
CFLAGS = -Wall -Wextra -pedantic

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

Тогда вам просто нужно вызвать make с нужной вам целью, исполняемый файл:

make select

Если выиметь несколько наборов исполняемых файлов с разными флагами, вы можете использовать:

EX0 = drink clean
${EXE0}: % : %.o
        $(CC) $(LDLAGS) -lwater $< -o $@
EX1 = burn melt
{EX1}: % : %.o
        $(CC) $(LDLAGS) -lfire  $< -o $@
0 голосов
/ 07 октября 2018

С помощью wildcard вы можете достичь желаемого.

Обратите внимание, что если каждая программа зависит только от одного .c файла, вам не нужны правила %.o:

CC = gcc
CFLAGS = -Wall -Wextra -pedantic

SRC  := $(wildcard *.c)
EXEC = $(SRC:%.c=%)

all: $(EXEC)

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

И просто вызовите этот способ, например:

make memset
0 голосов
/ 07 октября 2018

Вы можете определить статические шаблонные правила для построения объектных файлов и исполняемых файлов, а затем вызвать make с именем исполняемого файла, который вы хотите использовать в качестве цели:

CC     = gcc
CFLAGS = -Wall -Wextra -pedantic

SRC := $(wildcard *.c)
OBJ := $(patsubst %.c,%.o,$(SRC))
EXE := $(patsubst %.c,%,$(SRC))

.PHONY: all obj

all: $(EXE)

obj: $(OBJ)

$(EXE): %: %.o
    $(CC) $(LDFLAGS) $< -o $@

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

.PHONY: clean

clean:
    rm -f $(OBJ) $(EXE)

Тогда:

$ make memset.o

строит только memset.o,

$ make memset

строит только memsetmemset.o при необходимости),

$ make obj

строит все объектыфайлы

$ make # or make all

создает все исполняемые файлы (и объектные файлы при необходимости), а

$ make clean

удаляет все исполняемые файлы и объектные файлы.

0 голосов
/ 07 октября 2018

Если вы выполните make -n -p, вы получите дамп всех встроенных правил в make.В GNU Make 4.1 это включает в себя:

%: %.o
#  recipe to execute (built-in):
        $(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@

Так что вам может понадобиться % в вашем make-файле, где у вас сейчас есть all.

Вы также можете обнаружить, что вы неВам не нужны те правила, которые уже встроены. Предположим, у вас есть три файла C, каждый с main(), как вы указали: abs.c, div.c и fmax.c.Ваш Makefile должен содержать не более двух строк:

CFLAGS = -Wall -Wextra -pedantic
all: abs div fmax

, что позволит вам сделать make abs, чтобы сделать abs исполняемым, и make all, чтобы сделать их все.

...