В make-файле указано имя каталога фальшивой цели или «реальной» цели?

18

В соответствии с тем, что я прочитал о make-файлах, фальшивая цель - это любая цель, которая не соответствует фактическому имени файла. Моя интуиция говорит, что каталог как цель будет обрабатываться так же, как и файл.

Почему это важно? У меня есть каталог в качестве цели в моем make-файле. когда у меня есть это как предварительное условие для моего основного исполняемого файла, этот исполняемый файл всегда создается, независимо от того, обновляется или нет. Если я выберу это как предварительное условие, мой make-файл достаточно умен, чтобы знать, когда нужно строить вещи, но у меня есть проблема не знать, нужно ли создавать каталог. Согласно тому, что я прочитал о make, любые фиктивные цели не являются хорошими предпосылками, потому что make не знает, являются ли они актуальными, поэтому они всегда будут восстанавливать связанную цель. Вот выдержка из моего make-файла.

$(EXEC_WITH_PATH): ${OBJ_DIR} $(DPEND) $(OBJS)
    @echo "--------------------------------------------";
    @echo "$(THIS_DIR)  $(MACHINE)";
    @echo "Linking Shared Library";
    @echo "ar -rc $(EXEC_WITH_PATH) INSERT::{OBJS}";
    ar -rc $(EXEC_WITH_PATH)  $(OBJS);
    @echo "--------------------------------------------";


# Make dirs for object code and links
${OBJ_DIR} :
        @if [ ! -d ${OBJ_DIR} ]; then \
                mkdir ${OBJ_DIR};    \
        fi;

Итак, в этом случае, ${OBJ_DIR} , имя каталога, фальшивая цель или нет?     

задан Chance 22.11.2010 в 18:30
источник
  • в любом случае для решения вашей проблемы у вас может быть команда mkdir, перед которой стоит «-», чтобы игнорировать возвращаемое значение. –  siukurnin 22.11.2010 в 18:34
  • @siukurnin: Нет, вы должны использовать mkdir -p, чтобы он был успешным, если каталог уже существует, но не работает должным образом, если каталог не может быть создан. –  Cascabel 22.11.2010 в 19:01
  • Для чего это стоит, я думаю, проблема в том, что каталог является обязательным условием для файла, который находится в этом каталоге. Поэтому в большинстве случаев каталог требуемых условий и цель имеют одну и ту же метку времени, в результате чего цель будет выполняться каждый раз. –  Chance 23.11.2010 в 00:38
  • Да, это проблема. См. Мой ответ на предварительные условия для заказа. –  camh 23.11.2010 в 00:42

2 ответа

27

Изменить: это применимо только к GNU make - справедливому допущению с учетом тега linux.

Ваша цель - настоящая цель, а не PHONY. Проблема в том, что выходной каталог обновляется, когда вы помещаете в него цели, чтобы он всегда был более новым, чем ваша цель. Это означает, что ваша цель всегда будет построена, потому что она устарела в отношении ее зависимостей.

Вам нужно предварительное условие для заказа . Эти предварительные условия позволяют указать, что он должен быть построен, если он не существует, но не обращать внимания на метку времени. То есть, цель не будет устаревшей в отношении предварительных условий только для заказа.

Вы указываете его следующим образом:

$(EXEC_WITH_PATH): $(DPEND) $(OBJS) | ${OBJ_DIR}
...

Все, что требуется после вертикальной полосы, является предварительным условием для заказа.

Теперь вы можете сделать свою цель OBJ_DIR более простой:

${OBJ_DIR} :
        mkdir -p ${OBJ_DIR}

Примечание. Я использовал синтаксис ${OBJ_DIR} вместо $(OBJ_DIR) , потому что это то, что вы использовали. Предварительные требования только для заказа не зависят от этого синтаксиса.

    
ответ дан camh 23.11.2010 в 00:39
  • Я закончил добавление другой цели, так что у меня есть новая цель в зависимости от $ (OBJ_DIR) и $ (EXEC_WITH_PATH), которая, похоже, работает. Однако я должен проверить предварительные условия «только для заказа». Благодарю. –  Chance 23.11.2010 в 00:49
  • Нашли ссылку здесь gnu.org/software/make/manual/make.html#Prerequisite-Types –  Chance 23.11.2010 в 01:05
  • Проблема с этим (кажется) заключается в том, что не может быть каталог, который также является целью. Таким образом, у меня не может быть «отладочная» цель и «отладочная» директория, которую мне нужно создать. –  iheanyi 29.04.2014 в 04:41
7

Это настоящая цель.

Фиксированные цели автоматически не определяются системой make - они должны быть идентифицированы вами, используя цель .PHONY .

Чувствительные фальшивые цели включают all и clean - они не соответствуют реальным файлам, а действия , которые вы хотите сделать makefile. Вот как это объяснить:

.PHONY: all clean install test

Каталоги являются законными целями правил makefile. Вы не должны делать эти фальшивые слова.

mydir:
     mkdir mydir

Цель .PHONY, конечно, фальшивая.

Документацию GNU можно найти здесь .

    
ответ дан Alex Brown 22.11.2010 в 18:32