gpt4 book ai didi

linux - 为什么 "make all"似乎跳过了 "all:"规则?

转载 作者:太空宇宙 更新时间:2023-11-04 10:28:57 24 4
gpt4 key购买 nike

我正在尝试分析以下 makefile 并逐步重现其“行为”。

虽然我输入了“make all”,但这个 makefile 似乎跳过了“all:”行并直接跳转到“build/*.o”(因此出现了回声)。该文件及其相应的输出:

 TOOLCHAIN ?= arm-none-eabi-

SOURCES = Demo/main.c \
Demo/startup.c \
Demo/Drivers/rpi_gpio.c \
Demo/Drivers/rpi_irq.c \
Source/tasks.c \
Source/list.c \
Source/portable/GCC/RaspberryPi/port.c \
Source/portable/GCC/RaspberryPi/portisr.c \
Source/portable/MemMang/heap_4.c

OBJECTS = $(patsubst %.c,build/%.o,$(SOURCES))

INCDIRS = Source/include Source/portable/GCC/RaspberryPi \
Demo/Drivers Demo/

CFLAGS = -Wall $(addprefix -I ,$(INCDIRS))
CFLAGS += -D RPI2
CFLAGS += -march=armv7-a -mtune=cortex-a7 -mfloat-abi=hard -mfpu=neon-vfpv4

ASFLAGS += -march=armv7-a -mcpu=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard

LDFLAGS =

.PHONY: all clean

all: $(MOD_NAME)
echo "in all"

$(MOD_NAME): $(OBJECTS)
echo "in mod name"
ld -shared $(LDFLAGS) $< -o $@

build/%.o: %.c
echo -e "\nin build/*.o:*.c\n"
mkdir -p $(dir $@)
$(TOOLCHAIN)gcc -c $(CFLAGS) $< -o $@

build/%.o: %.s
echo -e "in build/*.o:*.s\n"
mkdir -p $(dir $@)
$(TOOLCHAIN)as $(ASFLAGS) $< -o $@

all: kernel7.list kernel7.img kernel7.syms kernel7.hex
echo -e"in kernel all\n"
$(TOOLCHAIN)size kernel7.elf


kernel7.img: kernel7.elf
$(TOOLCHAIN)objcopy kernel7.elf -O binary $@
echo -e "in kernel7.img\n"

kernel7.list: kernel7.elf
echo -e "kernel7.list\n"
$(TOOLCHAIN)objdump -D -S kernel7.elf > $@

kernel7.syms: kernel7.elf
echo -e "kernel7.syms\n"
$(TOOLCHAIN)objdump -t kernel7.elf > $@

kernel7.hex : kernel7.elf
echo -e "kernel7.hex\n"
$(TOOLCHAIN)objcopy kernel7.elf -O ihex $@

kernel7.elf: $(OBJECTS)
echo -e "kernel7.elf\n"
$(TOOLCHAIN)ld $^ -static -Map kernel7.map -o $@ -T Demo/raspberrypi.ld

clean:
rm -f $(OBJECTS)
rm -f kernel7.list kernel7.img kernel7.syms
rm -f kernel7.elf kernel7.hex kernel7.map
rm -rf build
echo -e "cleaning \n"

enter image description here

我尝试用一​​小段代码自己复制这种行为。但它似乎不起作用:

SOURCES = Demo/Drivers/rpi_irq.c \
Demo/Drivers/rpi_gpio.c


OBJECTS = $(patsubst %.c,build/%.o,$(SOURCES))


.PHONY: all clean

all: $(MOD_NAME)
echo "making all"$(SOURCES)

$(MOD_NAME): $(OBJECTS)
echo "MOD_NAME"

build/%.o:%.c
mkdir -p $(dir $@)
arm-none-eabi-gcc -march=armv7-a -mcpu=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=har $< -o $@

如您所见,感谢回声,我的代码甚至没有构建我的源代码。我希望它来自 all->MOD_NAME->build。 (这是我得到的所有输出)

enter image description here

所以我的问题是:

  • 我正在分析的 makefile 是如何直接进入 build/*.o 的?

  • 为什么我的实现(我认为应该这样做)甚至没有编译我的源代码?

最佳答案

您复制的 Makefile 包含 2 个“all”规则。第一个取决于可能为空的 $(MOD_NAME)。

第二条规则依赖于多个文件“kernel7.*”,这些文件本身依赖于“kernel7.elf”。最后“kernel7.elf”依赖于$(OBJECTS)。最后一条规则负责编译所有源文件。

带有 $(MOD_NAME) 的第一条规则根本不需要引起任何编译。

在您自己的 Makefile 中,您只有一条“全部”规则取决于 $(MOD_NAME)。如果你的 Makefile 中的 $(MOD_NAME) 也是空的,那么你根本就没有任何对“all”的依赖。如果“all”不依赖于任何东西,则不会编译任何源文件。

要解决您的问题,您需要为 $(MOD_NAME) 提供一些内容。

关于linux - 为什么 "make all"似乎跳过了 "all:"规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40785706/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com