makefile 模板

应用系统的目录结构如下:
  1. ~/bin        可执行程序目录
  2. ~/etc        配置文件目录
  3. ~/inc        头文件目录
  4. ~/lib        函数库文件目录
  5. ~/log        日志文件目录
  6. ~/src        源程序文件目录
  7. ~/src/lib        函数库源程序目录
  8. ~/src/lib/LIB_1        函数库libLIB_1源程序目录
  9. ~/src/APP_A        子系统APP_A源程序目录
  10. ~/src/APP_A/mod_a        子系统APP_A模块mod_a源程序目录
  11. ~/.profile
  12. ~/makefile
复制代码

~/makefile文件内容如下:
  1. all:
  2.         @MakeSubDir() \
  3.         { \
  4.                 for DIR in `ls|grep 'lib';ls|grep -v 'lib'`; do \
  5.                         if [ -d $${DIR} ]; then \
  6.                                 cd $${DIR}; \
  7.                                 MakeSubDir; \
  8.                                 if [ -f makefile -o -f Makefile ]; then \
  9.                                         echo ""; \
  10.                                         pwd; \
  11.                                         make all; \
  12.                                 fi; \
  13.                                 cd ..; \
  14.                         fi; \
  15.                 done; \
  16.         }; \
  17.         MakeSubDir

  18. tar:
  19.         @tar -cf `date +%Y%m%d-%H%M%S`.tar .profile `ls|grep -v '.tar'`
复制代码

~/src/lib/LIB_1/makefile文件内容如下:
  1. ALL:        INFO all

  2. BASEDIR        = $(HOME)
  3. INC        = $(BASEDIR)/inc
  4. LIB        = $(BASEDIR)/lib

  5. PRDNAME        = $(LIB)/libLIB_1

  6. PRODUCT        = $(PRDNAME).a $(PRDNAME).so

  7. OBJS        = LIB_1_f1.o LIB_1_f2.o

  8. AR        = ar <特定平台ar可选参数>;
  9. CC        = cc <特定平台cc可选参数>;

  10. all:        $(PRODUCT)

  11. $(PRDNAME).a:        $(OBJS)
  12.         @echo "  Making $@ ..."
  13.         @$(AR) -r $@ $(OBJS)

  14. $(PRDNAME).so:        $(OBJS)
  15.         @echo "  Making $@ ..."
  16.         @$(CC) -G -o $@ $(OBJS)

  17. .c.o:        *.h $(INC)/*.h
  18.         @echo "  Compiling $< ..."
  19.         @$(CC) -c -I$(INC) $<

  20. INFO:
  21.         @echo "  make all - same with 'make' except this message"
  22.         @echo "  make clear - remove object files"
  23.         @echo "  make clean - remove all object and target files"
  24.         @echo ""

  25. clear:        FORCE
  26.         @rm -f *.o

  27. clean:        FORCE clear
  28.         @rm -f $(PRODUCT)

  29. FORCE:
复制代码

~/src/APP_A/mod_a/makefile文件内容如下:
  1. ALL:        INFO all

  2. BASEDIR        = $(HOME)
  3. INC        = $(BASEDIR)/inc
  4. LIB        = $(BASEDIR)/lib
  5. BIN        = $(BASEDIR)/bin

  6. MODULE        = $(BIN)/APP_A_mod_a
  7. TESTER        = APP_A_mod_a_t
  8. PRODUCT        = $(SERVER) $(TESTER)

  9. CC        = cc <特定平台cc可选参数>;

  10. all:        $(PRODUCT)

  11. $(MODULE):        APP_A_mod_a.o
  12.         @echo "  Making $@ ..."
  13.         @$(CC) $? -o$@ -L$(LIB) -lLIB_1

  14. APP_A_mod_a_t:        APP_A_mod_a_t.o
  15.         @echo "  Making $@ ..."
  16.         @$(CC) $? -o$@ -L$(LIB) -lLIB_1

  17. .c.o:        *.h $(INC)/*.h
  18.         @echo "  Compiling $< ..."
  19.         @$(CC) -c -I$(INC) $<

  20. INFO:
  21.         @echo "  make all - same with 'make' except this message"
  22.         @echo "  make clear - remove object files"
  23.         @echo "  make clean - remove all object and target files"
  24.         @echo ""

  25. clear:        FORCE
  26.         @rm -f *.o

  27. clean:        FORCE clear
  28.         @rm -f $(PRODUCT)

  29. FORCE:
复制代码

使用方法:
1.在主目录下使用'make'命令能够首先建立函数库,然后建立所有目标。
2.在主目录下使用'make tar'命令能够对整个系统进行打包,生成的文件以日期和时间命名。
3.在最下层子目录中直接使用'make'命令会首先给出用法提示,然后建立本目录所有目标。
4.在最下层子目录中使用'make all'命令不出现提示信息,直接建立本目录所有目标。
5.在最下层子目录中使用'make clear'命令可以清除本目录的所有.o文件。
6.在最下层子目录中使用'make clean'命令可以清除本目录的所有.o文件和建立的所有目标。

注:在某些环境下,由于make中调用shell命令的机制,可能不支持递归。
原文地址:https://www.cnblogs.com/yuzaipiaofei/p/4124248.html