2012-03-05 131 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