如何在makefile中将各种文件扩展名重命名为.o?

时间:2016-08-04 16:06:19

标签: makefile

嗨,我有这个makefile:

CC = gcc
AS = nasm

CFLAGS = -ffreestanding -Wall -Wextra -std=c11 -m32 -nostdlib -nostdinc -fno-stack-protector 
LDFLAGS = -m elf_i386 -T link.ld 
ASFLAGS = -f elf32

SOURCES = $(wildcard src/*.c wildcard src/*.s)
OBJECTS = $(SOURCES:.[s|o]=.o)

INCLUDEPATH = -I inc src/include
OBJDIR = bin/obj
SRCDIR = src/

all: build

build:
   ld $(LDFLAGS) $(OBJECTS) -o bin/kernel.bin

iso: build
   cp bin/kernel.bin XeonOS/boot
   grub-mkrescue -o XeonOS.iso XeonOS/

run: iso
   quemu-system-i386 -m 512M -cdrom XeonOS.iso

clean:
   rm -rf bin/*.o bin/kernel.bin

%.o: $(SRCDIR)%.c
   $(CC) $(INCLUDEPATH) $(CFLAGS) $< -o $(OBJDIR)/$(OBJECTS)

%.o: $(SRCDIR)%.s
   $(AS) $(ASFLAGS) $< -o $(OBJDIR)/$(OBJECTS)

当我执行命令make run时,我收到以下错误:

ld -m elf_i386 -T link.ld src/kernel_c.c src/kernel_asm.s -o bin/kernel.bin ld:src/kernel_c.c: file format not recognized; treating as linker script

因为kernel_c.c和kernel_asm.s没有&#39;将他们的扩展名更改为.o。如何同时将.s和.c的扩展名更改为.o?

顺便说一句,我还有另一个问题,OBJECTS变量的值包含src /目录,但目标文件存储在bin / obj文件夹中,我该如何更改?

2 个答案:

答案 0 :(得分:0)

当我上个月遇到这个问题时,我就这样做了:

SOURCES_C := $(wildcard src/*.c)
SOURCES_S := $(wildcard src/*.s)
OBJECTS   := $(SOURCES_C:%.c=%.o) \
             $(SOURCES_S:%.s=%.o)

我没有太深入地看过这个,但据我所知,这是你最好的选择。

答案 1 :(得分:0)

最后我使用了@LightnessRacesinOrbit建议并使用了patsubsr,因此代码现在正在运行:

CC = gcc
AS = nasm

CFLAGS = -m32 -nostdlib -nostdinc -fno-builtin -fno-stack-protector -nostartfiles -nodefaultlibs -Wall -Wextra -Werror
LDFLAGS = -m elf_i386 -T link.ld 
ASFLAGS = -f elf32

C_SOURCES = $(wildcard src/*.c)
C_OBJECTS = $(patsubst %.c,%.o, $(notdir $(C_SOURCES) ))

ASM_SOURCES = $(wildcard src/*.s)
ASM_OBJECTS = $(patsubst %.s,%.o, $(notdir $(ASM_SOURCES) ))

INCLUDEPATH = -I src/include
OBJDIR = bin/obj
SRCDIR = src/

.PHONY: build

all: build

build: $(C_OBJECTS) $(ASM_OBJECTS)
   ld $(LDFLAGS) $(OBJDIR)/$(ASM_OBJECTS) $(OBJDIR)/$(C_OBJECTS) -o bin/kernel.bin

iso: build
   cp bin/kernel.bin XeonOS/boot
   grub-mkrescue -o XeonOS.iso XeonOS/

run: iso
    bochs -f bochsconfig.cfg -q

clean:
    rm -rf XeonOS/boot/kernel.bin
    rm -rf bin/obj/*.o bin/kernel.bin

%.o: $(SRCDIR)%.c
    $(CC) $(INCLUDEPATH) $(CFLAGS) $< -o $(OBJDIR)/$@

%.o: $(SRCDIR)%.s
    $(AS) $(ASFLAGS) $< -o $(OBJDIR)/$@