makefile传参数到C++中
www.diybl.com 时间 : 2011-08-09 作者:网络 编辑:hawk 点击: 18 [ 评论 ]
从makefile中传参数到C++中的最初需求是为了能够在程序-v查看的时候显示程序的编译时间。最后通过__DATE__和__TIME__宏解决了这个问题。
我需要从makefile传到C++中的参数是代码在svn上的版本号,为了在程序-v上能够看到本程序对应的版本号。通过gcc的-D参数定义一个宏来传递到C++中。
比如:-DDEBUG 相当于在代码里面加了 #define DEBUG 1, -DDEBUG=2相当于在代码里面定义了#define DEBUG 2。
当然如果想传字符串也是可以,只是稍微麻烦点:
-DMYDIR=\”thisismydir\” 需要这样,不然传到C++里面后的字符串是没有加引号的,会当作变量,但是又没有定义,所以编译会报错。
下面看看具体内容,makefile中:
Temp=$(shell svn up)
Svnver=`svn info | grep Revision | cut –d “ “ –f 2`
Svnver=`svn info | grep URL | cut –d “ “ –f 2`
CPPFLAG= -g –Wall –DSVNVER=$(svnver) –DSVNDIR=”\””${svndir}”\””
然后在C++中处理-v的函数里面加上:
#ifdef SVNVER
Printf(“svn version:%d\n”, SVNVER);
#endif
#ifdef SVNDIR
Printf(“svn source dir:%s\n”, SVNDIR);
#endif
大功告成!
make 的 -f 参数以及在 Makefile 文件间传递参数
make 的 -f 参数后接文件名(可含路径),由该文件名指定的文件作为 Makefile 文件,并且这个文件名后可接参数,该参数可作为该文件中的某个变量。某个目录下文件:
引用[beyes@SLinux temp]$ ll
total 8
-rw-rw-r--. 1 beyes beyes 103 Apr 18 11:00 Makefile
drwxrwxr-x. 2 beyes beyes 4096 Apr 18 11:01 scripts
[beyes@SLinux temp]$ ll scripts/
total 8
-rw-rw-r--. 1 beyes beyes 74 Apr 18 10:49 Kbuild.include
-rw-rw-r--. 1 beyes beyes 37 Apr 18 10:49 Makefile.building
其中 Makefile 文件的内容为:
引用include ./scripts/Kbuild.include
all:
@make $(build)="pass init for another Makefile\'s parameter"
上面,$(build) 变量在 scripts/Kbuild.include 文件中有定义,所以这里要在第 1 行将 Kbuild.include 包含进来。Kbuild.include 中的内容为:
引用build := -f ./scripts/Makefile.building obj
所以,我们在执行 make 时,实际上就是展开以下命令:
引用make -f ./scripts/Makefile.building obj="pass init for another Makefile\'s parameter"
上面 obj= 后面的双引号中的 's 前要加一反斜杠表示字符转义,否则会在 make 时发生语法错误。这里,我们指定 scripts/Makefile.building 作为另一个 Makefile 文件,并且要向它传递进一个 obj 参数,这个参数的内容就是双引号里的字符串。
Makefile.building 文件内容如下所示:
引用src := $(obj)
output:
@echo $(src)
上面,我们将 $(obj) 的内容赋给 src 这个变量,并在最后显示这个变量。
现在 make 一下,看输出内容:
引用[beyes@SLinux temp]$ make
make[1]: Entering directory `/home/beyes/Makefile/temp'
pass init for another Makefile's parameter
make[1]: Leaving directory `/home/beyes/Makefile/temp'
正确输出。
总结一下 make 的过程:
在主 Makefile 文件中,因为仅有一个目标 all,所以就只要简单执行 make 命令即可,它通过 -f 参数指定了要 make 另外一个 Makefile 文件(Makefile.building),并且要向那个文件传递进一个 obj 变量参数。这时,我们的 make 流程转入到 Makefile.building 中,因为该文件中亦只有一个目标,所以默认下也就执行该目标下的命令,即打印出传递进来的参数内容。
在 Linux 内核的 Makefile 中,在研究 bzImage 的生成过程,也会看到如上所经历的过程。
另外,还可以通过 export 关键字将参数导出到当前工作的环境变量中,这样子 Makefile 也能使用这些变量。但是如果子 Makefile 中含有同名变量的话,那么就以子 Makefile 中的变量为准,这和 C 语言中的局部变量是同一个道理。