Ошибка 2 при команде make

сборка и конфигурирование ядра linuxДоброго дня, читатели и гости моего сайта. В продолжение прошлого поста о ядре Linux, сегодня хочу рассказать, как собрать и настроить собственное ядро.

Из прошлого поста мы уже знаем, что ядро Linux обладает минимальными возможностями и поддержкой оборудования, но при необходимости мы можем расширить возможности ядра с помощью kernel modules (модулей ядра). Для чего может понадобиться сборка или пересборка собственного ядра? Например для включения/отключения каких-либо новых возможностей, или обновление старого ядра на более новое с поддержкой новых возможностей, или просто для опытов :) как в нашем примере.

Получение исходников ядра и подготовка к конфигурированию

Можно несколькими путями получить исходники:

    1. Получить оригинальные архивы кода с The Linux Kernel Archives, в виде gzip или bzip2 архивов, с помощью команды:
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.36.1.tar.bz2
cp linux-2.6.36.1.tar.bz2 /usr/src/
  1. Получить исходники из репозиториев дистрибутивов (например: Debian, Ubuntu, CentOS i386) в виде бинарного пакета deb или rpm (src.rpm) с патчами от производителя дистрибутива. Например:
     kernel-server:/tmp/123# apt-cache search source | grep linux
    ketchup - update utility for linux-kernel sources
    linux-patch-grsecurity2 - grsecurity kernel patch - new major upstream version
    linux-wlan-ng-source - linux-wlan-ng driver
    linuxdoc-tools - convert LinuxDoc SGML source into other formats
    linux-patch-lustre - Linux kernel patch for the Lustre Filesystem
    libcorelinux-dev - Foundation Classes, Design Patterns, IPC and Threads
    libcorelinux-doc - Foundation Classes, Design Patterns, IPC and Threads
    libcorelinux-examples - Foundation Classes, Design Patterns, IPC and Threads
    libcorelinuxc2a - Foundation Classes, Design Patterns, IPC and Threads
    linux-patch-openswan - IPSEC Linux kernel support for Openswan
    selinux-policy-src - Source of the SELinux reference policy for customization
    user-mode-linux-doc - User-mode Linux (Documentation)
    linux-patch-xenomai - Linux kernel patches for Xenomai
    linux-patch-debian-2.6.26 - Debian patches to version 2.6.26 of the Linux kernel
    linux-source-2.6.26 - Linux kernel source for version 2.6.26 with Debian patches
    linux-tree-2.6.26 - Linux kernel source tree for building Debian kernel images
    Print-server:~# apt-get install linux-source-2.6.26
    Чтение списков пакетов... Готово
    Построение дерева зависимостей
    Чтение информации о состоянии... Готово
    Будут установлены следующие дополнительные пакеты:
      binutils bzip2 cpp cpp-4.3 gcc gcc-4.3 libc6-dev libgmp3c2 libgomp1 libmpfr1ldbl linux-libc-dev make
    Предлагаемые пакеты:
      binutils-doc bzip2-doc cpp-doc gcc-4.3-locales gcc-multilib manpages-dev autoconf automake1.9 libtool flex bison gdb gcc-doc gcc-4.3-multilib
      libmudflap0-4.3-dev gcc-4.3-doc libgcc1-dbg libgomp1-dbg libmudflap0-dbg glibc-doc libncurses-dev ncurses-dev kernel-package libqt3-mt-dev make-doc
    НОВЫЕ пакеты, которые будут установлены:
      binutils bzip2 cpp cpp-4.3 gcc gcc-4.3 libc6-dev libgmp3c2 libgomp1 libmpfr1ldbl linux-libc-dev linux-source-2.6.26 make
    обновлено 0, установлено 13 новых пакетов, для удаления отмечено 0 пакетов, и 5 пакетов не обновлено.
    Необходимо скачать 50,2MB/63,2MB архивов.
    После данной операции, объём занятого дискового пространства возрастёт на 89,4MB.
    Хотите продолжить [Д/н]? y
    Получено:1 http://ftp.debian.org lenny/main linux-libc-dev 2.6.26-26 [769kB]
    Получено:2 http://ftp.debian.org lenny/main linux-source-2.6.26 2.6.26-26 [49,5MB]
    Получено 50,2MБ за 1min49s (460kБ/c)
    Выбор ранее не выбранного пакета binutils.
    (Чтение базы данных... на данный момент установлено 16621 файлов и каталогов.)
    Распаковывается пакет binutils (из файла .../binutils_2.18.1~cvs20080103-7_i386.deb)...
    Выбор ранее не выбранного пакета bzip2.
    .....
    Распаковывается пакет make (из файла .../archives/make_3.81-5_i386.deb)...
    Обрабатываются триггеры для man-db ...
    Настраивается пакет binutils (2.18.1~cvs20080103-7) ...
    .....
    Настраивается пакет linux-source-2.6.26 (2.6.26-26) ...
    Настраивается пакет make (3.81-5) ...
    kernel-server:~# ls /usr/src/
    linux-source-2.6.26.tar.bz2

Хочу отметить, что имя архива с исходниками или пакета, имеет примерно следующий вид: linux-source-2.6.26 либо kernel-source-2.6.18. Из листинга второго примера, видно что при установке исходников из репозитория, apt нам предлагает установить и остальные сопутствующие пакеты, без которых ядро собрать не получиться.

Итак. После получения исходников одним из вышеуказанных путей (копировании архива (в первом случае) и установки пакета (во втором случае)), мы получаем в каталоге /usr/src/ — архив с именем, аналогичным linux-source-2.6.26.tar.bz2. Далее нам необходимо распаковать дынный архив командой: tar -xjf linux<version>.tar.bz2. В результате, получаем дерево каталогов исходников ядра, расположенные в каталоге /usr/src/linux-2.6.36.1/. Так же рекомендуется создать символьную ссылку /usr/src/linux на вышеуказанный каталог:

kernel-server:~# cd /usr/src/
kernel-server:/usr/src# ln -s linux-2.6.36.1 linux
kernel-server:/usr/src# ls -l lin*
lrwxrwxrwx  1 root src        14 Дек  3 16:31 linux -> linux-2.6.36.1
-rw-r--r--  1 root src  70236745 Дек  3 15:57 linux-2.6.36.1.tar.bz2

Прежде чем приступать к попытке сборки и конфигурированию, необходимо просмотреть файл Changes, расположенный в каталоге Documentation. Он, среди прочего, содержит список пакетов, необходимых для сборки ядра, с указанием номеров версий. Убедитесь, что эти пакеты установлены (если установка исходников производилась с помощью пакетного менеджера, то скорее всего нужные пакеты уже установлены).

