我写了一个make文件C但是我需要尽可能地简化它,因为它很长有帮助吗?
# Makefile for makedemo
bin/Debug/P3_MakeDemo: bin bin/Debug bin/obj bin/obj/ma.o bin/obj/mb.o bin/obj/mc.o bin/obj/md.o bin/obj/main.o
gcc -o bin/Debug/P3_MakeDemo bin/obj/ma.o bin/obj/mb.o bin/obj/mc.o bin/obj/md.o bin/obj/main.o -Wall -g -pedantic --std=c99
bin/Debug/P3_MakeDemo
bin/obj: bin/
mkdir bin/obj
bin/Debug: bin/
mkdir bin/Debug
bin:
mkdir bin
bin/obj/ma.o: src/ma.c
gcc -I include -c src/ma.c -o bin/obj/ma.o -Wall -g -pedantic --std=c99
bin/obj/mb.o: src/mb.c
gcc -I include -c src/mb.c -o bin/obj/mb.o -Wall -g -pedantic --std=c99
bin/obj/mc.o: src/mc.c
gcc -I include -c src/mc.c -o bin/obj/mc.o -Wall -g -pedantic --std=c99
bin/obj/md.o: src/md.c
gcc -I include -c src/md.c -o bin/obj/md.o -Wall -g -pedantic --std=c99
bin/obj/main.o: src/main.c
gcc -I include -c src/main.c -o bin/obj/main.o -Wall -g -pedantic --std=c99
clean:
rm -rf bin/Debug/P3_MakeDemo
rm -rf bin/obj/ma.o
rm -rf bin/obj/mb.o
rm -rf bin/obj/mc.o
rm -rf bin/obj/md.o
rm -rf bin/obj/main.o
rm -rf bin/obj
rm -rf bin
debug_off:
sed -i -e 's/#define DEBUG/#undef DEBUG/g' include/globals.h
debug_on:
sed -i -e 's/#undef DEBUG/#define DEBUG/g' include/globals.h
dochtml:doc
cd doc; doxygen
docclean:
rm -rf doc/html
doc:
mkdir doc
test: bin bin/Debug/test bin/obj bin/obj/ma.o bin/obj/mb.o bin/obj/mc.o bin/obj/md.o bin/Debug/test
bin/Debug/test
bin/Debug/test:test/main.o
gcc -l cunit -o bin/Debug/test bin/obj/ma.o bin/obj/mb.o bin/obj/mc.o bin/obj/md.o test/main.o -Wall -g -pedantic --std=c99
test/main.o: test/main.c
gcc -I include -c test/main.c -o test/main.o -Wall -g -pedantic --std=c99
testclean:
rm test/main.o
rm bin/exec/test
.PHONY: test
基于通用变量的Makefile,以便在修改一个变量时,文件将自动定位并自动编译
下面的示例仅允许您修改OBJS
变量,并将所有相应文件自动添加到最终gcc或g ++命令中
表示如果将P3_MakeDemo.o ma.o
设置为OBJS
,它将自动选择P3_MakeDemo.c
和ma.c
PROJECT_ROOT = $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
OBJS = P3_MakeDemo.o ma.o
CXX = g++
CC = gcc
BUILD_MODE = debug
ifeq ($(BUILD_MODE),debug)
CFLAGS += -g
else ifeq ($(BUILD_MODE),run)
CFLAGS += -O2
else
$(error Build mode $(BUILD_MODE) not supported by this Makefile)
endif
all: P3_MakeDemo
P3_MakeDemo: $(OBJS)
$(CXX) -o $@ $^
%.o: $(PROJECT_ROOT)%.cpp
$(CXX) -c $(CFLAGS) $(CXXFLAGS) $(CPPFLAGS) -o $@ $<
%.o: $(PROJECT_ROOT)%.c
$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<
clean:
rm -fr P3_MakeDemo $(OBJS)
运行make all
时,将看到类似的输出
make all
gcc -c -g -o P3_MakeDemo.o /project/P3_MakeDemo/P3_MakeDemo.c
gcc -c -g -o ma.o /project/P3_MakeDemo/ma.c
g++ -o P3_MakeDemo P3_MakeDemo.o ma.o
这使您可以在项目中添加任意数量的.c或.cpp项目,而无需在Makefile脚本中进行太多更改
如果您不希望使用CPP / C ++,则该文件的大小甚至可以减少行数,也可以删除调试标志,这将再次减少行数