2015-08-21 4 views
2

я следующий Makefile (Makefile.certify), и когда я выполняю:Что делает этот makefile?

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}/[email protected] ${TMP}/[email protected];  \ 
    done 

Я действительно не использовать makefiles или c , но мне приходится иметь дело с этим.

Мои вопросы:

  1. Почему цикл нужен @ префикс?
  2. Что такое $? в цикле for?
  3. Каким будет выполнение этого файла makefile? Очевидно, он пытается скомпилировать мой сертификат. c file на основе архитектуры системы, совершающей или что-то вроде этого, но я не вижу, как он будет выбирать либо i386 или amd64 т.д.

Я использую x86 система работает RHEL.

+0

Или 'Информация make'. – reinierpost

ответ

2
  1. @ префикс используется для подавления команды печати на make. Если его нет, make будет печатать команду перед выполнением для вывода.

    Вы можете удалить его и увидеть разницу.

  2. $? - список зависимостей. В вашем конкретном случае ARCH определяется как одна запись «x86_64». Таким образом, $? будет расширен в это значение.Но вы можете попытаться изменить ARCH значение следующим образом:

    ARCH=x86_64 i386 
    
  3. Он пытается построить certify двоичный файл для данной архитектуры из cerfify.c исходного файла. Каждый двоичный будет находиться в собственном подкаталоге:

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

Отлично. Поэтому в настоящее время он не может соответствовать «x86_64» в любом случае, поэтому переменная «mode» пуста, и компиляция завершается с ошибкой. Благодаря! – Michael

1
  1. @ Используется для подавления нормального «эха» выполняемой команды. С его помощью в течение цикла также является новым для меня (делает ее удаление изменить что-либо на выходе?)

  2. $? является одним из makefile automatic variables, это один означает "The names of all the prerequisites that are newer than the target, with spaces between them"

  3. Он будет перебирать $?, прочитайте выше

Изменить:

Пример $?

targetfile : firstfile secondfile thirdfile 
    cat $? > [email protected] 

если targetfile является старше всех остальных 3-х файлов, то Makefile будет конкатенация содержимого firstfile, secondfile и thirdfile вместе в targetfile.

+0

Благодарим вас за ответ. Не могли бы вы поделиться примером '$?'? – Michael

+1

@ Майкл добавил простой, я думаю, что он иллюстрирует, как работает '$?' – Chalkos