В распакованном дереве подкаталогов содержится файл Makefile. make-файл содержит различные цели сборки для конфигурирования опций ядра, сборки ядра и его модулей, установки модулей и сборки пакетов RPM или deb. Наиболее свежие версии исходников ядра позволяют использовать make help для получения краткой справки для каждой цели. В более старых системах было необходимо обращаться к документации или просматривать make-файл. Ниже показана часть вывода make help:

kernel-server:/usr/src/linux-2.6.36.1# make help
Cleaning targets:
clean           - Remove most generated files but keep the config and
enough build support to build external modules
mrproper        - Remove all generated files + config + various backup files
distclean       - mrproper + remove editor backup and patch files

Configuration targets:
config          - Update current config utilising a line-oriented program
nconfig         - Update current config utilising a ncurses menu based program
menuconfig      - Update current config utilising a menu based program
xconfig         - Update current config utilising a QT based front-end
gconfig         - Update current config utilising a GTK based front-end
oldconfig       - Update current config utilising a provided .config as base
.......

Далее, если по каким либо причинам на ядро необходимо наложить патч, то его следует скачать заранее и положить в каталог /usr/src. Если патчить ядро не нужно, можно смело переходить к конфигурированию. Патчится ядро следующим образом:

kernel-server:/usr/src/linux-2.6.36# gzip -cd ../patch-2.6.xx.gz | patch -p1 #или
Print-server:/usr/src/linux-2.6.36# bzip2 -dc ../patch-2.6.xx.bz2 | patch -p1

Конфигурирование

Текущая конфигурация ядра хранится в файле .config. Данный файл формируется при помощи одной из конфигурационных целей (цель — это, говоря простым языком, команда выполняемая в виде make цель):

config

Цель config использует интерфейс командной строки для получения ответов многие на вопросы, касающиеся создания или обновления файла .config. Имхо, по сравнению с целями использующими меню — очень неудобная штука.

cloneconfig

Копирование настроек текущего ядра в файл .config. Данная цель устарела и в новых ядрах заменена oldconfig. (удобно для добавления новых функция текущего ядра)

menuconfig

Цель menuconfig использует программу с меню-интерфейсом, построенную на базе ncurses, для создания или обновления файла .config. Вы должны только ответить на вопросы для элементов, которые хотите изменить. Этот подход заменил старую цель config. Выполняется в окне терминала удаленно или локально.

nconfig

Цель nconfig использует программу с меню-интерфейсом, построенную на базе ncurses, для создания или обновления файла .config. Данная версия основана на menuconfig, но имеет более современный внешний вид. Добавлена после релиза Linux-ядра 2.6.35. Вы должны только ответить на вопросы для элементов, которые хотите изменить. Выполняется в окне терминала удаленно или локально.

xconfig

Цель xconfig использует систему графического меню, основанную на QT front-end, используемом в KDE desktop.

gconfig

Цель gconfig использует систему графического меню, основанную на GTK front-end, используемом в GNOME desktop.

oldconfig

Цель oldconfig позволяет создать конфигурацию с использованием существующего файла .config, созданного ранее или взятого из другой системы. Например,  вы можете скопировать конфигурационный файл для вашей системы из /lib/modules/$(uname -r)/build/.config в /usr/src/linux. Сделав это, можно использовать одну из целей меню конфигурации, чтобы при необходимости внести изменения. Так же при выполнении данной команды, если в новом ядре добавлено много новых возможностей — будет задано много вопросов по настройке новых параметров. (удобно для добавления новых функция текущего ядра)

Повторяю, что список всех целей команд можно увидеть, введя make help. Итак, начнем конфигурирование. Самая удобная для консоли, имхо — make menuconfig.

После запуска команды, у меня вывалилось страшное сообщение:

kernel-server:/usr/src/linux-2.6.36.1# make menuconfig
 *** Unable to find the ncurses libraries or the
 *** required header files.
 *** 'make menuconfig' requires the ncurses libraries.
 ***
 *** Install ncurses (ncurses-devel) and try again.
 ***
make[1]: *** [scripts/kconfig/dochecklxdialog] Ошибка 1
make: *** [menuconfig] Ошибка 2

Чего-то не хватает, подумал Штирлиц (С)… Наверно пакета,содержащего имя ncurses и раз уж это libraries, то скорее всего, пакет начинается на lib. Я полез в репозиторий:

kernel-server:/usr/src/linux-2.6.36.1# apt-cache search ncurses | grep ^lib
libcunit1-ncurses-dev - Unit Testing Library for C (ncurses) -- development files
libcunit1-ncurses - Unit Testing Library for C (ncurses)
libncurses-gst - Ncurses bindings for GNU Smalltalk
libkaya-ncurses-dev - Ncurses binding for kaya
libkaya-ncursesw-dev - Ncurses binding for kaya
libcurses-perl - Curses interface for Perl
libcurses-widgets-perl - Curses widget interface for Perl
libruby-extras - a bundle of additional libraries for Ruby
libruby1.8-extras - a bundle of additional libraries for Ruby 1.8
libtexttools-dev - Ada and C++ library for writing console applications
libtexttools2.0.5 - Ada and C++ library for writing console applications
libncurses-ruby1.8 - ruby Extension for the ncurses C library
libncurses-ruby1.9 - ruby Extension for the ncurses C library
libncurses-ruby - ruby Extension for the ncurses C library
lib64ncurses5-dev - developer's libraries for ncurses (64-bit)
lib64ncurses5 - shared libraries for terminal handling (64-bit)
libncurses5-dbg - debugging/profiling libraries for ncurses
libncurses5-dev - developer's libraries and docs for ncurses
libncursesw5-dbg - debugging/profiling libraries for ncurses
libncursesw5-dev - developer's libraries for ncursesw
libcurses-ocaml-dev - OCaml bindings for the ncurses library
libcurses-ocaml - OCaml bindings for the ncurses library
libggi-target-terminfo - General Graphics Interface TermInfo display target
libncurses5 - разделяемые библиотеки для управления терминалом
libncursesw5 - библиотеки для управления терминалом (поддержка двухбайтовых символов)

Эта строка: libncurses5-dev — developer’s libraries and docs for ncurses мне показалась нужной. Давайте установим:

kernel-server:/usr/src/linux-2.6.36.1# apt-get install libncurses5-dev
Чтение списков пакетов... Готово
Построение дерева зависимостей
Чтение информации о состоянии... Готово
НОВЫЕ пакеты, которые будут установлены:
 libncurses5-dev
