2016-11-24 8 views
0

私は次のメイクファイルを分析し、その "行動"を段階的に再現しようとしています。「すべてを作る」が「すべて」ルールをスキップするように見えるのはなぜですか?

"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 [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

。しかし、動作していないようです:

エコーのおかげでわかりましたように私のコードは私のソースコードをビルドしていません。私はそれがすべての→MOD_NAME->ビルドに行くことを期待しています。 (これは私が得るすべての出力である)

enter image description here

だから私の質問は以下の通りです。

  • はどのように分析していますmakefileが/ * Oを構築するためにまっすぐに行くために管理していますか?

  • 私の実装では、同じことをしなければならないと思うのですが、自分のソースコードをコンパイルしないのですか?

答えて

2

コピーしたMakefileには、「all」の2つのルールが含まれています。 最初は$(MOD_NAME)に依存します。

第2のルールは、「kernel7 .elf」に依存する複数のファイル "kernel7。*"に依存します。 最後に "kernel7.elf"は$(OBJECTS)に依存します。 この最後のルールは、すべてのソースファイルがコンパイルされることを保証します。

$(MOD_NAME)の最初のルールは、コンパイルをまったく行う必要はありません。

自分のMakefileには、$(MOD_NAME)に応じて「すべて」のルールしかありません。 Makefileでも$(MOD_NAME)が空であれば、 "all"の依存関係はまったくありません。 "all"が何にも依存しない場合、ソースファイルはコンパイルされません。

問題を解決するには、$(MOD_NAME)のコンテンツを提供する必要があります。

-1

すべては、構築しようとしている$(OBJECTS)の依存関係を持つ$(MOD_NAME)を作成しようとしています。

ここには2つの問題があります。

+0

いいえ、完全にうまく構築できます。したがって、これは私が複製しようとしているmakefileです、これは私のものではありません。 – LandonZeKepitelOfGreytBritn

関連する問題