lnlidawei

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

[c/cpp]  make学习——特殊变量(自动变量:$@等)

 

 

 

 

一、环境

[wit@ubuntu:make]$ 
[wit@ubuntu:make]$ 
[wit@ubuntu:make]$ uname -snr
Linux ubuntu 6.14.0-22-generic
[wit@ubuntu:make]$ 
[wit@ubuntu:make]$ 
[wit@ubuntu:make]$ make -v
GNU Make 4.4.1
Built for x86_64-pc-linux-gnu
Copyright (C) 1988-2023 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
[wit@ubuntu:make]$ 
[wit@ubuntu:make]$ 

 

 

二、脚本

[wit@ubuntu:make]$ cat  makefile 
# makefile to use:
#       1.      make create
#                       create file:    da.x db.x dc.x dd.x path1
#       2.      make clean
#                       clean file:     rm -rf t1.o ./path1/t2.o
#       3.      make remove
#                       delete file:    rm -rf da.x db.x dc.x dd.x path1/t2.o


#
# name:
#       t* = target file(t1.o/t2.o)
#       d* = dependent file(da.x/db.x/dc.x)


t1.o: da.x db.x dc.x dd.x ./path1/t2.o
        @echo
        @echo
        @echo  "\t[\$$%]:=" $%
        @echo  "\t[\$$*]:=" $*
        @echo  "\t[\$$@]:=" $@
        @echo  "\t[\$$+]:=" $+
        @echo  "\t[\$$<]:=" $<
        @echo  "\t[\$$?]:=" $?
        @echo  "\t[\$$|]:=" $|
        @echo  "\t[\$$^]:=" $^
        touch  t1.o
        @echo
        @echo


./path1/t2.o: da.x
        @echo
        @echo  "\t[\$$(@D)]:=" $(@D)
        touch  ./path1/t2.o
        @echo




.PHONY: clean create remove help


clean:
        rm -rf t1.o ./path1/t2.o

create:
        mkdir path1
        touch da.x db.x dc.x dd.x

remove:
        rm -rf path1
        rm -rf da.x db.x dc.x dd.x t1.o

help:
        @echo " makefile to use: "
        @echo " 1.      make create "
        @echo "                 create file:    da.x db.x dc.x dd.x path1 "
        @echo " 2.      make clean "
        @echo "                 clean file:     rm -rf t1.o ./path1/t2.o "
        @echo " 3.      make remove "
        @echo "                 delete file:    rm -rf da.x db.x dc.x dd.x path1/t2.o"






[wit@ubuntu:make]$ 

 

 

三、实例

[wit@ubuntu:make]$ ls
makefile
[wit@ubuntu:make]$ 
[wit@ubuntu:make]$ 
[wit@ubuntu:make]$ make help
 makefile to use: 
        1.      make create 
                        create file:    da.x db.x dc.x dd.x path1 
        2.      make clean 
                        clean file:     rm -rf t1.o ./path1/t2.o 
        3.      make remove 
                        delete file:    rm -rf da.x db.x dc.x dd.x path1/t2.o
[wit@ubuntu:make]$ 
[wit@ubuntu:make]$ 
[wit@ubuntu:make]$ make create && make 
mkdir path1
touch da.x db.x dc.x dd.x

        [$(@D)]:= path1
touch  ./path1/t2.o



        [$%]:=
        [$*]:= t1
        [$@]:= t1.o
        [$+]:= da.x db.x dc.x dd.x path1/t2.o
        [$<]:= da.x
        [$?]:= da.x db.x dc.x dd.x path1/t2.o
        [$|]:=
        [$^]:= da.x db.x dc.x dd.x path1/t2.o
touch  t1.o


[wit@ubuntu:make]$ 
[wit@ubuntu:make]$ 
[wit@ubuntu:make]$ ls
da.x  db.x  dc.x  dd.x  makefile  path1  t1.o
[wit@ubuntu:make]$ 
[wit@ubuntu:make]$ 
[wit@ubuntu:make]$ make clean && make
rm -rf t1.o ./path1/t2.o

        [$(@D)]:= path1
touch  ./path1/t2.o



        [$%]:=
        [$*]:= t1
        [$@]:= t1.o
        [$+]:= da.x db.x dc.x dd.x path1/t2.o
        [$<]:= da.x
        [$?]:= da.x db.x dc.x dd.x path1/t2.o
        [$|]:=
        [$^]:= da.x db.x dc.x dd.x path1/t2.o
touch  t1.o


[wit@ubuntu:make]$ 
[wit@ubuntu:make]$ 
[wit@ubuntu:make]$ ls
da.x  db.x  dc.x  dd.x  makefile  path1  t1.o
[wit@ubuntu:make]$ 
[wit@ubuntu:make]$ 
[wit@ubuntu:make]$ make remove
rm -rf path1
rm -rf da.x db.x dc.x dd.x t1.o
[wit@ubuntu:make]$ 
[wit@ubuntu:make]$ 
[wit@ubuntu:make]$ ls
makefile
[wit@ubuntu:make]$ 
[wit@ubuntu:make]$ 
[wit@ubuntu:make]$ cat  makefile
# makefile to use:
#       1.      make create
#                       create file:    da.x db.x dc.x dd.x path1
#       2.      make clean
#                       clean file:     rm -rf t1.o ./path1/t2.o
#       3.      make remove
#                       delete file:    rm -rf da.x db.x dc.x dd.x path1/t2.o


#
# name:
#       t* = target file(t1.o/t2.o)
#       d* = dependent file(da.x/db.x/dc.x)


t1.o: da.x db.x dc.x dd.x ./path1/t2.o
        @echo
        @echo
        @echo  "\t[\$$%]:=" $%
        @echo  "\t[\$$*]:=" $*
        @echo  "\t[\$$@]:=" $@
        @echo  "\t[\$$+]:=" $+
        @echo  "\t[\$$<]:=" $<
        @echo  "\t[\$$?]:=" $?
        @echo  "\t[\$$|]:=" $|
        @echo  "\t[\$$^]:=" $^
        touch  t1.o
        @echo
        @echo


./path1/t2.o: da.x
        @echo
        @echo  "\t[\$$(@D)]:=" $(@D)
        touch  ./path1/t2.o
        @echo




.PHONY: clean create remove help


clean:
        rm -rf t1.o ./path1/t2.o

create:
        mkdir path1
        touch da.x db.x dc.x dd.x

remove:
        rm -rf path1
        rm -rf da.x db.x dc.x dd.x t1.o

help:
        @echo " makefile to use: "
        @echo " 1.      make create "
        @echo "                 create file:    da.x db.x dc.x dd.x path1 "
        @echo " 2.      make clean "
        @echo "                 clean file:     rm -rf t1.o ./path1/t2.o "
        @echo " 3.      make remove "
        @echo "                 delete file:    rm -rf da.x db.x dc.x dd.x path1/t2.o"






[wit@ubuntu:make]$ 
[wit@ubuntu:make]$ 

 

 

四、参考

 

  1.  make.pdf(10.5.3: Automatic Variables)  --  https://www.gnu.org/software/make/manual/make.pdf

 

  .

 

posted on 2025-08-24 19:53  lnlidawei  阅读(7)  评论(0)    收藏  举报