обновлено 0, установлено 1 новых пакетов, для удаления отмечено 0 пакетов, и 5 пакетов не обновлено.
Необходимо скачать 1546kБ архивов.
После данной операции, объём занятого дискового пространства возрастёт на 6599kB.
Получено:1 http://ftp.debian.org lenny/main libncurses5-dev 5.7+20081213-1 [1546kB]
Получено 1546kБ за 4s (344kБ/c)
Выбор ранее не выбранного пакета libncurses5-dev.
(Чтение базы данных... на данный момент установлено 18098 файлов и каталогов.)
Распаковывается пакет libncurses5-dev (из файла .../libncurses5-dev_5.7+20081213-1_i386.deb)...
Обрабатываются триггеры для man-db ...
Настраивается пакет libncurses5-dev (5.7+20081213-1) ...

Готово, пробуем make menuconfig:

menuconfigУра! Мы видим заветное меню конфигурирования ядра. Ниже показаны различные опции, позволяющие включать компоненты в ядро или создавать модули. Когда опция подсвечена, при помощи клавиши пробела можно перемещаться между возможными вариантами для данного компонента. Чтобы активировать опцию, нажмите y, чтобы отключить — n, чтобы создать, если это возможно, модуль, нажмите m. Выход из меню: Esc Esc.

  • [*] Компонент будет включен в ядро.
  • [ ] Компонент не будет включен в ядро.
  • [M] Компонент будет оформлен в виде модуля.
  • < > Компонент не будет включен в ядро, но может быть оформлен в виде модуля.

Ниже приведу описание основных разделов конфигурирования сменю (со временем будет пополняться):

Раздел Пареметр Описание
General setup   Этот раздел позволяет добавить идентификационную строку к вашему ядру, а также ряд атрибутов, которые не имеют отношения к каким-либо разделам, но тем не менее должны быть описаны.
Enable loadable module support   Этот раздел содержит опции, определяющие, будет ли ваше ядро поддерживать модули и будут ли они подгружаться и выгружаться автоматически. Опцию «Enable loadable module support» следует включить.
Processor type and features   Этот раздел содержит специфичные для данного типа процессора конфигурационные опции. Здесь вы можете выбрать процессор и семейство процессора, которые будут поддерживаться вашим ядром. Вы можете включать или отключать поддержку ядром различных возможностей, предоставляемых данным процессором. Убедитесь, что вы включили поддержку многопроцессорных систем (symmetric multi-processing support), если в вашем системе установлено более одного процессора или процессор поддерживает технологию hyperthreading. Кроме того, для получения большей производительности графической подсистемы в системах с AGP или PCI видеокартами следует включить поддержку MTRR.
Power management options   В этом разделе помещены опции, касающиеся управления питанием. Особенно они важны для ноутбуков. Кроме контроля состояния питания, вы сможете найти там средства для контроля и мониторинга таких параметров как температура или состояние охлаждающего вентилятора.
Bus options (PCI etc.)   Этот раздел содержит опции для компьютерных шин, поддерживаемых вашей системой, таких как PCI, PCI Express и PC Card. Здесь вы можете включить поддержку файловой системы /proc/pci, которой можно пользоваться вместе с обычно используемой командой lspci.
Executable file formats / Emulations   Этот раздел содержит опции, касающиеся поддержки различных форматов бинарных файлов. Следует включить поддержку «ELF binary». Кроме того, можно включить поддержку DOS binaries для запуска их под DOSEMU, также как и других поддерживаемых соответствующими wrapper’ами бинарных файлов, таких как Java™, Python, Emacs-Lisp и т.д. Наконец, для 64-битных систем, поддерживающих 32-битную эмуляцию, вы, возможно, захотите включить поддержку 32-битных приложений.
Networking   Секция, касающаяся настроек сети, довольно велика. Здесь вы можете включить базовую поддержку сокетов, сетей TCP/IP, фильтрацию, маршрутизацию и bridging сетевых пакетов, а также поддержку различных протоколов, таких как IPV6, IPX, Appletalk и X.25. Кроме того, вы можете включить поддержку wireless, infrared и amateur radio.
Device drivers   Этот раздел также очень велик. Здесь вы можете включить поддержку большого числа аппаратных устройств, включая IDE/ATAPI или SCSI диски, или flash-диски. Включите DMA для ваших IDE устройств; иначе они будут работать в более медленной PIO-моде. Если вы хотите иметь поддержку multiple devices, таких как RAID или LVM, соответствующие опции также надо включить. Здесь вы также можете включить поддержку параллельного порта для работы с принтером через этот интерфейс. Здесь происходит конфигурирование широкого набора поддерживаемых сетевых устройств для различных сетевых протоколов, которые мы конфигурировали ранее. Кроме того, здесь вы найдете опции поддержки устройств аудио- и видео-захвата, устройств USB и IEEE 1384 (Firewire), а также различного рода устройств аппаратного мониторинга. В разделе управления символьными устройствами (Character Devices) вы, возможно, захотите включить поддержку печати через параллельный порт и поддержку direct rendering.
Firmware drivers   Этот раздел содержит несколько опций, относящихся к установке и обновлению BIOS, таких как использование функций Dell System Management на некоторых системах производства компании Dell.
File systems   Этот раздел предназначен для конфигурирования файловых систем, поддержку которых вы хотите иметь в вашем ядре, скомпилированных в виде модулей или нет. Также вы сможете найти здесь файловые системы для съемных дисковых устройств (дискеты, CD и DVD устройства), а также сетевых файловых систем, таких как NFS, SMB или CIFS. Поддержка различных типов разделов и национальных кодировок Native Language Support также располагаются в этом разделе.
Kernel hacking   Этот раздел позволяет включать режим отладки ядра и выбирать, какие дополнительные функции будут включены.
Security options   Этот раздел предназначен для конфигурирования опций защиты, а также включения и конфигурирования SELinux (Security Enhanced Linux).
Cryptographic options   В это разделе можно сконфигурировать поддержку различных алгоритмов шифрования, таких как MD4, DES и SHA256.
Library routines   Здесь вы можете указать ряд алгоритмов вычисления контрольных сумм (CRC), которые будут включены в ядро или собраны как модули.

Я привел очень краткое описание разделов конфигурирования ядра. Конкретно по выбору настроек, я наверно, сделаю отдельный пост, ибо текущий  вырос до огромных размеров. Самое лучшее описание настроек make menuconfig я нашел тут Gentoo Handbook. От себя скажу, что логичным будет выполнить make oldconfig (тем самым скопировав текущий .config установленной ОС), а потом запустить make menuconfig и отключить все ненужные функции (допустим я отключил поддержку WiFi, ненужных мне файловых систем jfs и т.п.). И в общем, я сторонник такого мнения, что заниматься оптимизацией ядра необходимо в очень крайних случаях, когда производительность ОС упирается в возможности железа. Соответственно, уменьшив размер ядра (отключив ненужные модули, включив их в состав ядра + отключив ненужные возможности), можно прибавить в производительности 1-2%. А на современных серверах, думаю это (переконфигурирование ядра) не особо актуально.

