含泪写了个把.o文件放入指定目录的Makefile

不想在vscode的Explorer里看见*.o,除了File-Preference-Settings, Search settings (File.Exclude),还可以改Makefile,把*.o放在某个目录(如o)下嘛。

一堆.d文件不如一个.dep文件高档。

array.o: array.c awk.h config.h gettext.h mbsupport.h protos.h regex.h \
 dfa.h gawkapi.h
awkgram.o: awkgram.c awk.h config.h gettext.h mbsupport.h protos.h \
 regex.h dfa.h gawkapi.h
...

这种带折行的,咋用sed把array.o换成o/array.o,dfa.h那行不动?sed替换所有行要用到1,$吧[%好像不好使],Makefile里要写成\$$,再往下更费劲。

终于折腾出不用sed,人人能看懂会修改的版本啦:

  • vpath使make到o/下去找.o文件
  • a.exe依赖于array.o等,array.o依赖于array.c awk.h等等,make is happy
TARGET = a.exe
SRCEXT = c
OBJDIR = o

CC = gcc
CFLAGS = -g # -Os

SRCS = $(wildcard *.$(SRCEXT))
OBJS = $(patsubst %.$(SRCEXT),%.o, $(SRCS))
# $(patsubst pattern, replacement, text) pattern substitute
#, %.o ,会产生空格

vpath %.o $(OBJDIR)

$(TARGET) : $(OBJS)
	cd $(OBJDIR); $(CC) -o ../$@ $(OBJS)

.$(SRCEXT).o: # $< 第一个
	$(CC) $(CFLAGS) -c -o $(OBJDIR)/$@ $<

clean: # -忽略命令的exit值
	-cd $(OBJDIR); rm -f $(OBJS)

dep:
	$(CC) $(CFLAGS) -MM $(SRCS) >.dep

wtf: # What the fuck (什么鬼) 用@打头则不echo要执行的命令
	@echo SRCS=$(SRCS)
	@echo OBJS=$(OBJS)

-include .dep # -使得当.dep不存在时不报错

# https://www.cnblogs.com/xin-lover/p/8934158.html
# https://www.cnblogs.com/haoxing990/p/4629454.html
# https://www.cnblogs.com/guolongnv/articles/8728353.html
# https://www.cnblogs.com/geeker/p/4455538.html
# https://blog.csdn.net/qinglongqishi1/article/details/80419332
# https://programmer.group/gcc-m-mm-mmd-mf-mt.html

gcc -g  -c -o o/array.o array.c
gcc -g  -c -o o/awkgram.o awkgram.c
gcc -g  -c -o o/builtin.o builtin.c
gcc -g  -c -o o/cint_array.o cint_array.c
gcc -g  -c -o o/dfa.o dfa.c
gcc -g  -c -o o/eval.o eval.c
gcc -g  -c -o o/field.o field.c
gcc -g  -c -o o/gawkmisc.o gawkmisc.c
gcc -g  -c -o o/int_array.o int_array.c
gcc -g  -c -o o/main.o main.c
gcc -g  -c -o o/node.o node.c
gcc -g  -c -o o/re.o re.c
gcc -g  -c -o o/regex.o regex.c
gcc -g  -c -o o/str_array.o str_array.c
gcc -g  -c -o o/symbol.o symbol.c
cd o; gcc -o ../a.exe array.o awkgram.o builtin.o cint_array.o dfa.o eval.o field.o gawkmisc.o int_array.o main.o node.o re.o regex.o str_array.o symbol.o

Commands in a Makefile- Microsoft Learn | make Command - IBM Documentation

Don't stop make'ing if a command fails, but check exit status

$ cat Makefile
default:
        @-rm non
        @-rm exist
$ make
rm: cannot remove 'non': No such file or directory
make: [Makefile:2: default] Error 1 (ignored)
rm: cannot remove 'exist': No such file or directory
make: [Makefile:3: default] Error 1 (ignored)
其实@和-都起作用了。没有-f的rm输出错误信息,make不管。rm出错,make也不管,继续执行。
$ man make
-s, --silent, --quiet
--trace
-i, --ignore-errors
...
posted @ 2022-12-26 15:42  Fun_with_Words  阅读(309)  评论(0编辑  收藏  举报









 张牌。