2016-11-24 64 views
0

我想分析下面的makefile并逐步重现其“行为”。为什么“make all”似乎跳过了“all:”规则?

虽然我输入“make all”,但是这个makefile跳过了“all:”这一行,直接跳转到“build/*。o”(因此是echo)。 的文件及其相应的输出:

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 [email protected] 

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

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

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 [email protected] 
    echo -e "in kernel7.img\n" 

kernel7.list: kernel7.elf 
    echo -e "kernel7.list\n" 
    $(TOOLCHAIN)objdump -D -S kernel7.elf > [email protected] 

kernel7.syms: kernel7.elf 
    echo -e "kernel7.syms\n" 
    $(TOOLCHAIN)objdump -t kernel7.elf > [email protected] 

kernel7.hex : kernel7.elf 
    echo -e "kernel7.hex\n" 
    $(TOOLCHAIN)objcopy kernel7.elf -O ihex [email protected] 

kernel7.elf: $(OBJECTS) 
    echo -e "kernel7.elf\n" 
    $(TOOLCHAIN)ld $^ -static -Map kernel7.map -o [email protected] -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 [email protected]) 
    arm-none-eabi-gcc -march=armv7-a -mcpu=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=har $< -o [email protected] 

正如你可以看到感谢回声的我的代码甚至没有建立我的源代码。我期望它从全部 - > MOD_NAME->构建。 (这是所有输出我得到的)

enter image description here

所以我的问题是:

  • 如何我分析生成文件管理直来直去建立/ *○?

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

回答

2

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

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

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

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

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

-1

所有正试图建立$(MOD_NAME),它有试图建立$(OBJECTS)的依赖关系。

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

+0

不,因为它构建得非常好。因此:这是我试图复制的makefile,这不是我的。 – LandonZeKepitelOfGreytBritn