2012-03-05 129 views
0

我對Makefiles非常陌生,所以我可能沒有這樣做,這是最好的方式(您的意見非常感謝,因爲我想了解我/我爲什麼不好)。無論如何,這裏是我的問題:守護進程的Makefile

我有一個守護進程,我爲我的程序寫的,我試圖用Makefile安裝它(目標是「安裝」)。 「安裝」目標應該做的是將守護進程二進制文件移動到某個位置,然後將「服務腳本」移動到/etc/init.d/或/etc/rc.d/中(因爲不同的發行版有不同的文件夾...)。這裏是我的makefile至今:

all: 
     @echo "Making Components" 
     @cd Daemon; make 
     @echo "Components Built" 
install: 
     @echo "Installing Components" 
     @mkdir -p /usr/lib/ 
     @cp Daemon/myprog_d /usr/lib/myprog_d 
     [email protected] -d /etc/init.d && cp Scripts/myprog /etc/init.d/ 
     [email protected] -d /etc/rc.d && cp Scripts/myprog /etc/rc.d/ 
     [email protected] ! -d /etc/init.d -a ! -d /etc/rc.d && echo " Warning: Couldn't install script. Manually install Scripts/myprog" 
     @mkdir -p /var/log/ 
     @echo "Installed." 
uninstall: 
     @echo "Uninstalling Components" 
     @./Scripts/myprog stop > /dev/null 
     @rm -f /usr/lib/myprog_d 
     @echo "Uninstall complete" 
clean: 
     @echo "Cleaning Components" 
     @cd Daemon; make clean 
     @echo "Clean complete" 

正如你所看到的,「安裝」目標測試,看看是否存在這兩個目錄,如果他們這樣做,複製腳本放進去(我還沒做它來「卸載」,不用擔心)。

我的第一個問題:這是正確的方法嗎? 「全部」和「乾淨」的目標工作(在「守護進程/」中有另一個生成文件,正如你可以推論的那樣),但是我想知道是否有更簡單的方法來做到這一點。其次,因爲「測試」函數返回非零值,所以我必須在它之前先做「 - 」,這樣錯誤纔會被忽略。不幸的是,這導致「make install」輸出爲:

Installing Components 
make: [install] Error 1 (ignored) 
make: [install] Error 1 (ignored) 
Installed. 

這是非常醜陋的,可能不是很好的做法。在這種情況下我能做些什麼? (我曾經嘗試都 - @和@ - ,但@不會抑制 「忽略」 輸出)

真誠, 克里斯

回答

1

我會做這種方式:

@if [ -d /etc/init.d ]; then cp Scripts/myprog /etc/init.d/ ; fi 
@if [ -d /etc/rc.d ]; then cp Scripts/myprog /etc/rc.d/ ; fi 

而且我有點困惑於你的下一行([email protected] ! -d /etc/init.d -a !...),但你可以用同樣的方法做。

這會處理錯誤消息,但如果要保持makefile的原樣,可以通過運行make -s來禁止它們。

+0

謝謝,多數民衆贊成在!最後一行意味着只是說「找不到移動它的位置」 – Chris 2012-03-05 22:20:45