Сборка Ядра

Теперь, когда мы сконфигурировали ядро, мы готовы к его сборке. Если вы не знаете, каково состояние дерева для сборки, прежде чем приступать к конфигурированию нового ядра выполните make clean. Для более полной очистки выполните make mrproper (при этом — make mrproper — будет удален файл .config, а также некоторые другие файлы, используемые в процессе сборки).

В ходе пробы конфигурирования, желательно дать новому ядру специальное название, которое позволит вам легко его идентифицировать. Чтобы сделать это, необходимо установить значение Local version и активировать опцию Automatically append version information to the version string в соответствующей строке раздела General setup.

В принципе, для сборки ядра не требуются полномочия root, несмотря на то, что для установки нового ядра эти полномочия необходимы.

Чтобы начать сборку ядра 2.6, необходимо выполнить make.

Чтобы начать сборку ядра 2.4, необходимо выполнить 3 команды:
make dep
make bzImage
make modules
Первая создает файлы необходимых зависимостей. Вторая собирает ядро. И последняя собирает модули.

Установка нового ядра

После окончания сборки ядра, его необходимо установить. Перед установкой, необходимо выполнить make modules_install для установки модулей ядра в новый подкаталог /lib/modules. После установки модулей, необходимо выполнить make install для установки нового ядра и стартового RAM-диска (initial RAM disk) в каталог /boot и обновления конфигурации загрузчика.

Хочу обратить внимание, что в процессе сборки автоматически создается необходимый стартовый RAM-диск (initial RAM disk или initrd). Если у вас возникнет необходимость создать его вручную, это можно сделать при помощи команды mkinitrd.

После выполнения make install должен обновиться конфигурационный файл загрузчика. Но у меня он почему-то  обновился после команды update-grub.

На этом и закончу. Очень большая статья получилась. В ближайшем будущем постараюсь ее ужать.

Что еще почитать?

1. Gentoo Handbook: http://www.gentoo.org/doc/ru/handbook/handbook-x86.xml?full=1#book_part1_chap7
2. Ставим ядро 2.6, или Ядерная физика для домохозяйки. Версия 2.0: http://linux4u.jinr.ru/docs/add04/kernel-2.6-install-2.0.html
3. The Linux Kernel Module Programming Guide (Программирование ядра Linux): http://linux4u.jinr.ru/docs/add04/lkmpg.html
4. Linux From Scratch: http://linux4u.jinr.ru/docs/add04/LFS-BOOK-5.0-HTML/

Резюме

Подведу маленький итог написанному. Скажу сразу, что загрузиться с переконфигурированного ядра мне удалось раза с пятого:) Посему — пробуйте, экспериментируйте! VirtualBox вам в помощь:)

По моему мнению, указанную в статье процедуру целесообразно выполнять либо при необходимости выиграть несколько мегабайт свободной памяти, либо добавить необходимые модули/драйвера (конечно, можно и другие причины придумать, например для экспериментов :) ). При этом, в первом случае, сборка ядра растягивается на неопределенный промежуток времени и неопределенное количество попыток сборки и перезагрузки для того чтобы получить «идеально» оптимизированное под железо и заточенное под себя ядро. Во втором случае, сборка ядра сводится к нескольким шагам: 1. получение исходников, 2. подготовка ядра к компиляции, 2.1 выполнение make cloneconfig перед make menuconfig для копирования текущих настроек ядра, 3. Выполнение make menuconfig или другой цели для конфигурирования и добавления новых параметров, 4. Компиляция и установка по вышеуказанной инструкции.

Итак, сборка и настройка индивидуального ядра состоит из нескольких этапов: 1. получение исходников ядра, 2. Конфигурирование ядра, 3. Сборка (компиляция) ядра, 4. Установка ядра. первый этап — это команда wget, второй — make menuconfig, третий — make. Вот так :)

Буду рад Вашим комментариям.

upd 2010.01.15: добавил новую цель — make nconfig (спасибо S_paul за коммент)

С Уважением, Mc.Sim!


Теги: bash, dpkg, GRUB, kernel, Linux, команды, основы

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

Иногда ошибки make не являются фатальными, особенно при наличии префикса - в строке рецепта или параметра командной строки -k .К фатальным ошибкам добавляется строка *** .

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

[ foo ] Ошибка NN
[foo] signal description

Эти ошибки на самом деле не make ошибок вообще. make программа, запущенная как часть рецепта, вернула код ошибки, отличный от 0 (‘Error NN‘), что make интерпретирует как сбой, или он завершился каким-то другим ненормальным образом (с сигналом какого-то типа). См. Ошибки в рецептах .

Если к сообщению не прикреплено *** , то подпроцесс завершился неудачно, но правило в make-файле было предварено специальным символом - ,поэтому make проигнорировал ошибку.

отсутствующий разделитель.Остановитесь.
отсутствует разделитель (вы имели в виду TAB вместо 8 пробелов?).Стоп.

Это означает, что программа make ничего не могла понять о только что прочитанной строке файла makefile. GNU make ищет различные разделители ( : , = , символы префикса рецепта и т. д.), чтобы указать, какую строку он анализирует. Это сообщение означает, что не удалось найти допустимый.

Одна из наиболее частых причин появления этого сообщения заключается в том, что вы (или, возможно, ваш очень полезный редактор, как в случае со многими редакторами MS-Windows) попытались сделать отступ в строках рецептов пробелами вместо символа табуляции. В этом случае make будет использовать вторую форму ошибки выше. Помните, что каждая строка в рецепте должна начинаться с символа табуляции (если вы не установили .RECIPEPREFIX ; см. Специальные переменные ). Восемь пробелов не в счет. См . Синтаксис правила .

рецепт начинается до первой цели.Стоп.
недостающее правило перед рецептом.Остановитесь.

Это означает, что первая вещь в make-файле кажется частью рецепта: он начинается с символа префикса рецепта и не выглядит допустимой директивой make (например, назначением переменной). Рецепты всегда должны быть связаны с целью.

Вторая форма создается, если в строке стоит точка с запятой в качестве первого непробельного символа; make интерпретирует это как то, что вы пропустили раздел правила «target: prerequisite». См . Синтаксис правила .

Нет правила делать цель ` xxx ‘.
Нет правила для создания цели ` xxx ‘, необходимого yyy ‘.

Это означает, что команда make решила, что необходимо создать цель, но затем не смогла найти в make-файле никаких инструкций о том, как это сделать, ни явных, ни неявных (в том числе в базе данных правил по умолчанию).

Если вы хотите,чтобы этот файл был собран,вам нужно добавить правило в makefile,описывающее,как эта цель может быть собрана.Другими возможными источниками этой проблемы являются опечатки в makefile (если имя файла неверно)или поврежденное дерево исходников (если этот файл не должен быть собран,а является лишь необходимым условием).

