Make ищет зависимости в каталоге, прежде чем перейти на него? - PullRequest
0 голосов
/ 06 апреля 2011

Я пытался написать make правило этой формы:

lib%.so: computations/%.h
        make -C computations/ -f makefile $<

Вывод:

make -C computations/ -f makefile computations/test.h
make[1]: Entering directory `/home/shai/csm/csm2/src/computations'
make[1]: *** No rule to make target `computations/test.h'.  Stop.
make[1]: Leaving directory `/home/shai/csm/csm2/src/computations'
make: *** [libtest.so] Error 2

Что ж, похоже, он ищет %.h после переключения библиотеки,Не важно, я просто попробую удалить

lib%.so: %.h
        make -C computations/ -f makefile $<

, но теперь оно вообще не распознает правило!

Вывод:

shai@ubuntu:~/csm/csm2/src$ make libtest.so
`make: *** No rule to make target `libtest.so'.  Stop.

Is make играть с моим разумом?Как изменение зависимостей может заставить его перестать распознавать target ?

Ответы [ 3 ]

2 голосов
/ 06 апреля 2011

Как изменение зависимостей может заставить его перестать распознавать цель?

Скорее всего, потому что он не может найти файл, который соответствует шаблону зависимости, потому что test.h находится в другом каталоге. Вы можете использовать VPATH для поиска файлов в других каталогах.

Изменить: но это по-прежнему не решит вашу проблему полностью, потому что $< будет заменен на computations/test.h, который не будет найден в каталоге computations (как в первой полученной вами ошибке). Вы можете попробовать $(notdir $<), но я думаю, что это уродливый хак (если он работает; я не пробовал). Это вытекает из дизайна вашего make-файла и структуры проекта.

2 голосов
/ 06 апреля 2011

Вы используете make неправильно.

На самом деле дизайн Make довольно прост: вы говорите ему

  1. , как создавать цели (Тело правила).
  2. , который нацелен на создание первого списка (Список зависимостей).

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

Ваше правило с $< (которое расширяется до списка зависимостей) означает, что вы вызываете вызываемую make для создания зависимости %.h, а не цели lib%.so.Правило должно создавать цель.Если необходимо создать зависимость, необходимо указать make, как это сделать, с помощью другого отдельного правила, а не пытаться убедиться, что оно соответствует настоящему правилу.

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

0 голосов
/ 06 апреля 2011

Возможно, вы просто скопировали / вставили его, но во второй форме вам не хватает вкладки.

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