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

5

Решение

-MM уже сгенерирует зависимости в формате make-файла, так что вы можете упростить это, сгенерировав зависимости для каждого .cpp в один и тот же файл, а затем просто выполните «-include $ (DEPS_FILE)». Это, вероятно, более приемлемо, чем использование eval.

1

Другие решения

В строке определения переменной makefile SOURCES, ищите файлы cpp, вы, вероятно, должны переписать это так:
найти $ (SRC) -имя «* .cpp»

0

По вопросам рекламы [email protected]