Не указаны цели и не найден makefile.Остановить.
Нет целей.Остановка.

Первое означает, что вы не указали цели для сборки в командной строке, и make не смог найти ни одного make-файла для чтения. Последнее означает, что какой-то make-файл был найден, но он не содержал никакой цели по умолчанию и ничего не было указано в командной строке. GNU make не имеет ничего общего в этих ситуациях. См. Аргументы для указания Makefile .

Makefile ` xxx ‘не найден.
Включенный make-файл ` xxx ‘не найден.

Не найден makefile,указанный в командной строке (первая форма)или включенный (вторая форма).

предупреждение: переопределение рецепта для цели ` xxx
предупреждение: игнорирование старого рецепта для цели ` xxx

GNU make позволяет указывать только один рецепт для каждой цели (за исключением правил с двойным двоеточием). Если вы даете рецепт для цели, которая уже была определена как имеющая, выдается это предупреждение, и второй рецепт перезапишет первый. См. Несколько правил для одной цели .

Круговая зависимость xxx <- yyy удалена.

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

Рекурсивная переменная ` xxx ‘ссылается на себя (в конце концов). Останавливаться.

Это означает, что вы определили обычную (рекурсивную) переменную make xxx , которая при расширении будет ссылаться на себя ( xxx ). Это не разрешено; либо используйте просто развернутые переменные (‘:=‘ или же ‘::=‘) или используйте оператор добавления (‘+=‘). См. Как использовать переменные .

Непрерванная переменная ссылка.Стоп.

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

недостаточно аргументов для функции ` xxx ‘. Останавливаться.

Это означает, что вы не указали необходимое количество аргументов для этой функции. См. документацию функции для описания ее аргументов. См. Функции для преобразования текста .

отсутствующий целевой паттерн.Остановитесь.
несколько моделей целей.Стоп.
целевой шаблон не содержит `%’.Остановитесь.
смешанные неявные и статические правила паттерна.Стоп.

Эти ошибки генерируются для неправильно сформированных правил статического шаблона (см. Синтаксис правил статического шаблона ). Первое означает, что часть правила с целевым шаблоном пуста; второе означает, что в части целевого шаблона есть несколько символов шаблона ( % );третий означает, что в части целевого шаблона нет символов шаблона; а четвертое означает, что все три части правила статического шаблона содержат символы шаблона ( % ) — первая часть не должна содержать символы шаблона.

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

предупреждение:принудительное -jN в submake:отключение режима сервера заданий.

Это предупреждение и следующее генерируются, если программа make обнаруживает ошибочные состояния, связанные с параллельной обработкой в ​​системах, в которых make обмениваться данными подкоманды (см. Параметры связи с подкомпоновкой make . Это предупреждение генерируется, если рекурсивный вызов процесса make вынужден иметь ‘-jN‘ в своем списке аргументов (где N больше единицы). Это может произойти, например, если вы установите для переменной среды MAKE значение ‘make -j2‘. В этом случае sub- make не взаимодействует с другими процессами make и просто будет притворяться, что у него есть две собственные задачи.

warning:jobserver unavailable:using -j1.Добавьте `+’ к родительскому правилу make.

Чтобы процессы make могли взаимодействовать, родительский процесс передает информацию дочернему процессу. Поскольку это может привести к проблемам, если дочерний процесс на самом деле не является make , родительский процесс будет делать это только в том случае, если он думает, что дочерний процесс является make . Для определения этого родитель использует обычные алгоритмы (см. Как работает переменная MAKE ). Если make-файл сконструирован таким образом, что родитель не знает, что дочерний процесс является make -процессом, то дочерний процесс получит только часть необходимой информации. В этом случае дочерний элемент сгенерирует это предупреждающее сообщение и последовательно продолжит свою сборку.

предупреждение:игнорирование предварительных условий при определении суффиксного правила

Согласно POSIX правило суффикса не может содержать предварительных условий. Если правило, которое может быть суффиксным правилом, имеет предварительные условия, оно интерпретируется как простое явное правило с нечетным целевым именем. Это требование выполняется, когда включен POSIX-совместимый режим ( определена цель .POSIX ). В версиях GNU make до 4.3 не выводилось никаких предупреждений и создавалось суффиксное правило, однако все предварительные требования игнорировались и не являлись частью суффиксного правила. Начиная с GNU make 4.3 поведение остается таким же, и, кроме того, генерируется это предупреждение. В будущей версии POSIX-совместимое поведение будет единственным поведением: ни одно правило с предварительным условием не может быть суффиксным правилом, и это предупреждение будет удалено.

Время на прочтение
6 мин

Количество просмотров 13K

Методы отладки

В этой части поговорим об общих методах и проблемах отладки. В конечном итоге, отладка — это солянка из всего, что работает в данной конкретной ситуации. Эти методы работают для меня и мне приходится полагаться на них даже в случае проблем с простейшими makefile. Может быть, они помогут и тебе тоже.

Отладка Makefile /часть 1/

Один из очень раздражающих багов в make 3.80 был в сообщении об ошибке в makefile, где make указывал номер строки, и обычно этот номер строки был неверный. Я не удосужился исследовать из-за чего эта проблема возникает: из-за импортируемых файлов, присваиваний многострочных переменных или из-за пользовательских макросов. Обычно, make дает номер строки больше чем должен был бы. В сложных makefile бывает что номер не совпадает на 20 строк.

Часто наиболее простой путь увидеть значение переменной это напечатать его в ходе выполнения цели. И хотя распечатать легко можно с помощью warning, в долгой перспективе поможет сэкономить много времени немного усилий на добавление общей цели debug для вывода переменных. Вот примерный код цели debug:

debug:
       $(for v,$(V), 
         $(warning $v = $($v)))

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

$ make V="USERNAME SHELL" debug
makefile:2: USERNAME = Owner
makefile:2: SHELL = /bin/sh.exe
make: debug is up to date.

Если уж совсем делать всё волшебно, то можно использовать MAKECMDGOALS переменную, чтобы избежать присвоения переменной V:

debug:
       $(for v,$(V) $(MAKECMDGOALS), 
         $(if $(filter debug,$v),,$(warning $v = $($v))))

Теперь можно выводить переменные просто перечислив их в командной строке. Однако, я не рекомендую этот способ, так как предупреждения make о невозможности обновлении переменных (так как они указаны как цели) могут сбить с толку:

$ make debug PATH SHELL
makefile:2: USERNAME = Owner
makefile:2: SHELL = /bin/sh.exe
make: debug is up to date.
make: *** No rule to make target USERNAME. Stop.

