Мастер Makefile для подпроектов не будет компилировать подпроекты - PullRequest
2 голосов
/ 28 марта 2009

У меня есть проект, над которым я работаю, который на самом деле содержит 3 подпроекта, каждый из которых должен быть скомпилирован за один раз. Мой make-файл выглядит примерно так:

all: a b c

a:
    @cd a && make

b:
    @cd b && make

c:
    @cd c && make

Проекты A и B прекрасно компилируются, но для третьего проекта он говорит, что ничего не поделаешь, хотя переключение в каталог C и запуск make фактически компилируют код.

Чтобы быть более конкретным: Project C в приведенном выше примере на самом деле является SpiderMonkey от Mozilla Принимая во внимание, что A и B - это написанные мною кодовые / make-файлы, C - просто необработанная копия SpiderMonkey с веб-сайта Mozilla. Фактически команда для его компиляции:

make JS_DIST=/usr JS_THREADSAFE=1 JS_HAS_FILE_OBJECT=1

В моем мастере Makefile у меня есть:

spidermonkey:
    @cd spidermonkey/src && $(MAKE) JS_DIST=/usr JS_THREADSAFE=1 JS_HAS_FILE_OBJECT=1

Запуск "make spidermonkey" выводит "make: Ничего не нужно делать для` spidermonkey '". Как мне заставить make выполнить команду?

EDIT: Я попытался добавить следующие строки в мой make-файл:

.PHONY: spidermonkey

Как и переименование правила spidermonkey в sm, но без изменений.

EDIT: Виноват! У меня были пробелы, когда у меня должна была быть вкладка. DOH!

Ответы [ 2 ]

4 голосов
/ 28 марта 2009

У вас, вероятно, есть файл или каталог на верхнем уровне, который называется "spidermonkey". Make думает, что это то, что он должен создать, и, поскольку он уже там, делает остановки.

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

 a:
       <some command>

Эта команда должна создать один файл с именем "a".

Правила, которые не производят файлы, но присутствуют только в качестве заполнителей, называются фальшивыми целями , и их следует объявлять так:

 .PHONY: a

Тогда Make всегда будет предполагать, что a нужно переделать.

Также, как правило, не используйте "make" для рекурсивного вызова make, вместо этого используйте $ (MAKE) .

РЕДАКТИРОВАТЬ: изменил «псевдо» на «фальшивый»

1 голос
/ 28 марта 2009

Make только проверяет наличие файла (или каталога) с именем, совпадающим с целью правила, и если он существует (и он новее, чем зависимости), то с точки зрения make делать больше нечего.

Итак, ваша проблема в том, что у вас есть правило spidermonkey (без каких-либо зависимостей), а также каталог spidermonkey, и затем make думает, что «цель уже сделана, мне ничего не нужно делать». Чтобы заставить make делать то, что вы хотите, переименуйте правило spidermonkey (или каталог).

Кстати, говоря о рекурсивном коде, это не всегда хорошая идея, см. Рекурсивное создание, считающееся вредным .

...