Chinaunix

标题: 复杂的makefile高人帮解释下 [打印本页]

作者: fortuneteller    时间: 2010-01-14 09:04
标题: 复杂的makefile高人帮解释下
有一复杂的makefile整个文件较长部分代码如下,有些变量赋值没有写出来。我只了解简单的makefile,请高人帮解释下如下部分.
1.尤其是最后一段%.d: ...(grep ....)
2. ()括号作用是表示多个命令吗,一般分号分开不就行了吗,必须用逗号吗?
3. $?指所有比目标新的依赖目标但是为什么前面又加一个$
4. 我有时运行这个makefile括号中的代码直接显示在屏幕上,没有执行而是作为引用了,这是为什么,makefile写的有错误?
如能详细解释下具体用法最好。

SRC=.

MAKECMDGOAL ?= run

MAKECMDGOAL := $(MAKECMDGOAL:%=%$(EXE))
.....

%.d: $(SRC)/%.f
      ( grep "^[^c*].*AGG" $< >/dev/null 2>&1 ; \
        echo "AGG = $$?" ; \
        echo "$*$(EXE): $@ $(LIB)" ; \
        $(CPP) -M $(INCLUDE) -x c $< | sed 's/^.*:/$@:/' ) > $@
作者: 渣渣鸟    时间: 2010-01-14 10:04
# SRC 定义为. 也就是当期目录
SRC=.

#  MAKECMDGOAL 如果在前面的makefile有定义,则使用以前定义的值
#  如果没有定义,则定义为run
MAKECMDGOAL ?= run

# MAKECMDGOAL 定义为先前的MAKECMDGOAL$(EXE) 比如runexe
# $(XXX:yy=zz)表达法和$(patsubst) 函数是一样的意思,主要是为了和别的makefile兼容
# 才支持这样的表达法
MAKECMDGOAL := $(MAKECMDGOAL:%=%$(EXE))
.....

# 所有的.d文件,依赖于对应的 $(SRC)/目录下面的.f文件,此处也就是.
# 目录,也就是当前目录
# $在makefile 中表示变量函数的引用,当你需要用到$本身的时候,需要用$$来表示
# 在shell语法中,$?表示的是返回值,在makefile中用到的时候用$$?
# 其实这个我也不完全弄的清楚。
# ()也许是shell的语法?这个我也不知道。
%.d: $(SRC)/%.f
      ( grep "^[^c*].*AGG" $< >/dev/null 2>&1 ; \
        echo "AGG = $$?" ; \
        echo "$*$(EXE): $@ $(LIB)" ; \
        $(CPP) -M $(INCLUDE) -x c $< | sed 's/^.*:/$@:/' ) > $@
作者: fortuneteller    时间: 2010-01-15 11:52
谢谢楼上
括号的作用是什么谁再帮解释下
我有时运行这个makefile括号中的代码直接显示在屏幕上,没有执行而是作为引用了,这是为什么,makefile写的有错误?




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2