В то время как make выводит команды из сценариев цели до их выполнения, он не выводит команды выполняющиеся в shell функции. Часто эти команды сложные и неуловимые в том плане, что могут выполняться как незамедлительно, так и в отложенной манере, если они были вызваны в значении рекурсивной переменной. Один из способов увидеть эти команды — включить отладку в самой оболочке:

DATE := $(shell date +%F)
OUTPUT_DIR = out-$(DATE)
make-directories := $(shell [ -d $(OUTPUT_DIR) ] || mkdir -p $(OUTPUT_DIR))
all: ;

Если это запустить с опцией отладки sh, мы увидим:

$ make SHELL="sh -x"
+ date +%F
+ '[' -d out-2004-05-11 ']'
+ mkdir -p out-2004-05-11

Можно заметить, что также выводятся значения всех переменных и выражений.

Часто встречаются сильно вложенные выражения, например, для оперирования с именами файлов:

FIND_TOOL = $(firstword $(wildcard $(addsuffix /$(1).exe,$(TOOLPATH))))

Ничего хорошего в отладке таких выражений нет. Один из разумных подходов будет их разворот и печать каждого подвыражения:

$(warning $(TOOLPATH))
$(warning $(addsuffix /$(1).exe,$(TOOLPATH)))
$(warning $(wildcard $(addsuffix /$(1).exe,$(TOOLPATH))))

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

Общие сообщения об ошибках

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

Сообщение make об ошибке имеет стандартный формат:

    makefile:n: *** message. Stop

или:

    make:n: *** message. Stop.

где makefile строка — это имя файла или импортированного файла в котором произошла ошибка. Следующая часть — номер строки, в которой произошла ошибка, далее следуют три звездочки, и, наконец, само сообщение.

Заметим, что это задача make запускать другие программы и таким образом, если при этом возникают ошибки, скорее всего проблемы в твоём makefile вызвали ошибки в этих других программах. Для примера, ошибки оболочки могут быть из-за плохо сформированных командных сценариев, или ошибок компилятора из-за некорректных аргументов командной строки. Выяснение того, какая программа выдала сообщение об ошибке — первоочередная задача при решении проблемы. К счастью, сообщения make довольно очевидны.

Синтаксические ошибки

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

Одна из наиболее частых ошибок для новых пользователей make это опускание скобок вокруг имен переменных:

foo:
     for f in $SOURCES; 
     do                 
        …               
     done

Скорее всего, make развернёт переменную $S в ничего, и оболочка выполнит цикл только раз со значением OURCES в f. В зависимости от того, что ты собрался делать с f, можно получить забавные сообщения оболочки:

    OURCES: No such file or directory

но можно и не получить сообщения вовсе. Помни — имена переменных обрамляются скобками.

missing separator

Сообщение:

    makefile:2:missing separator. Stop.

или (в GNU make — пер.):

    makefile:2:missing separator (did you mean TAB instead of 8 spaces?). Stop.

обычно означает make искал разделитель, такой как :, =, или табуляцию и не нашел ни одного. Вместо этого, он нашел что-то что он не понял.

commands commence before first target

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

unterminated variable reference

Это простая, но распространённая ошибка. Она означает, что ты забыл закрыть имя переменной или вызов функции правильным количеством скобок. С сильно вложенными вызовами функций и именами переменных make файлы становятся похожими на Lisp! Избежать этого поможет хороший редактор, который умеет сопоставлять скобки, такой как Emacs.

Ошибки в командных сценариях

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

Мы обсуждали пропущенные точки с запятыми в разделе «лучшие практики», поэтому не будем на этом останавливаться здесь.

Классическое сообщение:

    bash: foo: command not found

выводится, когда оболочка не смогла найти команду foo. Так, оболочка поискала в каждой папке из переменной PATH исполняемый файл и не нашла совпадений. Чтобы исправить такую ошибку, нужно обновить PATH переменную, обычно в .profile (Bourne shell), .bashrc (bash) или .cshrc (C shell). Конечно, можно также установить PATH в самом makefile, и экспортировать PATH из make.

Если же команда завершилась с ошибкой, она выходит с ненулевым статусом выхода. В этом случае, make отчитается об ошибке со следующим сообщением:

$ make
touch /foo/bar
touch: creating /foo/bar: No such file or directory
make: *** [all] Error 1

Здесь touch команда не сработала, что напечатало своё собственное сообщение объясняющее сбой. Следующая строка — это итоговая ошибка make. Упавшая цель в makefile указана в квадратных скобках, а затем статус выхода упавшей программы. Если программа вышла по сигналу, а не с ненулевым статусом выхода, то make напечатает более подробное сообщение.

Заметим также, что команды под знаком @ также могут упасть. В этом случае сообщение об ошибке может возникнуть как будто оно из ниоткуда.

В обоих случаях ошибка происходит из программ запускаемых make, нежели от самого make.

No Rule to Make Target

Это сообщение имеет две формы:

    make: *** No rule to make target XXX. Stop.

и:

    make: *** No rule to make target XXX, needed by YYY. Stop.

Это означает, что make решил обновить файл XXX, но make не смог найти ни одного правила для выполнения работы. make ищет во всех явных и неявных правилах в его базе данных прежде чем сдаться и вывести это сообщение.

Есть три причины для этой ошибки:

  • В твоем makefile отсутствует необходимое правило для обновления файла. В этом случае тебе необходимо добавить правило с описанием как построить цель.
  • В makefile — опечатка. Или make ищет неверный файл или в правиле построения этого файла указан неверный файл. Если в makefile используются переменные, то опечатки становится еще труднее отыскать. Иногда единственный путь быть точно уверенным в значении сложного имени файла это напечатать его или печатая переменную напрямую или исследуя внутреннюю базу данных make.
  • Файл должен быть, но make не находит его или из-за того, что его нет, или make не знает где его искать. Конечно, иногда make абсолютно прав. Файла нет — похоже мы забыли его скачать из VCS. Еще чаще, make не может найти файл из-за того, что исходник расположен где-то еще. Иногда исходник в другом дереве исходников, или может файл генерируется другой программой и создался в папке артефактов сборки.

    Overriding Commands for Target

    make позволяет только один командный сценарий для цели (за исключением «::» правил, которые редко используются). Если встретится больше чем один командный сценарий для одной цели, make выведет предупреждение:

    makefile:5: warning: overriding commands for target foo

    Также он может вывести сообщение:

    makefile:2: warning: ignoring old commands for target foo

    Первое предупреждение показывает строку, на которой был найден второй сценарий команд; тогда как второе предупреждение указывает на позицию исходного переопределённого командного сценария.

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

Например, мы могли бы определить общную цель во включаемом файле:

# Create a jar file.
$(jar_file):
        $(JAR) $(JARFLAGS) -f $@ $^

