Как указать цель make-файла в другом каталоге? - PullRequest
4 голосов
/ 09 ноября 2010

Я пытаюсь выяснить, почему я не могу указать цель как находящуюся в другом каталоге.

Я пытаюсь сгенерировать некоторые классы php из файлов json, но я изменил строку, которая на самом делегенерирует php для фиктивного оператора echo, так что кто-то другой может просто скопировать вставить и проверить, чувствуют ли они себя очень щедро.

Есть еще две вещи, которые нужно добавить в каталог, содержащий make-файл:

  • Пустой файл зависимостей с именем PatientDbPath.json
  • Каталог, вызванный

Если у меня есть make-файл со следующим:

.SUFFIXES: .php .json
.json.php:
    echo "HelloMe" > PatientDbPath.php

PatientDbPath.php: PatientDbPath.json

clean:
    $(RM) PatientDbPath.php

Тогда все работает, когда я запускаю make;PatientDbPath.php правильно создан, и при следующем запуске make я получаю сообщение make: 'PatientDbPath.php' is up to date.

Однако я хочу создать файл php в отдельном каталоге, поэтому я обновил свой make-файл следующим образом:

.SUFFIXES: .php .json
.json.php:
    echo "HelloMe" > out/PatientDbPath.php

out/PatientDbPath.php: PatientDbPath.json

clean:
    $(RM) out/PatientDbPath.php

Как только я это сделаю, Make скажет мне make: Nothing to be done for 'out/PatientDbPath.php', хотя в каталоге out нет файла PatientDbPath.php.

Поэтому я подумал, что это может быть что-то сСуффикс правил и я создал третий make-файл.

out/PatientDbPath.php: PatientDbPath.json
    echo "Whatever" > out/PatientDbPath.php

clean:
    rm out/PatientDbPath.php

Этот работает хорошо, как и первый.Кто-нибудь может увидеть, что я делаю неправильно во втором сборочном файле?

Спасибо.

Ответы [ 2 ]

4 голосов
/ 10 ноября 2010

В вашем шаблонном правиле есть две ошибки (.json -> .php), одна концептуальная и одна практическая.

Концептуальная ошибка заключается в том, что это правило о том, как преобразовывать произвольные файлы json (скажем, foo.json) в произвольные файлы .php с одинаковыми именами (скажем, json.php). Тем не менее, ваше правило является специфическим для gnerating PatientDbPth.php. Лучшее правило было бы

.json.php:
    echo "HelloMe" > $@

, где $@ - переменная с именем выходного файла.

Это также показывает практическую проблему: эти правила действительно ограничены файлами с одинаковыми именами. Если у вас есть правило, переводящее .json в .php, и у вас есть foo.php, и вы хотите bar.php, то правило подстановочного знака не будет совпадать. Соответствие включает в себя полное имя файла, поэтому правило подстановочного знака не совпадает, когда вы запрашиваете out / PatientDbPath.php. Это оставляет вас с правилом, которое не имеет никаких действий, поэтому сделайте вывод, что ничего не должно быть сделано.

Если это единственный файл, который вы хотите преобразовать, лучше написать его так, как вы это делали в третьем файле. Если у вас много файлов json, и вы все хотите преобразовать их в out / *. Php и используете GNU make, вы можете использовать обобщенные правила подстановочных знаков GNU make:

out/%.php:    %.json
    action
2 голосов
/ 09 августа 2013

Есть еще один способ сделать то же самое, возможно, более элегантно:

$(JSON_FILES): out/%.php: %.json
    action

Это создаст правило для каждого файла, указанного в JSON_FILES, поэтому, если бы он был определен JSON_FILES= foo.json bar.json, то это было бы эквивалентно:

out/foo.php: foo.json
    action

out/bar.php: bar.json
    action

Затем вы можете использовать $(wildcard *.json), чтобы установить это значение, если вы действительно хотите все файлы .json, или установить его вручную, если правило уникально только для нескольких.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...