文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>Make 及 Makefile 相关zz

Make 及 Makefile 相关zz

时间:2010-11-16  来源:decaijiang

  • 在线文档:
    1. GNU "make"
      http://www.gnu.org/software/make/manual/make.html
    2. 跟我一起写Makefile
      http://www.chinaunix.net/jh/23/408225.html
  • make
    1. 强制重新编译: make -B
    2. xxx
  • Makefile
    1. 指定SHELL 变量
      指明解析Makefile的shell, 在Linux下一般为/bin/sh(默认设置), Windows下为cmd.exe. 如果不指定, Makefile可能不会正常工作。 比如在Windows下, 如果不指定SHELL=cmd.exe, 会出现错误:
            'CreateProcess( "" .. blah, blah) failed'
    2. Shell Command
      Makefile中可以使用SHELL语法,但有一些限制
      • SHELL语句只能以单行方式存在
      • SHELL 只能用在命令中(即依赖关系中以TAB开始的代码行中)
      • SHELL中定义的变量需要用$$引用,但SHELL语句中引用 Makefile的变量,只需要用$
      • SHELL指令之间用用分号(';')分隔
      • SHELL语句中不能用 Makefile的函数(如dir, notdir, basename 等),这些函数不能返回正确的结果,需要用相应的Shell命令代替。比如下面的的函数是错误的
        define GET_NAME
            for i in dir1/file1 /path/to/dir2/file2; do R=$(dir "$$i") && echo $$R; done
            for i in dir1/file1 /path/to/dir2/file2; do R=$(basename "$$i") && echo $$R; done
        endef
        应该替换成
        define GET_NAME
        define GET_NAME
            for i in dir1/file1 /path/to/dir2/file2; do R=`dirname "$$i"` && echo $$R; done
            for i in dir1/file1 /path/to/dir2/file2; do R=`basename "$$i"` && echo $$R; done
        endef
      eg:
      define BUILD
        for i in ${1}; do \
           echo $${i}; \
           $(GCC) -c ${{i}}; \
        done
      endef

      define CREATE_PATH
          for d in  `echo $1 | sed 's/\//\n/g'`; do \
              if [ -n $d ]; then \ 
                  if [ -z $${tmpPath} ]; then\
                      tmpPath=$$d; \
                  else \
                      tmpPath=$$tmpPath/$$d; \
                  fi; \                  
                  if [ ! -d $$tmpPath ]; then \
                       mkdir $$tmpPath             fi \
              fi \
          done
      endef


      target:
          $(call CREATE_PATH, /tmp/local/user)
          $(call BUILD, $(FILES))
    3. Makefile 中自动产生依赖关系文件
      depeng:
          @for f in $(SRCS); do\
              str=`gcc $(INCS) $(DEFS) -MM $${f}` ;\
              echo "$(OUTDIR)/$${str}" >> .depend; \
          done;

      -include .depend

      注意,在代码行
          echo "$(OUTDIR)/$${str}" >> .depend;
      中,一定要加双引号,否则会产生不正确的依赖文件.depend
    4. 错误信息重定向
      SHELL的错误信息重定向用 2&>, 而Makefile中只需用2>
      eg:
          FILES = $(shell ls $(MY_PATH) 2>/dev/null)
    5. 命令中不能有Makefile语法,但可以用SHELL语法
      eg:
      • 正确用法
        target1:
        ifeq ($(VAR), "y")
            gcc xxxxxxxxxxxxxx
        endif

        target2:
            if [ "$(VAR)" = "y" ]; \
            then \
               gcc xxxxxxxxxxxxx;
            fi
      • 错误用法
        target3:
            ifeq ("$(VAR)", "y")
               gcc xxxxxxxxxxx
            endif
    6. xxx
  • xxx
相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载