2

我正在学习编写 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) 的情况下自动调用的。

4

2 回答 2

1

在 makefile1 中添加一些代码: $(OTHER_OBJS): make -C “The absolute dir of your makefile2”

你应该告诉makefile1,你的makefile2在哪里,“make -C”会这样做,然后makefile1调用makefile2。

于 2013-08-21T03:24:02.543 回答
1

您应该使用 GNUmake 并利用它的include功能在整个项目中构建一个单一的依赖层次结构。

在实践中,这是创建能够正确进行增量构建的基于 make 的构建系统的唯一现实方法。这就是他们的方式kbuild,Linux 内核构建系统可以工作。

请参阅Recursive Make Considered Harmful

于 2014-08-08T18:49:56.940 回答