и позволим нескольким отдельным makefile добавить свои собственные требования. Мы могли бы записать в makefile:

# Set the target for creating the jar and add prerequisites
jar_file = parser.jar
$(jar_file): $(class_files)

Если непреднамеренно добавить командный сценарий в такой makefile, make выдаст предупреждение переопределения.

  • Печать

Страницы: [1]   Вниз

Тема: ошибка Make — Error 2  (Прочитано 17698 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн
perlito

Добро всем!
Люди добрые случаем никто не знает что за ошыбка make Error 2?

я столкнулся с ней при использовании PAR  архиватора(Perl)

make catalyst_par
cp lib/BookStore/Model/DB.pm blib/lib/BookStore/Model/DB.pm
cp lib/BookStore/Schema/Result/UserRole.pm blib/lib/BookStore/Schema/Result/UserRole.pm
cp lib/BookStore/Schema/Result/BookAuthor.pm blib/lib/BookStore/Schema/Result/BookAuthor.pm
cp lib/BookStore/Controller/Root.pm blib/lib/BookStore/Controller/Root.pm
cp lib/BookStore/View/HTML.pm blib/lib/BookStore/View/HTML.pm
cp lib/BookStore/Schema/Result/Author.pm blib/lib/BookStore/Schema/Result/Author.pm
cp lib/BookStore/Schema/Result/User.pm blib/lib/BookStore/Schema/Result/User.pm
cp lib/BookStore.pm blib/lib/BookStore.pm
cp lib/BookStore/Schema/Result/Role.pm blib/lib/BookStore/Schema/Result/Role.pm
cp lib/BookStore/Controller/Logout.pm blib/lib/BookStore/Controller/Logout.pm
cp lib/BookStore/Controller/Login.pm blib/lib/BookStore/Controller/Login.pm
cp lib/BookStore/Schema.pm blib/lib/BookStore/Schema.pm
cp lib/BookStore/Schema/Result/Book.pm blib/lib/BookStore/Schema/Result/Book.pm
cp lib/BookStore/Controller/Books.pm blib/lib/BookStore/Controller/Books.pm
cp script/bookstore_test.pl blib/script/bookstore_test.pl
/usr/bin/perl «-Iinc» -MExtUtils::MY -e ‘MY->fixin(shift)’ — blib/script/bookstore_test.pl
cp script/bookstore_cgi.pl blib/script/bookstore_cgi.pl
/usr/bin/perl «-Iinc» -MExtUtils::MY -e ‘MY->fixin(shift)’ — blib/script/bookstore_cgi.pl
cp script/bookstore_server.pl blib/script/bookstore_server.pl
/usr/bin/perl «-Iinc» -MExtUtils::MY -e ‘MY->fixin(shift)’ — blib/script/bookstore_server.pl
cp script/bookstore_fastcgi.pl blib/script/bookstore_fastcgi.pl
/usr/bin/perl «-Iinc» -MExtUtils::MY -e ‘MY->fixin(shift)’ — blib/script/bookstore_fastcgi.pl
cp script/bookstore_create.pl blib/script/bookstore_create.pl
/usr/bin/perl «-Iinc» -MExtUtils::MY -e ‘MY->fixin(shift)’ — blib/script/bookstore_create.pl
Manifying blib/man1/bookstore_test.pl.1p
Manifying blib/man1/bookstore_cgi.pl.1p
Manifying blib/man1/bookstore_server.pl.1p
Manifying blib/man1/bookstore_fastcgi.pl.1p
Manifying blib/man1/bookstore_create.pl.1p
Manifying blib/man3/BookStore::Model::DB.3pm
Manifying blib/man3/BookStore::Schema::Result::BookAuthor.3pm
Manifying blib/man3/BookStore::Schema::Result::UserRole.3pm
Manifying blib/man3/BookStore::Controller::Root.3pm
Manifying blib/man3/BookStore::Schema::Result::Author.3pm
Manifying blib/man3/BookStore::Schema::Result::User.3pm
Manifying blib/man3/BookStore::Schema::Result::Role.3pm
Manifying blib/man3/BookStore.3pm
Manifying blib/man3/BookStore::Controller::Logout.3pm
Manifying blib/man3/BookStore::Schema::Result::Book.3pm
Manifying blib/man3/BookStore::Controller::Login.3pm
Manifying blib/man3/BookStore::Controller::Books.3pm
include /home/tigran/Documents/Development/perl/BookStore/inc/Module/Install.pm
Writing PAR «bookstore.par»
make: *** [catalyst_par] Error 2

« Последнее редактирование: 18 Июня 2012, 14:36:35 от tiko.svyazist »

perlito.ru -> о perl на русском


Оффлайн
Yurror


Оффлайн
perlito

:idiot2: Ну раз обратился сюда значит google не помог

perlito.ru -> о perl на русском


Оффлайн
лесной_зонтик

Извиняюсь, а при чем тут архиватор?

Моя мечта поставить на комп Linux, Unix, *BSD, Mac OS X, OpenSolaris, OS/2, Windows.
Не спрашивайте зачем. Сам не знаю ???


Оффлайн
perlito

ну собственно выдается make: *** [catalyst_par] Error 2
вот я и подумал может make притом, али нет?, может PAR или PAR::Packer? может знает кто?

perlito.ru -> о perl на русском


Оффлайн
Olej

ну собственно выдается make: *** [catalyst_par] Error 2
вот я и подумал может make притом, али нет?, может PAR или PAR::Packer? может знает кто?

/usr/include/asm-generic/errno-base.h

#define ENOENT           2      /* No such file or directory */


Оффлайн
perlito

Что то я не понял, по подробней можно, а то я в Ubuntu новичок

perlito.ru -> о perl на русском


Оффлайн
Olej

по подробней можно

не можно ;)

коды ошибок в Linux фиксированы, их определения находятся в файле, который я показал (и ещё парочка рядом для более экзотических ошибок), ваш код: «нет такого файла или каталога».

а почему нет и какого фала в сценарии Makefile — это вам разбираться.
потому и «не можно» ;)


Оффлайн
perlito

perlito.ru -> о perl на русском


Оффлайн
Yurror

tiko.svyazist, ты бы отрыл что-нибудь еще более экзотическое и просил чтобы за тебя разобрались
Естественно всем влом что-то искать качать ставить разбираться
А жи-ши это так просто

задавай более конкретные вопросы. или просто найди человека который тебе это установит


Оффлайн
Чистый

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

Тестовый репозиторий kdeNeur ppa:devcode/kdeneur
各々が死ぬことをどのように決定する


Оффлайн
perlito

perlito.ru -> о perl на русском


  • Печать

Страницы: [1]   Вверх

