LINUX.ORG.RU

Makefile, автоматическая подстановка .o/.c


0

1

Как автоматически скомпилировать по шаблону?
1.c -> 1.o -> 1
2.c -> 2.o -> 2
...
n.c -> n.o -> n

У меня получалось что-то типа:

NAME = test
OPTS = -O3 -std=c99 -I..
SRCS = $(wildcard *.c)
OBJS = $(subst ,,$(SRCS:.c=.o))
BINS = $(subst ,,$(SRCS:.c=))

tests: $(BINS)

$(BINS): $(OBJS)
gcc -o $@ $< ../sbt.o

$(OBJS): $(SRCS)
gcc ${OPTS} -c -o $@ $<
clean:
rm -f $(OBJS)

В документации http://www.linuxlib.ru/prog/make_379_manual.html я не смог разобраться.

★★★★★

%.o : %.c
    ...

% : %.o
   ...
AIv ★★★★★
()
Ответ на: комментарий от DeVliegendeHollander

список действий

а в «списке действий» - обрезать суффиксы у имён, и делать компиляцию (cc) + сборку (ld)?

pacify ★★★★★
() автор топика
Ответ на: комментарий от pacify

Можно сразу компилять в исполняемые, не обязательно через объектные.

Но если через объектные, то:

.c.o:
        gcc -c $<

.o.out:
       gcc $< -o $@

Здесь $< - имя.расширение1, а $@ - имя.расширение2

Вроде бы так...

PS: Давно я makefile'ы с нуля не писал, всё на готовеньких... :)

DeVliegendeHollander ★★
()
Ответ на: комментарий от DeVliegendeHollander

Спасибо. У меня в итоге так получилось:

NAME = test
OPTS = -O3 -std=c99 -I..
SRCS = $(wildcard *.c)
OBJS = $(subst ,,$(SRCS:.c=.o))

all:            $(OBJS)

%.o:            %.c
                gcc -c $(OPTS) $<
                gcc -o $* $*.o ../sbt.o

clean:
                rm -f $(BINS)
                rm -f $(OBJS)

pacify ★★★★★
() автор топика

Много лет назад пользовал следующее, под разными системами, меняя лишь название проекта от проекта к проекту (одну переменную BIN), включая под эклипсом. Файлы можно добавлять динамически, зависимости определяются автоматически, считаю очень удобным:

SHELL=/bin/sh
BIN=your_program_name
ARCH := `uname`
NOCYGWIN=

ifeq ($(ARCH), CYGWIN32/95)
	NOCYGWIN= -mno-cygwin
endif
ifeq ($(ARCH), CYGWIN32/NT)
	NOCYGWIN= -mno-cygwin
endif

#consider all *.c as sources  
SOURCES.c := $(wildcard *.c)

CFLAGS= $(NOCYGWIN) -ansi -W -Wall
CPPFLAGS=
CC=gcc
SLIBS=
INCLUDES=
OBJS=$(SOURCES.c:.c=.o)
LINK=gcc $(CFLAGS)
LFLAGS=-lm $()

debug : CFLAGS = $(NOCYGWIN) -ansi -W -Wall -g -Wundef
pedantic : CFLAGS = $(NOCYGWIN) -ansi -W -Wall -g -Wundef -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations
release : CFLAGS = $(NOCYGWIN) -ansi -W -Wall -O2
ut : CFLAGS = $(NOCYGWIN) -ansi -g -DUNIT_TEST -DБЛА_БЛА_TEST

.SUFFIXES:
.SUFFIXES: .d .o .h .c
.c.o: ; $(CC) $(INCLUDES) $(CFLAGS) -MMD -c $*.c 

.PHONY: clean

%.d: %.c
	@set -e; rm -f $@; \
	$(CC) -M $(CFLAGS) $< > $@.$$$$; \
	sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
	rm -f $@.$$$$

all release debug pedantic ut: $(BIN)

$(BIN): $(OBJS)
	$(LINK) $(FLAGS) -o $(BIN) $(OBJS) $(LFLAGS)

clean:
	-rm -f $(BIN) $(OBJS) *.d

include $(sources:.c=.d)

siberean
()
Ответ на: комментарий от Jetty

А может, ТСу портабельность и не нужна? Есть же люди, которые только под Линукс пишут. :) Но если серьёзно, то я wildcard тоже как-то...не люблю.

DeVliegendeHollander ★★
()
Ответ на: комментарий от DeVliegendeHollander

особенно весело когда делаешь cp source_file.c source_file_old.c и забываешь :)

Jetty ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.