2016-11-24 3 views
0

Я пытаюсь проанализировать следующий make-файл и воспроизвести его «поведение» шаг за шагом.Почему «сделать все», кажется, пропускает правило «все:»?

Хотя я печатаю «make all», кажется, что этот make-файл пропускает строку «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 [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] 

Как вы можете видеть, благодаря эху в моем код просто даже не строить свой исходный код. Я бы ожидал, что это произойдет из all-> MOD_NAME-> build. (Это все выходные я)

enter image description here

Так что мои вопросы:

  • Как Makefile, я анализирую удается идти прямо, чтобы построить/* о.?

  • Почему моя реализация, которая, как я думаю, должна делать то же самое, даже не скомпилирует мой исходный код?

ответ

2

Файл, который вы скопировали, содержит 2 правила для «все». Первый зависит от $ (MOD_NAME), который может быть пустым.

Второе правило зависит от нескольких файлов «kernel7. *», Которые сами зависят от «kernel7.elf». Наконец, «kernel7.elf» зависит от $ (OBJECTS). Это последнее правило отвечает за то, что все ваши исходные файлы будут скомпилированы.

Первое правило с $ (MOD_NAME) не требует никакой компиляции вообще.

В вашем собственном Makefile у вас есть правило для «всего» в зависимости от $ (MOD_NAME). Если $ (MOD_NAME) пуст в вашем файле Makefile, у вас нет никакой зависимости от «all» вообще. Если «все» ни на что не зависит, исходные файлы не будут скомпилированы.

Для решения проблемы вам необходимо предоставить контент для $ (MOD_NAME).

-1

все пытается построить $ (MOD_NAME), который имеет зависимости $ (ОБЪЕКТЫ), который он пытается построить.

Есть два, все здесь, что является проблемой.

+0

Нет, потому что он прекрасно строится. Следовательно: это makefile, который я пытаюсь воспроизвести, это не мое. – LandonZeKepitelOfGreytBritn