Makefile не вызывает скрипт оболочки при установке переменной - PullRequest
0 голосов
/ 30 апреля 2018

Я пытаюсь следовать учебнику по мясному скелету на osdev . Makefile не запускает один из сценариев оболочки. Я установил все разрешения для каждого из файлов, чтобы быть исполняемыми.

В lib / Makefile у меня установлены следующие несколько строк:

$(info DEFAULT_HOST!=../default-host.sh)
$(info HOST?=DEFAULT_HOST)
$(info HOSTARCH!=../target-triplet-to-arch.sh $(HOST))

после выполнения этих строк ни DEFAULT_HOST, ни HOSTARCH не устанавливаются.

default-host.sh:

#!/bin/sh
echo i686-elf

arget-triplet-to-arch.sh:

#!/bin/sh
if echo "$1" | grep -Eq 'i[[:digit:]]86-'; then
  touch here.txt
  echo i386
else
  touch there.txt
  echo "$1" | grep -Eo '^[[:alnum:]_]*'
fi

Обратите внимание, я добавил сенсорные операторы в arget-triplet-to-arch.sh. При запуске из оболочки один или другой из этих файлов создается, но не при запуске Makefile. Это означает, что make, кажется, не запускает команды оболочки. Как мне заставить make запускать команды оболочки?

1 Ответ

0 голосов
/ 30 апреля 2018

Как говорит Бета, info не "позволяет вам видеть значение этой строки, которая оценивается". info расширяет свой аргумент и выводит его на стандартный вывод. «Расширяет» означает, что он разрешает любые ссылки на переменные, это не означает, что он интерпретируется как команда makefile. Так что, если вы запустите $(info hi), он напечатает «привет». Если вы запускаете $(info foo = bar), если печатает foo = bar, но не , установите значение переменной foo равным bar.

Для использования != обратите внимание, что эта функция была добавлена ​​в GNU make 4.0. Если ваша версия старше этой, то это назначение не будет соответствовать вашим ожиданиям. В частности, строка типа FOO!=echo bar будет интерпретироваться так, как если бы она была FOO! = echo bar ... другими словами, она устанавливает переменную make с именем FOO!.

Лично я всегда помещаю пробелы вокруг операторов присваивания в моих make-файлах ... это ясно дает понять, что они являются присваиваниями, а не присваиваниями переменных оболочки (не то, что это ни в коем случае не должно быть понятно для кого-либо кто знает синтаксис makefile, но ...). В более новых версиях GNU make имена переменных не могут содержать пробелов.

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