Доброго дня, читатели и гости моего сайта. В продолжение прошлого поста о ядре Linux, сегодня хочу рассказать, как собрать и настроить собственное ядро.
Из прошлого поста мы уже знаем, что ядро Linux обладает минимальными возможностями и поддержкой оборудования, но при необходимости мы можем расширить возможности ядра с помощью kernel modules (модулей ядра). Для чего может понадобиться сборка или пересборка собственного ядра? Например для включения/отключения каких-либо новых возможностей, или обновление старого ядра на более новое с поддержкой новых возможностей, или просто для опытов как в нашем примере.
Получение исходников ядра и подготовка к конфигурированию
Можно несколькими путями получить исходники:
- Получить оригинальные архивы кода с 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/
- Получить исходники из репозиториев дистрибутивов (например: 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:
Ура! Мы видим заветное меню конфигурирования ядра. Ниже показаны различные опции, позволяющие включать компоненты в ядро или создавать модули. Когда опция подсвечена, при помощи клавиши пробела можно перемещаться между возможными вариантами для данного компонента. Чтобы активировать опцию, нажмите 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-файле, имя файла и номер строки, содержащей проблему.
Эти ошибки на самом деле не make
ошибок вообще. make
программа, запущенная как часть рецепта, вернула код ошибки, отличный от 0 (‘Error NN‘), что make
интерпретирует как сбой, или он завершился каким-то другим ненормальным образом (с сигналом какого-то типа). См. Ошибки в рецептах .
Если к сообщению не прикреплено ***
, то подпроцесс завершился неудачно, но правило в make-файле было предварено специальным символом -
,поэтому make
проигнорировал ошибку.
Это означает, что программа make
ничего не могла понять о только что прочитанной строке файла makefile. GNU make
ищет различные разделители ( :
, =
, символы префикса рецепта и т. д.), чтобы указать, какую строку он анализирует. Это сообщение означает, что не удалось найти допустимый.
Одна из наиболее частых причин появления этого сообщения заключается в том, что вы (или, возможно, ваш очень полезный редактор, как в случае со многими редакторами MS-Windows) попытались сделать отступ в строках рецептов пробелами вместо символа табуляции. В этом случае make
будет использовать вторую форму ошибки выше. Помните, что каждая строка в рецепте должна начинаться с символа табуляции (если вы не установили .RECIPEPREFIX
; см. Специальные переменные ). Восемь пробелов не в счет. См . Синтаксис правила .
Это означает, что первая вещь в make-файле кажется частью рецепта: он начинается с символа префикса рецепта и не выглядит допустимой директивой make
(например, назначением переменной). Рецепты всегда должны быть связаны с целью.
Вторая форма создается, если в строке стоит точка с запятой в качестве первого непробельного символа; make
интерпретирует это как то, что вы пропустили раздел правила «target: prerequisite». См . Синтаксис правила .
Это означает, что команда make
решила, что необходимо создать цель, но затем не смогла найти в make-файле никаких инструкций о том, как это сделать, ни явных, ни неявных (в том числе в базе данных правил по умолчанию).
Если вы хотите,чтобы этот файл был собран,вам нужно добавить правило в makefile,описывающее,как эта цель может быть собрана.Другими возможными источниками этой проблемы являются опечатки в makefile (если имя файла неверно)или поврежденное дерево исходников (если этот файл не должен быть собран,а является лишь необходимым условием).
Первое означает, что вы не указали цели для сборки в командной строке, и make
не смог найти ни одного make-файла для чтения. Последнее означает, что какой-то make-файл был найден, но он не содержал никакой цели по умолчанию и ничего не было указано в командной строке. GNU make
не имеет ничего общего в этих ситуациях. См. Аргументы для указания Makefile .
Не найден makefile,указанный в командной строке (первая форма)или включенный (вторая форма).
GNU make
позволяет указывать только один рецепт для каждой цели (за исключением правил с двойным двоеточием). Если вы даете рецепт для цели, которая уже была определена как имеющая, выдается это предупреждение, и второй рецепт перезапишет первый. См. Несколько правил для одной цели .
Это означает, что программа make
обнаружила петлю в графе зависимостей: после отслеживания предварительного условия yyy цели xxx и его предварительных условий и т. Д. Один из них снова зависел от xxx .
Это означает, что вы определили обычную (рекурсивную) переменную make
xxx , которая при расширении будет ссылаться на себя ( xxx ). Это не разрешено; либо используйте просто развернутые переменные (‘:=‘ или же ‘::=‘) или используйте оператор добавления (‘+=‘). См. Как использовать переменные .
Это означает,что вы забыли поставить правильную закрывающую скобку или круглую скобку в ссылке на переменную или функцию.
Это означает, что вы не указали необходимое количество аргументов для этой функции. См. документацию функции для описания ее аргументов. См. Функции для преобразования текста .
Эти ошибки генерируются для неправильно сформированных правил статического шаблона (см. Синтаксис правил статического шаблона ). Первое означает, что часть правила с целевым шаблоном пуста; второе означает, что в части целевого шаблона есть несколько символов шаблона ( %
);третий означает, что в части целевого шаблона нет символов шаблона; а четвертое означает, что все три части правила статического шаблона содержат символы шаблона ( %
) — первая часть не должна содержать символы шаблона.
Если вы видите эти ошибки и не пытаетесь создать правило статического шаблона,проверьте значение любых переменных в списках целей и предпосылок,чтобы убедиться,что они не содержат двоеточий.
Это предупреждение и следующее генерируются, если программа make
обнаруживает ошибочные состояния, связанные с параллельной обработкой в системах, в которых make
обмениваться данными подкоманды (см. Параметры связи с подкомпоновкой make
. Это предупреждение генерируется, если рекурсивный вызов процесса make
вынужден иметь ‘-jN‘ в своем списке аргументов (где N больше единицы). Это может произойти, например, если вы установите для переменной среды MAKE
значение ‘make -j2‘. В этом случае sub- make
не взаимодействует с другими процессами 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
Ну раз обратился сюда значит 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.