[guest@test guest]# vi makefile
main: main.o haha.o sin_value.o cos_value.o
gcc -o main main.o haha.o sin_value.o cos_value.o -lm
clean:
rm -f main main.o haha.o sin_value.o cos_value.o
#%* clean 冒號之後是空白。目標項目永遠會被認為過期,所以它的法則永遠會被執行。*)
[guest@test guest]# make clean rm -f main main.o haha.o sin_value.o cos_value.o
[guest@test guest]# make clean main rm -f main main.o haha.o sin_value.o cos_value.o cc -c -o main.o main.c cc -c -o haha.o haha.c cc -c -o sin_value.o sin_value.c cc -c -o cos_value.o cos_value.c gcc -o main main.o haha.o sin_value.o cos_value.o -lm
all: myapp
# Which compiler
CC = gcc
# Where to install
INSTDIR = /usr/local/bin
# Where are include files kept
INCLUDE = .
# Options for development
CFLAGS = -g -Wall -ansi
# Options for release
# CFLAGS = -O -Wall -ansi
myapp: main.o 2.o 3.o
$(CC) -o myapp main.o 2.o 3.o
main.o: main.c a.h
$(CC) -I$(INCLUDE) $(CFLAGS) -c main.c
2.o: 2.c a.h b.h
$(CC) -I$(INCLUDE) $(CFLAGS) -c 2.c
3.o: 3.c b.h c.h
$(CC) -I$(INCLUDE) $(CFLAGS) -c 3.c
clean:
-rm main.o 2.o 3.o
install: myapp
# 每個命令都會啟動一個新的 shell,所以必須加上反斜線(\),讓所有 script 命令在同一行,且在同一個 shell 中執行。
@if [ -d $(INSTDIR) ]; \
then \
cp myapp $(INSTDIR);\
chmod a+x $(INSTDIR)/myapp;\
chmod og-w $(INSTDIR)/myapp;\
echo "Installed in $(INSTDIR)";\
else \
echo "Sorry, $(INSTDIR) does not exist";\
fi
&&:前個命令成功,才執行下個命令
@if [ -d $(INSTDIR) ]; \ then \ cp myapp $(INSTDIR) &&\ chmod a+x $(INSTDIR)/myapp && \ chmod og-w $(INSTDIR/myapp && \ echo "Installed in $(INSTDIR)" ;\ else \ echo "Sorry, $(INSTDIR) does not exist" ; false ; \ fi
$ rm *.o myapp $ make -f Makefile3 gcc -I. -g -Wall -ansi -c main.c gcc -I. -g -Wall -ansi -c 2.c gcc -I. -g -Wall -ansi -c 3.c gcc -o myapp main.o 2.o 3.o $ make -f Makefile3 make: Nothing to be done for 'all'. $ rm myapp $ make -f Makefile3 install gcc -o myapp main.o 2.o 3.o Installed in /usr/local/bin $ make -f Makefile3 clean rm main.o 2.o 3.o $
install: myapp
@if [ -d $(INSTDIR) ]; \
then \
cp myapp $(INSTDIR);\
chmod a+x $(INSTDIR)/myapp;\
chmod og-w $(INSTDIR)/myapp;\
echo "Installed in $(INSTDIR)";\
else \
echo "Sorry, $(INSTDIR) does not exist";\
fi
\),讓所有 script 命令在同一行,且在同一個 shell 中執行。
&& \ 代表意義為何?
chmod a+x $(INSTDIR)/myapp && \ chmod og-w $(INSTDIR/myapp && \
&& 表示前個命令成功,才執行下個命令,\ 讓 script 命令在同一行,且在同一個 shell 中執行。
2017-06-14