Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2028438
  • 博文数量: 413
  • 博客积分: 10926
  • 博客等级: 上将
  • 技术积分: 3862
  • 用 户 组: 普通用户
  • 注册时间: 2006-01-09 18:14
文章分类

全部博文(413)

文章存档

2015年(5)

2014年(1)

2013年(5)

2012年(6)

2011年(138)

2010年(85)

2009年(42)

2008年(46)

2007年(26)

2006年(59)

分类: LINUX

2006-04-28 10:14:12

  1. 在线文档:
    1. GNU "make"

    2. 跟我一起写Makefile

  2. make
    1. 强制重新编译: make -B
    2. xxx
  3. 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
  4. Windows下的Makefile
    1. if-else 语句
      DATA=data

      define func1
          if $(DATA) == data echo "data is a"
      endef

      define func2
          if $(DATA) == data \
          ( \
              echo "data is a" \
          ) \
          else \
          ( \
              echo "data is not a" \
          ) \
      endef
    2. xxx
  5. xxx
阅读(1779) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~