Основываясь на некоторых вопросах 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
,
-MM уже сгенерирует зависимости в формате make-файла, так что вы можете упростить это, сгенерировав зависимости для каждого .cpp в один и тот же файл, а затем просто выполните «-include $ (DEPS_FILE)». Это, вероятно, более приемлемо, чем использование eval.
В строке определения переменной makefile SOURCES, ищите файлы cpp, вы, вероятно, должны переписать это так:
найти $ (SRC) -имя «* .cpp»