makefile中有多种编译模式

时间:2014-02-25 20:23:12

标签: c++ makefile gnu-make

我想使用单个make文件以多种模式生成项目,然后以“正常”和“调试”模式生成每个模式,即:

我有以下文件(ofc更多实际,但这将有助于表明我的观点):

  • 内核/型芯/ main.cpp中
  • 内核/处理器/ Processor.cpp
  • 内核/处理器/ 86 / Processor.cpp
  • 内核/处理器/ x86_common / Processor.cpp
  • 内核/处理器/ 64 / Processor.cpp

我希望能够通过以下方式使用我的makefile:

make x86
  (compiles all files except "kernel/processor/x64/Processor.cpp")
  (enables the pre-processor directives X86 & X86_COMMON)

make x86debug
  (compiles all files except "kernel/processor/x64/Processor.cpp")
  (enables the pre-processor directives X86 & X86_COMMON & DEBUG)
  (puts "-g -ggdb" infront of all gcc/g++/as arguments)

等等。

目前我有以下makefile,虽然它有效,但只允许我在x86-debug模式下编译,现在我将我的软件移植到其他平台,我希望能够指定要构建的模式。

CC = i586-elf-g++
CFLAGS = -g -ggdb -ffreestanding -Wall -Wextra -fno-exceptions -fno-rtti -std=gnu++11 -Isrc/system/include -DX86 -DX86_COMMON
LD = i586-elf-gcc
LDFLAGS = -g -ggdb -ffreestanding -O2 -nostdlib -lgcc
AS = i586-elf-as
ASFLAGS = -g -ggdb 

OBJECTS = src/system/kernel/core/main.o
ALL_OBJECTS = $(OBJECTS) $(X86_OBJECTS)

X86COMMON_OBJECTS   = src/system/kernel/core/processor/x86_common/Processor.o

X86_OBJECTS = $(X86COMMON_OBJECTS) src/system/kernel/core/processor/x86/boot.o
X86_LINKER  = src/system/kernel/core/processor/x86/link.ld
X86_OUTPUT  = bin/kernel_x86.bin

.PHONY: clean
clean: $(ALL_OBJECTS)
    rm $(ALL_OBJECTS)

.PHONY: all
all: $(X86_OUTPUT)

$(X86_OUTPUT): $(X86_LINKER) $(OBJECTS) $(X86_OBJECTS)
    $(LD) $(LDFLAGS) -T $(X86_LINKER) $^ -o $@

%.o: %.cpp
    $(CC) $(CFLAGS) -c $< -o $@

%.o: %.asm
    $(AS) $(ASFLAGS) $< -o $@

你可能会说,我不是make的专家,所以任何帮助/想法都会受到赞赏。

1 个答案:

答案 0 :(得分:1)

-gCFLAGS移除LDFLAGS,然后添加以下PHONY

.PHONY: x86_debug
x86_debug: CFLAGS += -g
x86_debug: LDFLAGS += -g
x86_debug: $(X86_OUTPUT)

以正常模式编译:{{1​​}}。 要在调试模式下编译:{{1​​}}

它可能不会完全符合您的期望,但它很容易修改