2015-11-03 2 views
1

My Makefile имеет следующие макросы определены:Объединяя цели Makefile в более многоразовой цель

# Output location 
OUT_DIR = Build 

# Source location 
SOURCE_DIR = Src 

# Complete list of source files to be compiled 
SOURCES = $(SOURCE_DIR)/main.c 
SOURCES += $(SOURCE_DIR)/startup.s 
SOURCES += System/CMSIS/Device/ST/STM32F4xx/Source/Templates/system_stm32f4xx.c 

# Separate out .c and .s source files 
C_SOURCES = $(filter %.c, $(SOURCES)) 
ASM_SOURCES = $(filter %.s, $(SOURCES)) 

# Rename .c to .o, and replace the path with $(OUT_DIR)/ 
# For example Src/main.c becomes Build/main.o 
OBJECTS = $(addprefix $(OUT_DIR)/, $(notdir $(C_SOURCES:.c=.o))) 
OBJECTS += $(addprefix $(OUT_DIR)/, $(notdir $(ASM_SOURCES:.s=.o))) 

... и у меня есть следующая цель, которая прослушивала меня немного:

$(OUT_DIR)/%.o : $(SOURCE_DIR)/%.c 
    @echo "Compiling $<" 
    $(CC) $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $(OUT_DIR)/$(notdir [email protected]) 
    @echo 

$(OUT_DIR)/%.o : System/CMSIS/Device/ST/STM32F4xx/Source/Templates/%.c 
    @echo "Compiling $<" 
    $(CC) $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $(OUT_DIR)/$(notdir [email protected]) 
    @echo 

Есть способ, которым я могу определить целевую, без указания пути? Кажется, слишком много повторений ...

Цели оба отлично работают, но я просто чувствую, что нет необходимости повторять цели, подобные этому.

+0

ли с помощью VPATH, как эта помощь: 'VPATH = Src: System/CMSIS/Device/ST/STM32F4xx/Source/Templates' –

ответ

1

Вы можете использовать Canned Recipe, который содержит тело рецепта и использовать, что в каждом правиле, но вы не можете комбинировать правила, которые имеют такие дико различных моделей предварительных условий.

define JVN_COMPILE 
    @echo "Compiling $<" 
    $(CC) $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $(OUT_DIR)/$(notdir [email protected]) 
    @echo 
endef 

$(OUT_DIR)/%.o : $(SOURCE_DIR)/%.c 
    $(JVN_COMPILE) 

$(OUT_DIR)/%.o : System/CMSIS/Device/ST/STM32F4xx/Source/Templates/%.c 
    $(JVN_COMPILE) 

или установите VPATH и выполните следующие действия:

VPATH = Src:System/CMSIS/Device/ST/STM32F4xx/Source/Templates 

define JVN_COMPILE 
    @echo "Compiling $<" 
    $(CC) $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $(OUT_DIR)/$(notdir [email protected]) 
    @echo 
endef 

$(OUT_DIR)/%.o : %.c 
    $(JVN_COMPILE) 
+0

Это помогает, и это работает, но я не могу понять, почему образец, на который я ссылаюсь, просто имеет правило, например '% .o:% .c', и все это работает, несмотря на то, что базовый путь отличается от исходных файлов? –

+0

Поскольку каталоги ввода и вывода в этих файлах, скорее всего, одинаковы, а ваши нет. В этом разница. Единственной частью целевого/предварительного условия, которое может меняться, является то, что соответствует '%' (или, в унисон, каталоги этих файлов, когда цель не указывает какие-либо компоненты каталога). Образец также мог бы использовать 'VPATH' /' vpath', чтобы помочь найти источники поиска в альтернативных каталогах (чтобы «притворяться», каталоги указаны в списке предварительных условий. –

+0

Ах, вы правы @ Этан Рейснер, существует определенный vpath Я прочитал некоторые документы, чтобы узнать, могу ли я использовать vpath для исправления? –