继续《qmake 乱乱乱谈(三) 》,本文主题:低调的 TEMPLATE = subdirs
非常非常常用的一个东西,可是manual中却介绍的很少,太低调了。在编写包含多可执行文件、库、插件 的程序时,一直不敢相信subdirs的能力,以至于曾一度想转到cmake之下。
Manual
Manual 中对 TEMPLATE = subdirs 的介绍实在简单:
-
Creates a Makefile containing rules for the subdirectories specified using the SUBDIRS variable. Each subdirectory must contain its own project file.
相当长一段时间,自己都是按Manual中的说法进行使用的:
- 工程的一般结构
|-- project.pro |-- app\ | `-- app.pro |-- lib1\ | `-- lib1.pro |-- lib2\ | `-- lib2.pro `-- tests\ |-- tests.pro |-- test1\ | `-- test1.pro |-- test2\ `-- test2.pro
- project.pro 的内容
TEMPLATE = subdirs SUBDIRS = lib1 lib2 app tests
- tests/tests.pro 的内容
TEMPLATE = subdirs SUBDIRS = test1 test2
一切看起来都很自然。subdirs,顾名思义,SUBDIRS 中指定的就是一个个的子目录呗。真是如此么?
.file
SUBDIRS 中指定的是一个个的子目录来理解,很快有个问题:
每个子目录下的工程文件必须和子目录同名!可是,万一不同名又如何解决呢??
- 比如:
|-- project.pro |-- app\ | `-- hello.pro |-- lib1\ | `-- libwidget.pro `-- lib2\ `-- libtools.pro
恩,这时就该 .file 出场了!
- project.pro 内容
TEMPLATE = subdirs SUBDIRS = lib1 lib2 app app.file = hello.pro lib1.file = lib1/libwidget.pro lib2.file = lib2/libtools.pro
恩,直到这时,SUBDIRS 中指定的还都是目录名,仍然没什么问题。可是,在看到.file不久,就发现了.subdir
.subdir
这个东西实在不好理解了,比如,下面的结构:
|-- project.pro |-- app\ | `-- app.pro `-- lib1\ `-- lib1.pro
-
project.pro 内容可以写作如下:
TEMPLATE = subdirs SUBDIRS = my_lib1 my_app my_lib1.subdir = lib1 my_app.subdir = app
这样一来,SUBDIRS 后面的东西,完全不是目录名了,而是任意一个名字!
.file 与 .subdir
有了上面两个之后,容易想到的就是:?
- 取一个名字,加入到 SUBDIRS
- 通过.subdir 给它指定子目录名字
- 通过.file 给它指定pro工程的名字
比如:
|-- project.pro |-- app\ | `-- hello.pro `-- lib1\ `-- lib1.pro
project.pro是否可以这么写呢?
TEMPLATE = subdirs SUBDIRS = lib1 my_app my_app.subdir = app my_app.file = app/hello.pro
可是,这么却不会工作。不能同时指定 .subdir 和 .file!那怎么办呢?
- 去掉 .file? 显然不行,它需要 app 目录下有 app.pro 文件
- 去掉 .subdir呢?试试看
TEMPLATE = subdirs SUBDIRS = lib1 my_app my_app.file = app/hello.pro
啊?还真可以了!
怎么回事?现在不光 SUBDIRS 后面指定的不是目录,后面也不需要 .subdir 来指定目录了。
看来,SUBDIRS是严重的名不副实了!
故事还没完
还是这个例子:
|-- project.pro |-- app\ | `-- hello.pro `-- lib1\ `-- lib1.pro
- project.pro 可以直接写作
TEMPLATE = subdirs SUBDIRS = lib1 app/hello.pro
我们可以直接指定pro工程名!
继续?
恩,不需要每个目录都用一个pro文件
|-- project.pro |-- app\ | `-- app.pro |-- lib1\ | `-- lib1.pro |-- lib2\ | `-- lib2.pro `-- tests\ |-- test1\ | `-- test1.pro |-- test2\ `-- test2.pro
- project.pro 文件内容
TEMPLATE = subdirs SUBDIRS = app lib1 lib2 tests/test1 tests/test2/test2.pro
恩,这样似乎又回归简单了。只需简单指定目录或pro文件路径即可。
少点什么?
恩,下面5个之中,我们只提到了2个(最后2个本人没用到过,也不清楚具体用途)
- subdir
- file
- depends
- makefile
- target
不过中间的depends还是很有用的
TEMPLATE = subdirs SUBDIRS = app lib1 lib2 app.depends = lib1 lib2
作者:dbzhang800