Label Cloud

2009年11月20日

使用Perl script 執行makefile的錯誤

今天在寫perl要在Linux下make出新的driver時,發現一個問題。

我們的Makefile的程式:

obj-m += Andes-Ice-Driver.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

在手動執行make時都是正常的,但是我寫了一個Perl 的Script make.pl
#!/usr/bin/perl
chdir "/home/users/josesun/driver";
print `make`;
在make時就會發生錯誤
scripts/Makefile.build:13: /home/users/josesun/Makefile: No such file or directory
make[2]: *** No rule to make target `/home/users/josesun/Makefile'. Stop.
make[1]: *** [_module_/home/users/josesun/] Error 2
make: *** [all] Error 2
後來發現原來$(PWD)這個變數會一直記錄原始的目錄/home/users/josesun,但一跳到/home/users/josesun/driver開始make時,雖然我已經在perl內指定要跳到/home/users/josesun/driver了,但系統卻還保留原本的變數值/home/users/josesun/,以致會發生錯誤。

後來找了一個小時,才發現這是個只發生在sript執行makefile時才會出現的錯誤,因為大部份的makefile都設計成手動執行,因此手動執行時並不會發生錯誤。

後來修改了Makefile的程式,就能使用script正確make出driver、也能使用手動來makefile了。

obj-m += Andes-Ice-Driver.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) clean

相關文章 :

0 意見:

張貼意見