2016-02-28 2 views
1

Попытка получить GNU make 3.81 Встроенная функция для работы , но продолжала получать сообщение об ошибке.GNU make builtin функции не работают

Я построил простой Makefile:

FOO=bar 

$(info $(FOO) $(origin FOO)) 

$(firstword $(origin FOO)) 

и побежал. Первая функция работает, но второй не будет.

сообщение об ошибке:

...

$ сделать -d

GNU Make 3.81 Copyright (C) 2006 Free Software Foundation, Inc. Это свободное программное обеспечение; см. источник условий копирования. НЕТ гарантии; даже для КОММЕРЧЕСКОЙ ЦЕННОСТИ или ПРИГОДНОСТИ ДЛЯ A ОПРЕДЕЛЕННАЯ ЦЕЛЬ.

Эта программа построена для i686-PC-Linux-гну

Чтение MAKEFILES ...

Чтение Makefile `Makefile» ...

бар файл

Makefile: 6: *** отсутствует разделитель. Стоп.

...

Первые две функции правильно работать так, почему это происходит? Я не вижу ничего очевидного или эта функция $ (firstword) не поддерживается в этой версии make? Спасибо за любую помощь.

+0

Вышеприведенный пример makefile находится прямо из книги «ГНУ« Сделай книгу »Джона Грэма-Камминга. Ему не нужна цель или использование вкладок или быть в правиле, чтобы создать его. который я только что нашел, работает: 'MY_LIST = программа для направленной компиляции $ (информация Первое слово - $ (firstword $ (MY_LIST))). Это решает часть моего вопроса о том, что функция $ (firstword ...) действительно работает. Итак, реальный вопрос: «Почему функция $ (origin ..) не выводит совместимую строку?» – timoh

ответ

1

По большей части, заставит файл выглядит как один или несколько из этих блоков:

target: [depends-on]... 
     command to build 
     another command 

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

Я никогда не видел книгу, о которой вы говорите, но либо это неправильно, либо вы читаете ее неправильно. Попробуйте это:

FOO=bar 

all: 
     $(info $(FOO) $(origin FOO)) 
     echo '<' $(firstword $(origin FOO)) '>' 

Вам нужно эхо на последней строке, потому что firstword является обычной функцией замены, в то время как info работает больше как команда.

Я поставил угловые скобки на линии firstword, чтобы показать, что происходит.

Опять же, обратите внимание, что отступы линий на Makefiles используют вкладки не пробелы.

0

Функция firstword - это текстовая манипуляция. Он принимает текст в качестве своего ввода и возвращает текст в качестве вывода. Он не пишет никаких сообщений или ошибок.

Таким образом, когда вы его вызываете, вы используете его для создания файла makefile. У Makefiles есть специальный синтаксис, как и любой другой язык программирования.Когда вы помещаете текст в make-файл, его нужно структурировать определенным образом - вам нужно сделать инструкцию или определить переменную или что-то еще.

Например, это то, что «правила сборки» выглядит следующим образом:

output: input 
    rule to produce output from input 

Вы кладете слово в Makefile (результат $(firstword)), так что предполагается, что вы делаете что-то - определить переменную или указав правило сборки. Но вы не следили за другими словами. В основном, ваша программа make имеет синтаксическую ошибку. :(

Смежные вопросы