我正在学习编写 make 文件,但我并不清楚我应该如何设计我的 makefile 层次结构。描述起来并不容易,所以我会准确地发布我现在所拥有的内容,并感谢任何建议。
所以我想问的是
1. Does my common.mk a general practice to contain TOP_DIR variable?
2. How can I make makefile(1) call makefile(2) if l_util objects are missing.
我有这样的文件夹层次结构,我用来学习 C++ 算法:
-learning
- introduction_to_algorithms
- insertion_sort
- insertion_sort.cpp
- makefile(1)
- l_util
- include
- l_util_stlutil.h
- l_util_numberutil.h
- l_util_stlutil.cpp
- l_util_numberutil.cpp
- makefile(2)
- common.mk
其中 insert_sort.cpp 包括 l_util 文件。这是我的制作文件:
common.mk:
1 # This must be the first this in Makefile.common
2 TOP_DIR := $(dir $(lastword $(MAKEFILE_LIST)))
3
4 CC := g++
生成文件(1):
1 include ../../common.mk
2
3 CPP_SRCS := \
4 insertion_sort.cpp \
5
6 LIBS := \
7
8 OBJS := \
9 insertion_sort.o \
10
11 OTHER_OBJS := \
12 $(TOP_DIR)l_util/l_util_stlutil.o \
13 $(TOP_DIR)l_util/l_util_numberutil.o \
14
15 INCLUDE_PATH := \
16 $(TOP_DIR)l_util/include
17
18 TASK := insertion_sort.tsk
19
20 # Tool invocations
21 $(TASK): $(OBJS) $(OTHER_OBJS)
22 $(CC) -o $(TASK) $(OBJS) $(OTHER_OBJS) $(LIBS)
23 @echo 'Finished building target: $@'
24
25 $(OBJS): $(CPP_SRCS)
26 $(CC) -c -Wall -I$(INCLUDE_PATH) $(CPP_SRCS)
27 @echo 'Finished building target: $@'
28
29 # Other Targets
30 .PHONY: clean
31 clean:
32 -$(RM) $(OBJS) $(OTHER_OBJS) $(TASK)
生成文件(2):
1 include ../common.mk
2
3 CPP_SRCS := \
4 l_util_stlutil.cpp \
5 l_util_numberutil.cpp \
6
7 LIBS := \
8
9 OBJS := \
10 l_util_numberutil.o \
11 l_util_stlutil.o \
12
13 $(OBJS): $(CPP_SRCS)
14 $(CC) -c -Wall $(CPP_SRCS)
15 @echo 'Finished building target: $@'
16
17 # Other Targets
18 .PHONY: clean
19 clean:
20 -$(RM) $(OBJS)
当我在插入排序文件夹中运行 make 时,我得到:
1 g++ -c -Wall -I../../l_util/include insertion_sort.cpp
2 Finished building target: insertion_sort.o
3 c++ -c -o ../../l_util/l_util_stlutil.o ../../l_util/l_util_stlutil.cpp
4 c++ -c -o ../../l_util/l_util_numberutil.o ../../l_util/l_util_numberutil.cpp
5 g++ -o insertion_sort.tsk insertion_sort.o ../../l_util/l_util_stlutil.o
../../l_util/l_util_numberutil.o
6 Finished building target: insertion_sort.tsk
我不认为第 3 行和第 4 行是由 makefile(2) 生成的,它似乎是在没有调用 makefile(2) 的情况下自动调用的。