Написание зависимостей в makefile, с makefile
Основываясь на некоторых вопросах SO и найденных ссылках, я пытаюсь создать make-файл, способный:
- найти, учитывая каталоги в
$(SRC)
,.cpp
файлы для компиляции; - скомпилировать
.cpp
, производя.o
объекты; - генерировать
.so
общие объекты от каждого.o
ранее скомпилированный.
То, что должен сделать файл make для достижения этой цели:
- найти, учитывая каталоги в
$(SRC)
,.cpp
файлы для компиляции; - построить список зависимостей для каждого
.cpp
с помощью-MM
флаг компилятора; - аннотировать / добавлять каждую зависимость, используя
$(eval ...)
; - оценить / решить каждую найденную зависимость, производя как
.o
а также.so
файлы.
Что у меня есть до сих пор: я смог сделать совсем все, кроме как заставить его работать ((Ошибка, которую я получаю, говорит о том, что, так или иначе, есть пустой ярлык) ''
как зависимость:
$ make make: * Нет правил для создания цели
', needed by
/home/rubens/bin/label.o. Стоп.
Итак, вот make-файл, который я пока не могу запустить:
# Directories
SRC := process init
BIN := $(HOME)/bin
LIB := watershed
LIBPATH := $(WATERSHED)/lib
INC := $(WATERSHED)/include $(XERCES)/include
# Paths
MPICPP := mpic++
SOURCES := $(shell find $(SRC) -name '*.cpp')
OBJECTS := $(addprefix $(BIN)/, $(notdir $(SOURCES:.cpp=.o)))
SHARED := $(OBJECTS:.o=.so)
# Flags
CFLAGS := -std=c++0x -O2 -Wall -fPIC
CFLAGS += $(foreach inc, $(INC), -I $(inc))
LFLAGS :=
LFLAGS += $(foreach lib, $(LIB), -l $(lib))
LFLAGS += $(foreach path, $(LIBPATH), -L $(lib))
# Rules
$(SHARED): | bindir
%.o:
@echo $@ -- [$<][$^][$*]
@echo $(MPICPP) $(CFLAGS) -c $< -o $@
%.so: %.o
@echo $(MPICPP) $(LFLAGS) -shared $< -o $@
bindir:
@mkdir -p $(BIN)
# Utilities
.PHONY: all clean
all: $(SHARED)
clean:
@rm -f $(OBJECTS) $(SHARED)
# Dependencies
define dependencies
$(addprefix $(BIN)/, $(notdir $(1:.cpp=.o))): \
$(shell $(MPICPP) $(CFLAGS) -MM $(1) | sed 's/^.*\.o:[ ]*//')
endef
$(foreach src, $(SOURCES), $(eval $(call dependencies, $(src))))
Там, где точно возникает ошибка: кажется, она вызвана шагом генерации зависимости, когда я удаляю все пустые строки, отправляя вывод в grep
, следующее:
define dependencies
$(addprefix $(BIN)/, $(notdir $(1:.cpp=.o))): \
$(shell $(MPICPP) $(CFLAGS) -MM $(1) | sed 's/^.*\.o:[ ]*//' | \
grep -v ^$)
endef
Ошибка как-то переходит в пустой список зависимостей; Я могу видеть, что список на самом деле пуст с echo
в правлении %.o:
- единственные переменные не пустые $@
а также $*
,
/home/rubens/bin/label.o - [] [] [/ home / rubens / bin / label]
mpiC++ -std= C++ 0x -O2 -Wall -fPIC -I / home / rubens / libwatershed / include -I /home/rubens/xerces-c-3.1.1/include -c -o / home / rubens / bin /label.o
mpiC++ -l водораздел -L -shared /home/rubens/bin/label.o -o /home/rubens/bin/label.so
Любые советы о лучших способах решения этой проблемы очень, очень приветствуются; Тем не менее, я действительно хотел бы закончить писать этот make-файл, прежде чем использовать что-то вроде Cmake
или же Scons
,
2 ответа
-MM уже сгенерирует зависимости в формате make-файла, так что вы можете упростить это, сгенерировав зависимости для каждого.cpp в один и тот же файл, а затем просто выполнить "-include $(DEPS_FILE)". Это, вероятно, более приемлемо, чем использование eval.
В строке определения переменной makefile SOURCES, ищите файлы cpp, вы, вероятно, должны переписать это так: find $(SRC) -name "*.cpp"