So I’m trying to run the open-source code from this research paper, but I keep getting [make] Error 2. The makefile for the code was thankfully provided so I all I did was run the make command when I was in the folder that contained the makefile.

I’m new to all of this, I got everything from the internet, so I apologize if I’m a bit ignorant. I’m trying to learn, please be patient (:

QuantumHoneybees-MacBook-Pro:femflip2 Joe$ make
makeCompiling src/adaptive2.cpp ...
 In file included from src/adaptive2.cpp:13:
./src/kernel.h:16:20: warning: unused function 'smooth_kernel' [-Wunused-function]
    static FLOAT64 smooth_kernel( FLOAT64 r2, FLOAT64 h ) {
                   ^
In file included from src/adaptive2.cpp:15:
./src/util2.h:29:13: warning: unused function 'dump' [-Wunused-function]
static void dump( const char *format, ...) {
            ^
./src/util2.h:45:13: warning: unused function 'run' [-Wunused-function]
static void run( const char *format, ...) {
            ^
./src/util2.h:54:20: warning: unused function 'format_str' [-Wunused-function]
static const char *format_str( const char *format, ...) {
                   ^
./src/util2.h:65:13: warning: unused function 'is_nan' [-Wunused-function]
static bool is_nan(const double v) {
            ^
./src/util2.h:86:17: warning: unused function 'square' [-Wunused-function]
        static FLOAT64 square(FLOAT64 a) {
                       ^
./src/util2.h:120:17: warning: unused function 'getSeconds' [-Wunused-function]
        static FLOAT64 getSeconds() {
                       ^
./src/util2.h:142:15: warning: unused function 'stretchPosition' [-Wunused-function]
        static vec2d stretchPosition( const svd2 &svd, vec2d p, FLOAT64 min, FLOAT64 max, bool inverse=true ) {
                     ^
./src/util2.h:162:28: warning: unused function 'marchPoints' [-Wunused-function]
        static std::vector<vec2d> marchPoints( const std::vector<vec2d> &nodes, const std::vector<FLOAT64> &levelsets, bool fill=true ) {
                                  ^
./src/util2.h:180:17: warning: unused function 'computeVolume' [-Wunused-function]
        static FLOAT64 computeVolume( const std::vector<vec2d> points ) {
                       ^
./src/util2.h:192:17: warning: unused function 'distance' [-Wunused-function]
        static FLOAT64 distance( const vec2d &p0, const vec2d &p1, vec2d &p ) {
                       ^
./src/util2.h:222:17: warning: unused function 'detDelaunay' [-Wunused-function]
        static FLOAT64 detDelaunay( vec2d p0, vec2d p1, vec2d p2, vec2d p3 ) {
                       ^
src/adaptive2.cpp:53:13: warning: unused function 'sampleVelocity' [-Wunused-function]
static bool sampleVelocity( sorter2& sorter, vec2d pos, FLOAT64 dpx, const std::vector<particle2 *> &neighbors, vec2d &vel ) {
            ^
13 warnings generated.
Compiling src/ann/ANN.cpp ...
Compiling src/ann/bd_fix_rad_search.cpp ...
Compiling src/ann/bd_pr_search.cpp ...
Compiling src/ann/bd_search.cpp ...
Compiling src/ann/bd_tree.cpp ...
Compiling src/ann/brute.cpp ...
Compiling src/ann/kd_dump.cpp ...
src/ann/kd_dump.cpp:44:14: warning: unused variable 'EPSILON' [-Wunused-const-variable]
const double    EPSILON                 = 1E-5; // small number for float comparison
                ^
1 warning generated.
Compiling src/ann/kd_fix_rad_search.cpp ...
Compiling src/ann/kd_pr_search.cpp ...
Compiling src/ann/kd_search.cpp ...
Compiling src/ann/kd_split.cpp ...
Compiling src/ann/kd_tree.cpp ...
Compiling src/ann/kd_util.cpp ...
Compiling src/ann/perf.cpp ...
Compiling src/annsorter2.cpp ...
In file included from src/annsorter2.cpp:9:
In file included from ./src/annsorter2.h:10:
In file included from ./src/ann2.h:11:
./src/util2.h:29:13: warning: unused function 'dump' [-Wunused-function]
static void dump( const char *format, ...) {
            ^
./src/util2.h:45:13: warning: unused function 'run' [-Wunused-function]
static void run( const char *format, ...) {
            ^
./src/util2.h:54:20: warning: unused function 'format_str' [-Wunused-function]
static const char *format_str( const char *format, ...) {
                   ^
./src/util2.h:65:13: warning: unused function 'is_nan' [-Wunused-function]
static bool is_nan(const double v) {
            ^
./src/util2.h:86:17: warning: unused function 'square' [-Wunused-function]
        static FLOAT64 square(FLOAT64 a) {
                       ^
./src/util2.h:120:17: warning: unused function 'getSeconds' [-Wunused-function]
        static FLOAT64 getSeconds() {
                       ^
./src/util2.h:142:15: warning: unused function 'stretchPosition' [-Wunused-function]
        static vec2d stretchPosition( const svd2 &svd, vec2d p, FLOAT64 min, FLOAT64 max, bool inverse=true ) {
                     ^
./src/util2.h:162:28: warning: unused function 'marchPoints' [-Wunused-function]
        static std::vector<vec2d> marchPoints( const std::vector<vec2d> &nodes, const std::vector<FLOAT64> &levelsets, bool fill=true ) {
                                  ^
./src/util2.h:180:17: warning: unused function 'computeVolume' [-Wunused-function]
        static FLOAT64 computeVolume( const std::vector<vec2d> points ) {
                       ^
./src/util2.h:192:17: warning: unused function 'distance' [-Wunused-function]
        static FLOAT64 distance( const vec2d &p0, const vec2d &p1, vec2d &p ) {
                       ^
./src/util2.h:222:17: warning: unused function 'detDelaunay' [-Wunused-function]
        static FLOAT64 detDelaunay( vec2d p0, vec2d p1, vec2d p2, vec2d p3 ) {
                       ^

11 warnings generated.
make: *** [all] Error 2
QuantumHoneybees-MacBook-Pro:femflip2 Joe$ make 

Edit:: I’ve narrowed it down to the makefile in lines 36-44 there is something wrong with what is written. I unfortunately have zero experience with writing makefiles, so I don’t know how to fix it. I tried messing around with some lines’ indentation because some other threads seem to have that issue, but to no avail.

Понравилась статья? Поделить с друзьями:
  • Ошибка 2 при доступе к устройству ultraiso как исправить
  • Ошибка 2 нет определения photoshop линия 1
  • Ошибка 2 не удается получить доступ к образу
  • Ошибка 2 не удается найти указанный файл sql server
  • Ошибка 2 не удается найти указанный файл dhcp