为什么"全部"似乎跳过"所有:"规则?

时间:2016-11-24 11:51:53

标签: linux makefile build compilation

我正在尝试分析以下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 $@

正如您所看到的,感谢回声,我的代码甚至无法构建我的源代码。我希望它来自所有&gt; MOD_NAME-&gt;版本。 (这是我得到的所有输出)

enter image description here

所以我的问题是:

  • 我正在分析的makefile如何管理直接构建/ * .o?

  • 为什么我的实现,我认为应该做同样的事情,甚至不编译我的源代码?

2 个答案:

答案 0 :(得分:2)

您复制的Makefile包含2个&#34; all&#34;的规则。 第一个取决于$(MOD_NAME),它可能是空的。

第二条规则取决于多个文件&#34; kernel7。*&#34;它们本身依赖于&#34; kernel7.elf&#34;。 最后&#34; kernel7.elf&#34;取决于$(OBJECTS)。 最后一条规则负责编译所有源文件。

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

在你自己的Makefile中,你只有一个&#34; all&#34;取决于$(MOD_NAME)。 如果您的Makefile中的$(MOD_NAME)也为空,则您对#34; all&#34;没有任何依赖关系。一点都不 如果&#34;所有&#34;不依赖于任何东西,不会编译源文件。

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

答案 1 :(得分:-1)

所有人都在尝试构建$(MOD_NAME),它正在尝试构建$(OBJECTS)的依赖项。

这里有两个,这是一个问题。