Gcc Makefile希望自己编译

Gcc Makefile希望自己编译,gcc,makefile,llvm,Gcc,Makefile,Llvm,我正在使用一个Makefile用LLVM(clang)编译C代码,以便为ARM Cortex-M3生成LLVM IR和汇编。编制流程如下: %.ll:$(SRC_C)C code-->LLVM IR %.bc:$(SRC_LL)LLVM-IR-->LLVM-binary %.s:$(SRC_BC)LLVM二进制-->ARM组件 %.s.o:$(SRC_s)ARM部件-->对象文件 all对象文件与main.o和stm32.ld-->ELF文件的链接 LLVM IR文件和ARM程序集文件不应被删除

我正在使用一个Makefile用LLVM(clang)编译C代码,以便为ARM Cortex-M3生成LLVM IR和汇编。编制流程如下:

  • %.ll:$(SRC_C)
    C code-->LLVM IR
  • %.bc:$(SRC_LL)
    LLVM-IR-->LLVM-binary
  • %.s:$(SRC_BC)
    LLVM二进制-->ARM组件
  • %.s.o:$(SRC_s)
    ARM部件-->对象文件
  • all
    对象文件与main.o和stm32.ld-->ELF文件的链接
  • LLVM IR文件和ARM程序集文件不应被删除,因此我添加了这一行:
    。次要:$(SRC_LL)$(SRC_S)

    以下是生成文件:

    CFLAGS = -I./ -c -O0 -gdwarf-3 -mcpu=cortex-m3 --target=armv7m-none-eabi
    LFLAGS = -Tstm32.ld -nostartfiles
    LLCFLAGS =  -O0 -mtriple=arm-none-eabi -march=thumb -mattr=thumb2 -mcpu=cortex-m3 -float-abi=soft -thread-model=single -filetype=asm
    CC = clang 
    LD = arm-none-eabi-ld
    
    TARGET = example_code.elf
    
    SRC_C = example_code.c crc_function.c
    SRC_S = $(SRC_C:.c=.s)
    SRC_LL = $(SRC_C:.c=.ll)
    SRC_BC = $(SRC_C:.c=.bc)
    SRC_S = $(SRC_C:.c=.s)
    SRC_SO = $(SRC_C:.c=.s.o)
    
    .SECONDARY: $(SRC_LL) $(SRC_S)
    
    all: $(SRC_SO) main.o
        $(LD) $(LFLAGS) -o $(TARGET) main.o $(SRC_SO)
    
    %.ll: $(SRC_C)
        clang -O0 -emit-llvm -S -c $*.c -o $*.ll
    
    %.bc: $(SRC_LL)
        llvm-as $*.ll -o $*.bc
    
    %.s: $(SRC_BC)
        llc $(LLCFLAGS) $*.bc -o $*.s
    
    %.s.o: $(SRC_S)
        $(CC) $(CFLAGS) -o $*.s.o -c $*.s
    
    main.o: main.c
        $(CC) $(CFLAGS) -o main.o main.c
    
    clean:
        -rm $(SRC_S)
        -rm $(SRC_LL)
        -rm $(SRC_BC)
        -rm $(SRC_S)
        -rm $(SRC_SO)
        -rm main.o
        -rm $(TARGET)
    
    这是我的档案:

    crc_function.c
    crc_function.h
    example_code.c
    main.c
    stm32.ld
    
    它编译时没有错误:

    clang -O0 -emit-llvm -S -c example_code.c -o example_code.ll
    clang -O0 -emit-llvm -S -c crc_function.c -o crc_function.ll
    llvm-as example_code.ll -o example_code.bc
    llvm-as crc_function.ll -o crc_function.bc
    llc -O0 -mtriple=arm-none-eabi -march=thumb -mattr=thumb2 -mcpu=cortex-m3 -float-abi=soft -thread-model=single -filetype=asm example_code.bc -o example_code.s
    llc -O0 -mtriple=arm-none-eabi -march=thumb -mattr=thumb2 -mcpu=cortex-m3 -float-abi=soft -thread-model=single -filetype=asm crc_function.bc -o crc_function.s
    clang  -I./ -c -O0 -gdwarf-3 -mcpu=cortex-m3 --target=armv7m-none-eabi -o example_code.s.o -c example_code.s
    clang  -I./ -c -O0 -gdwarf-3 -mcpu=cortex-m3 --target=armv7m-none-eabi -o crc_function.s.o -c crc_function.s
    clang  -I./ -c -O0 -gdwarf-3 -mcpu=cortex-m3 --target=armv7m-none-eabi -o main.o main.c
    arm-none-eabi-ld -Tstm32.ld -nostartfiles -o example_code.elf main.o example_code.s.o crc_function.s.o
    rm example_code.bc crc_function.bc
    
    但是,在成功编译后,我无法调用
    makeclean
    makeall
    ,它会给我以下输出:

    llvm-as example_code.ll -o example_code.bc
    llvm-as crc_function.ll -o crc_function.bc
    llc -O0 -mtriple=arm-none-eabi -march=thumb -mattr=thumb2 -mcpu=cortex-m3 -float-abi=soft -thread-model=single -filetype=asm Makefile.bc -o Makefile.s
    llc: Makefile.bc: error: Could not open input file: No such file or directory
    make: *** [Makefile.s] Error 1
    rm example_code.bc crc_function.bc
    
    Makefile试图自行编译,我不明白为什么

    解决方案

    谢谢你的快速回复。以下是我的问题的解决方案:

    CFLAGS = -I./ -c -O0 -gdwarf-3 -mcpu=cortex-m3 --target=armv7m-none-eabi
    LFLAGS = -Tstm32.ld -nostartfiles
    LLCFLAGS =  -O0 -mtriple=arm-none-eabi -march=thumb -mattr=thumb2 -mcpu=cortex-m3 -float-abi=soft -thread-model=single -filetype=asm
    CC = clang 
    LD = arm-none-eabi-ld
    
    TARGET = example_code.elf
    
    SRC_C = example_code.c crc_function.c
    SRC_S = $(SRC_C:.c=.s)
    SRC_LL = $(SRC_C:.c=.ll)
    SRC_BC = $(SRC_C:.c=.bc)
    SRC_S = $(SRC_C:.c=.s)
    SRC_SO = $(SRC_C:.c=.s.o)
    
    .SECONDARY: $(SRC_LL) $(SRC_S)
    
    all: $(TARGET)
    
    $(TARGET): $(SRC_SO) main.o
        $(LD) $(LFLAGS) -o $(TARGET) main.o $(SRC_SO)
    
    $(SRC_LL): %.ll: %.c
        clang -O0 -emit-llvm -S -c $< -o $@
    
    $(SRC_BC): %.bc: %.ll
        llvm-as $*.ll -o $*.bc
    
    $(SRC_S): %.s: %.bc
        llc $(LLCFLAGS)  $< -o $@
    
    $(SRC_SO): %.s.o: %.s
        $(CC) $(CFLAGS) -o $@ -c $<
    
    main.o: main.c
        $(CC) $(CFLAGS) -o main.o main.c
    
    .PHONY: clean
    clean:
        -rm $(SRC_S)
        -rm $(SRC_LL)
        -rm $(SRC_BC)
        -rm $(SRC_S)
        -rm $(SRC_SO)
        -rm main.o
        -rm $(TARGET)
    
    CFLAGS=-I./-c-O0-gdwarf-3-mcpu=cortex-m3--target=armv7m无eabi
    LFLAGS=-Tstm32.ld-nostartfiles
    LLCFLAGS=-O0-mtriple=arm none eabi-march=thumb-mattr=thumb2-mcpu=cortex-m3-float abi=soft-thread model=single-filetype=asm
    CC=叮当声
    LD=臂无eabi LD
    目标=示例_code.elf
    SRC_C=示例_code.C crc_function.C
    SRC_S=$(SRC_C:.C=.S)
    SRC_LL=$(SRC_C:.C=.LL)
    SRC_BC=$(SRC_C:.C=.BC)
    SRC_S=$(SRC_C:.C=.S)
    SRC_SO=$(SRC_C:.C=.s.o)
    。中学:$(SRC_LL)$(SRC_S)
    全部:$(目标)
    $(目标):$(SRC_SO)main.o
    $(LD)$(LFLAGS)-o$(TARGET)main.o$(SRC_SO)
    $(SRC_LL):%.LL:%.c
    叮当声-O0-emit llvm-S-c$<-o$@
    $(SRC_BC):%.BC:%.ll
    llvm作为$*.ll-o$*.bc
    $(SRC_S):%.S:%.bc
    llc$(LLCFLAGS)$<-o$@
    $(SRC_SO):%s.o:%s
    $(CC)$(CFLAGS)-o$@-c$<
    main.o:main.c
    $(CC)$(CFLAGS)-o main.o main.c
    .假冒:干净
    清洁:
    -rm$(斯里兰卡卢比)
    -rm$(斯里兰卡卢比)
    -rm$(SRC\U BC)
    -rm$(斯里兰卡卢比)
    -rm$(SRC_SO)
    -主楼室
    -rm$(目标)
    
    您需要查看
    .PHONY
    指令。clean不是特殊的,make将检查文件clean是否存在

    此外,您的规则需要更改,因为Makefile.s有一些隐式规则与“Makefile.bc->Makefile.s”匹配。您可以查看禁用所有内置规则的方法。或者你可以使用。例如,如果您有另一种方法来生成一个“.s”文件作为源,那么这个规则集可能会变得混乱。对于“.s”规则,这将是

    $(SRC_BC): %.s: %.bc
        llc $(LLCFLAGS)  $< -o $@
    
    $(SRC_BC):%.s:%.BC
    llc$(LLCFLAGS)$<-o$@
    

    现在,只有
    $(SRC_BC)
    中的文件才会应用此规则,并且隐式的“Makefile.s”不会尝试使用它。您还可以使用其他规则生成汇编程序,并且只有输入变量将指定集合(不是全局匹配;某些make隐式规则将具有全局匹配)。

    'Makefile.s'可能是来自另一个规则的文件,用于生成最终的'Makefile'。您可以使用
    make-p
    和/或
    make-d
    查看信息(在这种情况下,只需
    make--debug=i
    )。由于输出很大,请通过管道连接到文件并使用grep等查找字符串;'在本例中为makefile.s。