【问题标题】:Why does "make all" seem to skip "all:" rule?为什么“make all”似乎跳过了“all:”规则?
【发布时间】:2017-04-08 17:11:48
【问题描述】:

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

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

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 $@

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

所以我的问题是:

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

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

【问题讨论】:

    标签: linux makefile build compilation


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      【解决方案2】:

      all 正在尝试构建 $(MOD_NAME),它具有 $(OBJECTS) 的依赖项,它正在尝试构建。

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

      【讨论】:

      • 不,因为它构建得非常好。因此:这是我要复制的 makefile,这不是我的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-30
      • 2012-06-11
      • 2012-05-21
      • 2016-09-11
      • 1970-01-01
      • 2020-03-25
      相关资源
      最近更新 更多