2009-09-20 18 views
2

這是在makefile中成爲root的好方法嗎?這是在makefile中成爲root的好方法嗎?

 
SHELL = /bin/sh 
INSTDIR = /usr/bin/ 
OBJS = main.o file.o gen.o stat.o 

program1: $(OBJS) 
     gcc -o program1 $(OBJS) 

main.o: main.c file.h gen.h stat.h 
     gcc -c main.c 

file.o: file.c file.h 
     gcc -c file.c 

gen.o: gen.c gen.h 
     gcc -c gen.c 

stat.o: stat.c stat.h 
     gcc -c stat.c 

clean: 
     rm -f $(OBJS) program1 

install: 
     @if [ -f program1 ]; then \ 
       if [ $$(id -u) -eq 0 ]; then \ 
         cp program1 $(INSTDIR) && \ 
         echo "Installed in $(INSTDIR)" ; \ 
       else \ 
         (sudo cp program1 $(INSTDIR) 2> /dev/null && \ 
         echo "Installed in $(INSTDIR)") || \ 
         (echo 'No sudo on this machine, trying su.' \ 
         && su -c "cp program1 $(INSTDIR)" && \ 
         echo "Installed in $(INSTDIR)") ; \ 
       fi ; \ 
     else \ 
       echo "There was no program to install, run make." ; \ 
     fi 

uninstall: 
     @if [ -f $(INSTDIR)program1 ]; then \ 
       if [ $$(id -u) -eq 0 ]; then \ 
         rm $(INSTDIR)program1 && \ 
         echo "Uninstalled in $(INSTDIR)" ; \ 
       else \ 
         (sudo rm $(INSTDIR)program1 2> /dev/null && \ 
         echo "Uninstalled in $(INSTDIR)") || \ 
         (echo 'No sudo on this machine, trying su.' \ 
         && su -c "rm $(INSTDIR)program1" && \ 
         echo "Uninstalled in $(INSTDIR)") ; \ 
       fi ; \ 
     else \ 
       echo "There was no program to remove." ; \ 
     fi 
+1

如果你堅持寫自己的規則,請使用DESTDIR而不是INSTDIR,因爲它更標準。 – 2009-09-20 17:44:26

回答

19

不!

首先,一般用戶做sudo make install。其次,當程序安裝到自定義目錄中時,您並沒有考慮過這種情況,該目錄並不總是需要root權限。例如,打包工具使用此功能,並且它們沒有root權限。

+2

不是「不需要root權限」,如果安裝程序擁有它,它就是*有害的*。通常的用戶可能無法編輯和/或訪問安裝的文件。 – 2009-09-30 10:58:56

相關問題