LINUX.ORG.RU

составной make

 


0

2

Помогите для сборки целей module*.o использовать правила, хранящиеся в каталоге module.

├── module
│   ├── Makefile
│   ├── module1.cpp
│   ├── module1.h
│   ├── module1.o
│   ├── module2.cpp
│   ├── module2.h
│   └── module2.o
├── prog
│   ├── main.cpp
│   ├── main.o
│   ├── Makefile
│   └── prog1

$ cat ./prog/Makefile 
CXX=c++

TARGETS=prog1 

PROG=./main.cpp 
MOD=../module/module1.cpp

.PHONY: module clean

all: $(TARGETS)

module:
	$(MAKE) -C ../module CXX=$(CXX) 


PMOBJ=$(PROG:.cpp=.o) $(MOD:.cpp=.o)  
prog1: $(PMOBJ) $(MOD:.cpp:.h) module
	$(CXX) -o $@ $(PMOBJ)

clean:
	rm -f $(PROG:.cpp=.o) 
	rm -f $(MOD:.cpp=.o)


$ cat ./module/Makefile 
OBJS=module2.o module1.o

all: $(OBJS)

$(OBJS): %.o: %.cpp %.h
	$(CXX) --std=c++11 -c -o $@ $^

сейчас, на примере только module1.o, при вызове make из prog используются правила сборки module1.o по умолчанию. А нужно, чтобы файлы и module собирались по правилам ./module/Makefile:

$ make
c++    -c -o main.o main.cpp
c++    -c -o ../module/module1.o ../module/module1.cpp
make -C ../module CXX=c++ 
make[1]: Вход в каталог `/home/test/first/module'
make[1]: Цель `all' не требует выполнения команд.
make[1]: Выход из каталога `/home/test/first/module'
c++ -o prog1 ./main.o ../module/module1.o  

попробуй порядок поменять (и зачем здесь $(MOD:.cpp:.h) - ты же переносишь это в module/Makefile)


prog1: module $(PMOBJ)
	$(CXX) -o $@ $(PMOBJ)

sigurd ★★★★★
()
Последнее исправление: sigurd (всего исправлений: 1)
Ответ на: комментарий от sigurd

на реальном проекте возникла проблема:

в каталоге module создал много .o файлов, которые нужно будет слинковать с основной программой. Можно ли как-то эти файлы не перенабирать в командной строке а сделать что-то вроде:

prog: module1 module2 prog.o
	$(CXX) -o $@ prog.o `ls ../module1/*.o` `ls ../module2/*.o` 

hight-technology
() автор топика
Ответ на: комментарий от hight-technology

Список подкаталогов исходников полезно иметь отдельно


mod_dirs := ../mod1 ../mod2
mod_mask := $(addsuffix /*.c, $(mod_dirs))
mod_files := $(wildcard $(mod_mask))
#obj_files := $(notdir $(mod_files))
obj_files := $(obj_files:.c=.o)

clean:
@for d in $(mod_dirs); do \
    (echo $$d; cd $$d; rm -f *.d *.o *.c~ *.h~ *.cc~); \
done

sigurd ★★★★★
()
Последнее исправление: sigurd (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.