这个makefile有什么作用?

时间:2015-08-21 10:04:52

标签: c makefile gnu-make

我有以下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

我不是真的使用makefilesc,但我必须处理这个问题。

我的问题是:

  
      
  1. 为什么for循环需要@前缀?
  2.   
  3. for循环中的$?是什么?
  4.   
  5. 这个makefile可能会执行什么?显然它会尝试根据执行系统的体系结构或类似的东西来编译我的certify。c file,但我没看到它将如何选择i386amd64等。< / LI>   

我正在使用运行x86的{​​{1}}系统。

2 个答案:

答案 0 :(得分:2)

  1. @前缀用于通过make来抑制命令打印。如果它不存在,make将在执行之前打印命令以输出。

    您可以将其删除并查看差异。

  2. $?是依赖项列表。在您的特定情况下,ARCH被定义为单个条目&#34; x86_64&#34;。因此$?将扩展为该值。但您可以尝试按以下方式修改ARCH值:

    ARCH=x86_64 i386
    
  3. 它尝试从certify源文件为给定的体系结构构建cerfify.c二进制文件。每个二进制文件都位于自己的子目录中:

    /var/tmp/{i386|x86_64|i386_f64}/certify
    

答案 1 :(得分:1)

  1. @用于抑制执行的命令的正常“回显”。在for循环中使用它对我来说也是新的(删除它会改变输出中的任何内容吗?)

  2. $?makefile automatic variables之一,这意味着"The names of all the prerequisites that are newer than the target, with spaces between them"

  3. 它将遍历$?,阅读上面的

  4. 编辑:

    $?

    的示例
    targetfile : firstfile secondfile thirdfile
        cat $? > $@
    

    如果targetfile 比所有其他3个文件更旧,则makefile会将firstfilesecondfilethirdfile的内容连接在一起在targetfile