#1、以下是海思3518E的ONVIF代码中简单的makefile分析
- CROSS =/opt/hisi-linux-nptl/arm-hisiv100-linux/bin/arm-hisiv100-linux-uclibcgnueabi-
- #CROSS =
- SRCDIRS = ./ \
- ./include\
- ./src\
- ./gsoap\
- ASFLAGS =
- CFLAGS = -Wall
- CXXFLAGS = -O2
- LDFLAGS =
- ARFLAGS =
- OCFLAGS =
- ODFLAGS =
- INCDIRS = -I../include -I../fcCommon -I./gsoap
- LIBDIRS = -L../../../lib/ ../../../lib/libfcMsgClient.a ../../../lib/libfcCommon.a ../../../lib/common/libssl.so.1.0.0 ../../../lib/common/libcrypto.so.1.0.0
- LIBS = -lpthread -lm
- #
- ### You shouldn't need to change anything below this point.
- #
- ##
- #AS = $(CROSS)as
- CC = $(CROSS)gcc
- CXX = $(CROSS)g++
- LD = $(CROSS)gcc
- AR = $(CROSS)ar
- OC = $(CROSS)objcopy
- OD = $(CROSS)objdump
- ST = $(CROSS)strip
- RM = -rm -fr
- #notdir 会取出当前目录的目录名
- NAME := $(notdir $(CURDIR))
- #foreach 递归取出所有的文件
- SFILES := $(foreach dir,$(SRCDIRS),$(wildcard $(dir)/*.s))
- CFILES := $(foreach dir,$(SRCDIRS),$(wildcard $(dir)/*.c))
- CPPFILES := $(foreach dir,$(SRCDIRS),$(wildcard $(dir)/*.cpp))
- RMFILES := $(foreach dir,$(SRCDIRS),$(wildcard $(dir)/*~))
- RMFILEO := $(foreach dir,$(SRCDIRS),$(wildcard $(dir)/*.o))
- #$(SFILES:.s=.o) 将所有的.s文件转换成.o文件
- OBJS := $(SFILES:.s=.o) $(CFILES:.c=.o) $(CPPFILES:.cpp=.o)
- DEPS := $(OBJS:.o=.d)
- VPATH := $(SRCDIRS)
- #建一个虚拟的目标
- .PHONY: all rebuild clean
- all:
- @$(MAKE) $(NAME)
- rebuild:
- @$(MAKE) clean
- @$(MAKE) $(NAME)
- $(NAME): $(OBJS)
- @echo test linking ...
- # $(LD) $(LDFLAGS) $(LIBDIRS) -o $@ $^ $(LIBS)
- # $(LD) $(LDFLAGS) -o $@ $^ $(LIBS) $(LIBDIRS)
- $(CXX) $(LDFLAGS) -o fcOnvif -DWITH_PURE_VIRTUAL $^ $(LIBS) $(LIBDIRS)
- $(ST) -g --strip-unneeded fcOnvif
- cp fcOnvif /mnt/nfs
- # cp armok /tftpboot/
- #把当前所有依赖的.s文件编译成.o文件
- %.o: %.s
- @echo assembling $< ...
- $(AS) $(ASFLAGS) $(INCDIRS) $< -o $@
- %.o: %.c
- @echo test compiling $< ...
- $(CC) $(CFLAGS) $(INCDIRS) -c $< -o $@
- %.o: %.cpp
- @echo compiling $< ...
- $(CXX) -DWITH_PURE_VIRTUAL $(CXXFLAGS) $(INCDIRS) -c $< -o $@
- %.d: %.c
- @$(CC) $(CFLAGS) $(INCDIRS) -MM $^ -o $@.tmp
- @sed 's,$(basename $(notdir $@)).o[ :]*,$(@:.d=.o) $@ : ,g' $@.tmp > $@
- @$(RM) $@.tmp
- %.d: %.cpp
- @$(CXX) $(CXXFLAGS) $(INCDIRS) -MM $^ -o $@.tmp
- @sed 's,$(basename $(notdir $@)).o[ :]*,$(@:.d=.o) $@ : ,g' $@.tmp > $@
- @$(RM) $@.tmp
- ifeq (mach/mach,)
- -include $(DEPS)
- endif
- clean:
- @$(RM) $(OBJS) $(DEPS) $(NAME) $(RMFILES) $(RMFILEO)
- @echo clean completed
$@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件。
1、wildcard : 扩展通配符
2、notdir : 去除路径
3、patsubst :替换通配符
2、notdir : 去除路径
3、patsubst :替换通配符
- 例子:
- 建立一个测试目录,在测试目录下建立一个名为sub的子目录
- $ mkdir test
- $ cd test
- $ mkdir sub
- 在test下,建立a.c和b.c2个文件,在sub目录下,建立sa.c和sb.c2 个文件
- 建立一个简单的Makefile
- src=$(wildcard *.c ./sub/*.c)
- dir=$(notdir $(src))
- obj=$(patsubst %.c,%.o,$(dir) )
- all:
- @echo $(src)
- @echo $(dir)
- @echo $(obj)
- @echo "end"
- 执行结果分析:
- 第一行输出:
- a.c b.c ./sub/sa.c ./sub/sb.c
- wildcard把 指定目录 ./ 和 ./sub/ 下的所有后缀是c的文件全部展开。
- 第二行输出:
- a.c b.c sa.c sb.c
- notdir把展开的文件去除掉路径信息
- 第三行输出:
- a.o b.o sa.o sb.o
自动化变量$?代表依赖文件列表中被改变过的所有文件。 自动化变量$^代表所有通过目录搜索得到的依赖文件的完整路径名(目录 + 一般文件名)列表。 自动化变量$@代表规则的目标。 自动化变量$<代表规则中通过目录搜索得到的依赖文件列表的第一个依赖文件。 自动化变量$(@D) The directory part of the file name of the target, with the trailing slash removed. If the value of ‘$@’ is dir/foo.o then ‘$(@D)’ is dir. This value is . if ‘$@’ does not contain a slash. (目标文件名的目录部分, 并删除尾部斜杠。 如果'$ @'的值是dir / foo.o 那么'$(@ D)'是dir。 此值为。 如果'$ @'不包含斜杠。) 自动化变量$(@F) The file-within-directory part of the file name of the target. If the value of ‘$@’ is dir/foo.o then ‘$(@F)’ is foo.o. ‘$(@F)’ is equivalent to ‘$(notdir $@)’. (文件内目录部分的文件名为目标。 如果'$ @'的值是dir / foo.o,那么'$(@ F)'是foo.o。 '$(@ F)'相当于'$(notdir $ @)'。) 来源: http://blog.chinaunix.net/uid-20564848-id-217918.html
Linux shell 下循环读取文件test.txt的方式。(3种)
- #!/bin/bash
- printf "*************************************\n"
- echo " cat file whiel read line"
- cat test.txt |while read line
- do
- echo $line;
- done
- printf "*************************************\n"
- echo "while read line <file"
- while read line
- do
- echo $line;
- done <test.txt
- printf "*************************************\n"
- echo "for line in cat test.txt"
- SAVEIFS=$IFS
- IFS=$(echo -en "\n")
- for line in $(cat test.txt)
- do
- echo $line;
- done
- IFS=$SAVEIFS
- 注意:for line in $(cat test.txt) 当文件中有空格或者tab 时,一定要设置一下IFS变量。