makefile传参到src和互传 & review

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 语言中的局部变量是同一个道理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值