Написание зависимостей в 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"

Другие вопросы по тегам