Главный Makefile для подпроектов не компилирует подпроекты

StackOverflow https://stackoverflow.com/questions/692925

  •  22-08-2019
  •  | 
  •  

Вопрос

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

all: a b c

a:
    @cd a && make

b:
    @cd b && make

c:
    @cd c && make

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

Если быть немного более конкретным:Проект 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 запустить команду?

РЕДАКТИРОВАТЬ:Я попробовал добавить в свой make-файл следующие строки:

.PHONY: spidermonkey

А также переименовал правило Spidermonkey в sm, но все равно без изменений.

РЕДАКТИРОВАТЬ:Виноват!У меня были пробелы вместо табуляции.да!

Это было полезно?

Решение

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

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

 a:
       <some command>

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

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

 .PHONY: a

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

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

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

Другие советы

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

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

Говоря о рекурсивном создании, кстати, это не обязательно хорошая идея, посмотрите Рекурсивный метод Make считается вредным.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top