2009/11/20

使用Perl script 執行makefile的錯誤

今天在寫 perl 要在 Linux 下 make 出新的 driver 時,發現一個 $(PWD) 變數的問題。

我們的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

沒有留言:

張貼留言