GNU Правильное поведение при включении других make-файлов - PullRequest
0 голосов
/ 01 декабря 2018

У меня есть следующий make-файл в корне проекта:

Makefile

# Board version
# Available: 3
PI              ?= 3

# Kernel binaries
ifeq ($(PI), 3)
KERNEL_IMG      := kernel8.img
else ifeq ($(PI), 2)
KERNEL_IMG      := kernel7.img
else ifeq ($(PI), 1)
KERNEL_IMG      := kernel.img
else
$(error Unsupported Raspberry Pi version)
endif

KERNEL_ELF      := $(patsubst %.img,%.elf,$(KERNEL_IMG))

# Directories/paths
BUILD_DIR       := build

# Toolchain
TOOLCHAIN       ?= aarch64-elf
OBJCOPY         := $(TOOLCHAIN)-objcopy
LD              := $(TOOLCHAIN)-ld
CC              := $(TOOLCHAIN)-gcc

# Misc
LINKER_SCRIPT   := linker.ld

# Flags
LDFLAGS         := -T $(LINKER_SCRIPT)
ASFLAGS         :=
CFLAGS          :=

# Source files
C_SRC           := $(wildcard *.c)
ASM_SRC         := $(wildcard *.S)

# Include
include pi/$(PI)/mod.mk

# Object files
OBJECTS         := $(patsubst %,$(BUILD_DIR)/%.o,$(C_SRC))
OBJECTS         += $(patsubst %,$(BUILD_DIR)/%.o,$(ASM_SRC))

# Targets
.PHONY: all builddirs clean
all: $(BUILD_DIR)/$(KERNEL_IMG)

$(BUILD_DIR)/$(KERNEL_IMG): $(BUILD_DIR)/$(KERNEL_ELF)
        $(OBJCOPY) $< -O binary $@

$(BUILD_DIR)/$(KERNEL_ELF): $(LINKER_SCRIPT) $(OBJECTS)
        $(LD) $(OBJECTS) $(LDFLAGS) -o $@

$(OBJECTS): | builddirs

builddirs: $(BUILD_DIR)/pi/$(PI)

$(BUILD_DIR)/pi/$(PI):
        mkdir -p $@

$(BUILD_DIR)/%.S.o: %.S
        $(CC) -c $< $(ASFLAGS) -o $@

$(BUILD_DIR)/%.c.o: %.c
        $(CC) -c $< $(CFLAGS) -o $@

clean:
        $(RM) -r $(BUILD_DIR)

Включает в себя pi / 3 / mod.mk

C_SRC           +=
ASM_SRC         += pi/3/start.S

$(BUILD_DIR)/pi/3/start.S.o: pi/3/start.S pi/3/include/cpu/sysregs.h
        $(CC) -c $< $(ASFLAGS) -o $@

Сейчасвот в чем проблема: всякий раз, когда я запускаю «make» в корне проекта, запускается правило «$ (BUILD_DIR) /pi/3/start.So» вместо «all».Если я переместу 'include pi / $ (PI) /mod.mk' в самый конец корневого make-файла и заменим переменные 'C_SRC' и 'ASM_SRC' в 'pi / 3 / mod.mk' на 'OBJECTS + =$ (BUILD_DIR) /pi/3/start.So 'и вызвать' make ', это правило даже не вызывается, поэтому я получаю сообщение об ошибке, что make не знает, как построить start.So

Что я делаю не так и как лучше всего с этим справиться?

1 Ответ

0 голосов
/ 01 декабря 2018

Цель по умолчанию для Make - это первая цель в вашем Makefile.В вашем случае первая цель определена во включенном Makefile: $(BUILD_DIR)/pi/3/start.S.o.Либо вызовите make all, либо переместите правило all в свой Makefile так, чтобы оно стало первым, либо скажите make, что целью по умолчанию является all:

.DEFAULT_GOAL := all

(см. GNUсделать руководство ).

...