LINUX.ORG.RU

Трюк в Makefile


0

0

В Makefile объявлено:

SRCS = \
  src/1.c \
  src1/2.c \
  srcN/3.c

OBJS = $(addprefix ./objs/, $(notdir $(SRCS:.c=.o)))

В общем нужно их кучи разных исходников, расположенным по разным (не подводимым к единому шаблону) путям собрать объектники и положить их все в ./objs

Никак не соображу как это можно сделать не задавая много правил вида

./objs/1.o: src/1.c
  $(CC) $< -o $@

Так вообще можно?

Имена файлов не пересекаются, о переписывании объектников можно не беспокоиться.

★★★★

Вот пример:
src_dirs := . base diag prot stat print fltk net dspg

src_mask := $(addsuffix /*.cc, $(src_dirs))
src_files := $(wildcard $(src_mask))

obj_files := $(notdir $(src_files))
obj_files := $(obj_files:.cc=.o)
#obj_files := $(addprefix obj/, $(obj_files))

VPATH := $(src_dirs):obj
vpath %.o ./obj
vpath %.d ./obj

$(prog_name):   $(obj_files)
   @echo «Linking object files...»
   $(CC) $^ -o $@ $(mylibs) $(link_flags)

Компилятся и линкуются все файлы .сс из каталогов, указанных в src_dir

anonymous ()

толсто

Если просто положить, то вызови где-то там в Makefile:

find . -name «*.o» -exec mv {} ./objs ;

и радуйся.

anonymous ()
Ответ на: толсто от anonymous

Радоваться тому, что все объектники, даже и те, которые тут вообще не при делах, свалились в одну кучу?

Много Makefile-ов нельзя.

VPATH посмотрю.

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

А где в примере с VPATH собственно правила для объектников?

alexru ★★★★ ()

просто

PROG=superpuper
.PATH= /bla/bla:/another/bla/bla
SRCS= a.c b.c c.c
OBJS= ${SRCS:.c=.o}

${PROG}: ${OBJS}

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

Ты ж хочешь просто ;) Фильтры и пайпы никто не отменял

anonymous ()
Ответ на: комментарий от staseg

Ну покури сам раз такой умный. Да еще и дока старая как г. мамонта.

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

А я уже скурил, потому и советую. Дока может и старая, но написанные по ней Makefile-ы у меня до сих пор работают и легки в поддержке.

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

Встроенные в make правила не подхлдят нужна возможность вызвать свою команду.

Ну в общем если не получается просто, то будет как есть. Один фиг файлы генерятся автоматом.

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

Глобально и надежно

>Ну покури сам раз такой умный. Да еще и дока старая как г. мамонта.

cmake не?

anonymous ()
Ответ на: комментарий от staseg

А я уже скурил, потому и советую. Дока может и старая, но написанные по ней Makefile-ы у меня до сих пор работают и легки в поддержке.

Вопрос не в том как писать легко поддерживаемые фалы, а в том, как сделать как требуется.

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

Хитрый план «Помощь зала» результатов не дал.

anonymous ()

осьпади, если Makefile такой криво_извращенный, я боюсь представить шо там в исходниках.
не для ЖКХ пишем барин? нафортране?

system-root ★★★★ ()

Что-то типа

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

Вру, наверно, точно не помню, покурите всё-таки маны. Такое точно было.

Divius ★★ ()

на какие только извращения не пойдут только люди, чтобы не использовать cmake.

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

> на какие только извращения не пойдут только люди, чтобы не использовать обычный make.

obvious fix

trapezoid ()
TARGET = ...
SRCS = src/1.c src1/2.c srcN/3.c

OBJDIR = obj

OBJS = $(addprefix $(OBJDIR)/, $(notdir $(SRCS:.c=.o)))
VPATH=$(sort $(dir $(SRCS)))

$(TARGET): $(OBJS)
	...

$(OBJDIR)/%.o: %.c
	...
mannaz ()
Ответ на: комментарий от alexru

Cорри -долго не заглядывал - вот более полный пример
prog_name := kdk
DATE = `date +%y_%m_%d`

all: $(prog_name)

src_dirs := . base diag prot stat print fltk net dspg ping

CC := g++34
compile_flags := -g -O2 -Wall -funsigned-char -fno-exceptions
compile_flags += `fltk-config --cxxflags`
compile_flags += -Iini

link_flags := `fltk-config --ldflags`
mylibs := -lz -lsqlite3 ini/libiniparser.a /usr/lib/libptypes.a

src_mask := $(addsuffix /*.cc, $(src_dirs))
src_files := $(wildcard $(src_mask))

obj_files := $(notdir $(src_files))
obj_files := $(obj_files:.cc=.o)
link_files := $(addprefix obj/, $(obj_files))

VPATH := $(src_dirs):obj
vpath %.o ./obj
vpath %.d ./obj

$(prog_name):   ping/libping.a ini/libiniparser.a $(obj_files)
   @echo «=======================»
   @echo «Linking object files...»
   $(CC) $(link_files) -o $@ $(mylibs) $(link_flags)
   @echo «=======================»
   @cp $@ ..
   @cp $@ /kdk/$@-$(DATE)

compile_flags += $(addprefix -I, $(src_dirs))
err_log := Err-log

.cc.o:
   @echo «Compiling '$^'...»
   @$(CC) -c -pipe $(compile_flags) -o obj/$@ -MMD $< 2>&1 | tee -a $(err_log)

#ifeq (*.d,$(wildcard *.d))
include $(wildcard *.d)
#endif

clean:
   @echo «=======================»
   @echo «Removing object and backup files...»
   @for d in $(src_dirs); do \
    (echo $$d; cd $$d; rm -f *.d *.o *.c~ *.h~ *.cc~); \
   done
   @rm -f obj/*.d obj/*.o
   @rm -f $(err_log) $(prog_name)
   @echo «Done!»

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