我有以下makefile(Makefile.certify),当我执行时:
make -f Makefile.certify
它给了我一个:
/bin/sh: line 23: -o: command not found
PROG=certify
TMP=/var/tmp
ARCH=x86_64
_CC=/bin/cc
all: ${PROG}
${PROG}: ${ARCH}
@for mode in $? ; do \
case $${mode} in \
i386) \
CC="${_CC} -g -D__x86"; \
;; \
i386-f64) \
CC="${_CC} -D_FILE_OFFSET_BITS=64 -g -D__x86";\
;; \
amd64) \
CC="${_CC} -m64 -g -D__x86 -D__ia64 -D__GNUC";\
;; \
*) \
;; \
esac; \
$${CC} -o ${TMP}/$${mode}/$@ ${TMP}/$@.c; \
done
我不是真的使用makefiles
或c
,但我必须处理这个问题。
我的问题是:
- 为什么for循环需要
@
前缀?- for循环中的
$?
是什么?- 这个makefile可能会执行什么?显然它会尝试根据执行系统的体系结构或类似的东西来编译我的certify。
c file
,但我没看到它将如何选择i386
或amd64
等。< / LI> 醇>
我正在使用运行x86
的{{1}}系统。
答案 0 :(得分:2)
@
前缀用于通过make
来抑制命令打印。如果它不存在,make
将在执行之前打印命令以输出。
您可以将其删除并查看差异。
$?
是依赖项列表。在您的特定情况下,ARCH
被定义为单个条目&#34; x86_64&#34;。因此$?
将扩展为该值。但您可以尝试按以下方式修改ARCH
值:
ARCH=x86_64 i386
它尝试从certify
源文件为给定的体系结构构建cerfify.c
二进制文件。每个二进制文件都位于自己的子目录中:
/var/tmp/{i386|x86_64|i386_f64}/certify
答案 1 :(得分:1)
@
用于抑制执行的命令的正常“回显”。在for循环中使用它对我来说也是新的(删除它会改变输出中的任何内容吗?)
$?
是makefile automatic variables之一,这意味着"The names of all the prerequisites that are newer than the target, with spaces between them"
它将遍历$?
,阅读上面的
编辑:
$?
targetfile : firstfile secondfile thirdfile
cat $? > $@
如果targetfile
比所有其他3个文件更旧,则makefile会将firstfile
,secondfile
和thirdfile
的内容连接在一起在targetfile
。