Рекурсивность и друзья Gnu Make

Возможно, я делаю что-то не так, но make отказывается проверять временные метки зависимостей, когда make-файл выглядит так.

# This makefile won't update the objects if you modify the .cpp files
# and it will only create them if they do not exist.
CC=g++
FL=-g
OBJECTD=../obj
SOURCED=../src

# Get all .cpp files in ../src
SOURCES=$(wildcard *.cpp)

# Convert .cpp to .o then add ../obj in front
OBJECTS=$(addprefix $(OBJECTD)/,$(patsubst %.cpp,%.o,$(SOURCES)))

# You sir must execute yourself whether you like it or not
.PHONY:all

all:$(OBJECTS)
    @echo : Leaving `src`


# This wont work as expected ...
# @echo : Compiling $(notdir $(patsubst %.o,%.cpp,$@))
# echoes Compiling logger.cpp
# But $(notdir $(patsubst %.o,%.cpp,$@)) will not be parsed
# correctly
$(OBJECTS):$(notdir $(patsubst %.o,%.cpp,$@))
    @echo : Compiling $(notdir $(patsubst %.o,%.cpp,$@))
    @$(CC) $(FL) -c $(notdir $(patsubst %.o,%.cpp,$@)) -o $@

Я считаю, что он просто не примет $(notdir $(patsubst %.o,%.cpp,$@))

хотя в документации указано, что

В шаблонном правиле, имеющем несколько целей (см. Введение в шаблонные правила), «$ @» - это имя той цели, которая вызвала выполнение рецепта правила.


Выполнение компиляции для каждого файла по отдельности отлично работает.
Например:

../obj/logger.o:logger.cpp
    @echo : Compiling $<
    @$(CC) $(FL) -c $< -o $@


+ ------------ +
: eXtra nfo:
+ ------------ +


Я пытаюсь прочитать источники из текущего каталога, проверить, изменились ли они, если они есть, приступить к их компиляции, помещая объекты в ../obj вместо текущего каталога.
Это make-файл, расположенный в ../src, есть еще один файл для связывания в родительском каталоге.


Графическое представление структуры, над которой я хочу работать

 +--- Parent Directory ------+
 |        |        |         |
 |        |        |         |
bin      obj      inc       src

person gifnoc-gkp    schedule 20.07.2013    source источник


Ответы (1)


Ваше правило:

$(OBJECTS):$(notdir $(patsubst %.o,%.cpp,$@))
    ...

не работает, потому что $@ не имеет значения в списке предварительных требований. Из руководства:

[Автоматические переменные] не могут быть доступны непосредственно в списке предварительных требований правила.

Попробуйте это:

$(OBJECTS): $(OBJECTD)/%.o : %.cpp
    @echo : Compiling $<
    @$(CC) $(FL) -c $< -o $@
person Beta    schedule 20.07.2013
comment
@TheOtherGuy: здесь есть три новых идеи: 1) $@ не работает в списке предварительных требований, 2) правила статического шаблона и 3) $< означает первое предварительное условие. Какой из них доставляет вам проблемы? - person Beta; 20.07.2013
comment
Я получаю $ ‹часть. Я не понимаю вложенных целей. - person gifnoc-gkp; 20.07.2013
comment
Перейдите по ссылке (это), чтобы узнать о правилах статических шаблонов. - person Beta; 20.07.2013
comment
Чтение: gnu.org/software/make/ manual / html_node /, большое спасибо: P - person gifnoc-gkp; 20.07.2013