Невозможно запустить процесс make f linux

Обновлено: 05.07.2024

10:29:51: Выполняются этапы для проекта 3.
10:29:51: Невозможно запустить процесс «C:\Qt\5.2.0\mingw48_32\bin\qmake.exe» C:\QtProjects\3\3.pro -r -spec win32-g++ "CONFIG+=debug" "CONFIG+=declarative_debug" "CONFIG+=qml_debug"
Ошибка при сборке/установке проекта 3 (комплект: Desktop Qt 5.2.0 MinGW 32bit)
Во время выполнения этапа «qmake»
10:29:51: Прошло времени: 00:00.

Когда Вы устанавливали Qt, то отметили ли сам MinGW в разделе инструментов в инсталяторе?

Не помню, но скорее всего нет
Эта ошибка, кстати, вылазить стала не сразу после установки
До этого пару дней вылазила какая-то другая ошибка, но через раз, поэтому я как-то и не напрягался

Переустановить с MinGW в Tools и будет работать?

Если удавалось с MinGW собирать приложения, то он явно установлен.
Qt для Windows поставляется c компиляторами MinGW либо с MSVC. Т.е. помимо самой библиотеки нужны еще и компиляторы.
Соответствующая версия MinGW может быть установлена с помощью инсталятора Qt.
На Windows еще бывают проблемы с правами доступа. Попробуйте запустить QtCreator от имени администратора.

Я и так от админа сижу

Правой кнопкой на ярлыке приложения и запустить от имени администратора .

Не помогает
И переустановка тоже не помогла

У себя на Windows 7 собрал Qt Quick приложение с MinGW 32bit по имен 3 и все собирается и запускается из под Qt Creator.
Даже не знаю чем еще помочь.

У меня "приложение без использования Qt"
Это может как-то влиять?

Для управления проектами Вы используете qmake - он генерирует Make-файлы для дальнейшего исполнения. С помощью qmake вполне нормально собирать проекты, которые не используют Qt, однако в Qt Creator Вам все же придется указать какой-нибудь Kit (Комплект).
Qt Creator также понимает CMake проекты. Утилита cmake делает тоже самое по своей сути.
Если Вам интересно и есть возможность изучить что-то новое, то можете попробовать свой проект с применением CMake. В интернете полно примеров и инструкций как начать использовать Qt Creator совместно с CMake. Попробуйте.

Замечательно. QtQuick успешно компилируются и запускаются
Где включить CMake?
Я заглянул в настройки в последнюю вкладку вкладки "Сборка и запуск"
Там я увидел поле для пути к "программе" и галочку "Предпочитать генератор Ninja"
Галочка не влияет
Значит надо указать путь к программе
Это путь к CMake?
Где он? Или его отдельно скачивать надо?

UPD:
Перечитал и ушёл искать.

Даже когда я прописал пути о ошибка осталась(( может нужен какой нить компилятор типа MSVS 2008?

"Мы можем что-то изменить и своими силами. "
"Начнешь с себя, примером ближнему поможешь. "

НУ я нажимаю собрать все. После этого у меня появляется красный индикатор прогресса в левой части окна. А в консоли написано так:

Выполняется сборка проекта hello.
Невозможно запустить процесс make
Ошибка во время сборки проекта hello
Во время выполнения сборки на этапе 'Make'

Открой инструменты -> параметры, там выбери пункт qt4 (в самом низу), и посмотри видит ли qt creator qmake (c:\qt\2010.01\qt\bin\qmake.exe должна быть примерно такая строка с галочкой зеленой рядом, в зависимости от того куда установлена qt), задай каталог для MinGW (примерно такой C:\Qt\2010.01\mingw), и там же посмотри найдена ли qt в path, в самой верхней строке, скорее всего в этом проблемы, пропиши пути к qt лучше.

"Мы можем что-то изменить и своими силами. "
"Начнешь с себя, примером ближнему поможешь. "

Последний раз редактировалось JoberLord; 04.04.2010 в 08:05 .

Пропиши еще раз путь в Path к dll таким как QtCore4.dll, QtGui4.dll, у меня это путь C:\Qt\2010.01\qt\bin
И еще раз проверь чтобы путь к твоему проекту не содержал русских символов, лучше вообще закинь его в корень например диска D для эксперимента.

"Мы можем что-то изменить и своими силами. "
"Начнешь с себя, примером ближнему поможешь. "

задай каталог для MinGW (примерно такой C:\Qt\2010.01\mingw)


А так посмотри еще это - Параметры->Сборка и запуск->использовать jom вместо nmake - поставь галочку. Затем проверь Сборка->конфигурация сборки-> debug - галочка.

"Мы можем что-то изменить и своими силами. "
"Начнешь с себя, примером ближнему поможешь. "

Хотел скомпилировать c код, root есть, командой cd попал в эту папку, проверил есть ли там Makefile, потом набрал make, и мне говорят, что его там нету. Как. Я же сам проверял. ./configure тоже не работает, что делать?


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

Я новичок, что там не так?

Я же в папке со всеми файлами и ввел все правильно вроде


новичок - это я, а ты или скучающий толстячок, или невменяемый школьник. выбор за тобою.

Makefile.in это не то же самое, что Makefile. Это только заготовка для генерации Makefile. Генерируется он обычно скриптом configure, но у тебя среди файлов почему-то его нет.

Не оскорбляй, я не школьник, просто надо срочно скомпилировать, а я в linux не разбираюсь из-за сложных ошибок


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

novitchok ★★★★★ ( 16.01.18 10:00:00 )
Последнее исправление: novitchok 16.01.18 10:00:21 (всего исправлений: 1)

Я нашёл configure и configure.ac в корне проекта, хотел скомпилировать отдельно библиотеку. Какой выбрать из этих файлов?

А это была другая система на другом устройстве, на android я решил скомпилировать потому, что там не могу

Пробуй собирать всё из корня проекта. Значит пакет не рассчитан для сборки по частям.


Поставь нормальный не урезанный дистрибудив.

Не могу, есть много причин. 1.) Это не пк с операционной системой, а программа-эмулятор. 2.) Она проверяет подлинность и не разрешает ставить другую OС. 3.) Эта ОС самая быстрая

Попробовал. Почему denied? Root есть!

Дай права на выполнение.

Что за бл***. Все сделал как надо, но всё равно сыпятся ошибки

права на выполнение дать

Должно работать вот так:

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

Дай сам код то, я на своём попробую собрать, сейчас тоже с Termux играюсь ))


Оффтоп: а нахрена собирать с рутовыми правами?

Что за ошибка permission denied? При любых действиях с компилятором правильных такая ошибка

Ошибка прав доступа.

он там не нужен вообщето, если ты через tsu рутуешься то всё ок если через su то ты уже не в консоли Termux, а в консоли android

sudo su не в консоли работает а как обычно

Вот новая ошибка

я не школьник, просто надо срочно скомпилировать

у тебя там вообще нет файла ./configure

Есть. Я проверил, теперь есть

В скриптах, выполняемых при конфигурировании стоит вызов командного интерпретатора /bin/sh, если его нет в эмуляторе, то либо ставь его туда как-то, если там есть /bin/bash, то можешь сделать символьную ссылку, ну либо правь исходники.


chmod u+x configure помог. Теперь другая ошибка configure error cannot run /bin/sh ./config.sub

В эмуляторе нет /bin/sh

Создал папку bin и этот файл, экскортировал переменные но не получается

Создал папку bin и этот файл

/bin/sh - это программа, а не просто какой-то файл.

В Linux, когда ты в командной строке вводишь имя и пароль, то после авторизации у тебя запускается командная оболочка, так вот эта запущенная оболочка и есть /bin/sh, /bin/bash или другая реализация.

Аналогично и в эмуляторе терминала в графической оболочке.

Разбираться как добавить в эмулятор эту программу.

Что именно непонятно в фразе No C compiler found?

Gcc has no installation candidate, не могу его установить

И еще что за cc и cl.exe

Это не помогает apt-get clean rm -rf /var/lib/apt/lists/* apt-get clean apt-get update apt-get upgrade

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

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

Мы можем разделить ошибки на три категории:

Ошибки при выполнении команды ./configure

Ошибки при выполнении команды make

Ошибки при выполнении команды make install

Очевидно, что ошибки при выполнении команды ./configure, возникают во время выполнения скрипта конфигурации, ошибки при выполнении команды make возникают во время выполнения команды make, а ошибки при выполнении команды make install, соответственно, возникают при выполнении команды make install. Далее будет представлен лист типичных ошибок и способ их решения, разделенный на эти три категории.

Ошибки при выполнении команды ./configure

Следующий список содержит некоторые общие ошибки, которые может выдать каманда ./configure. Ошибки отсортированы по частоте возникновения. Сначала наиболее часто встречающиеся. Вещи между ( и ) являются опциональными, они могут не появлятся. OR, выделенное жирным курсивом означает, что несколько ошибок имеют одно решение. Текст между < и > показывает тип строки, которая должна появиться в этом месте.

Это обычно означает что -dev или -devel версия пакета ,который называется <somename> не установлена у вас на компьютере. Используйте менеджер пакетов вашего дистрибутива (или любой другой способ найти и установить пакет), чтобы найти пакет <somename> и установить его, если это возможно, -dev или -devel версию. Если -dev или -devel версия уже установлена, или её не сущечтвует, посмотрете на версию уже установленной. Она достаточно новая? Если она ниже, чем <someversion>, попробуйте обновить пакет. Если обновить пакет не представляется возможным, вы можете попробовать скомпилировать более мтарую версию программы. Более старые версии обычно используют более старые версии библиотек и программ, необходимых для компиляции.

Конфигурационный скрипт не может найти .h файл, необходимый для компиляции. Эта ошибка похожа на предыдущую, в которой необходимо установить -dev или -devel версию пакета. Однако, обычно не понятно какой пакет нужно установить для решения этой проблемы, так как <somename> может быть очень общим названием. Попробуйте поискать в интернетет <somename>.h, чтобы узнать в каком пакете этот файл находится, а затем установите этот пакет (и его -dev или -devel версия, если это возможно) с помощью менеджера пакетов вашего дистрибутива.

Вы используете для установки компилятор gcc, А переменная окружения CC отсутствует или не установлена. Убедитесь, что пакет gcc установлен, используя менеджер пакетов вашего дистрибутива. Если этот пакет не установлен, установите его. Если он установлен, попробуйте выполнить следующую команду:

Если это помогло, вы можете добавить эту команду в /etc/profile (это файл, содержащий команды, которые выполняются когда пользователь входит в систему) и тогда вам не придется набирать её снова.

Ваш пакет g++ отсутствует или поврежден. Используйте Используйте менеджер пакетов вашего дистрибутива (или любой другой способ найти и установить пакет), чтобы найти пакет g++ и установить его. Не забудьте, что в некоторых дистрибутивах этот пакет называется не g++. Fedora, например, использует название gcc-c++ в соем репозитарии yum. Если вы не можете найти g++, попробуйте поискать c++, cpp или gcc.

Эта ошибка вызвана странным "багом" в некоторых версиях библиотеки libtool, которая заставляет конфигурационный скрипт проверять все компиляторы поддерживающиеся libtool. Наиболее простое решение - установить g++.

Ошибки при выполнении команды make

Если вы компилируете программу с использованием gcc 4 (используйте gcc -dumpversion чтобы это выяснить), попробуйте использовать более старые версии компилятора. Сначала убедитесь, что у вас установлена более старая версия. Обычно это можно узнать, использовав следующую команду:

Если она вернет что-то вроде этого:

То можете использовать команды gcc32, чтобы скомпилировать программу в более ранними версиями gcc. Если команда не вернет подобной строки, то используя менеджер пакетов вашего дистрибутива, найдите и установите более ранние версии gcc (обычно они называются compat-gcc или gcc-<versionnumber>). После установки, вам должна быть доступна альтернативная версия gcc. Её можно найти используя команду ls. Заставить команды ./configure, make и make install использовать более старую версию gcc можно так:

]$ CC="/usr/bin/gcc32" ./configure
[rechosen@localhost

]$ CC="/usr/bin/gcc32" make
[rechosen@localhost

]$ CC="/usr/bin/gcc32" make install

Конечно путь /usr/bin/gcc32 надо заменить на тот, по которому у вас находится альтернативная версия gcc.

Иногда ошибки могут вызваны простым "багом" программы. Попробуйте скачать последнюю версию программы (используя её cvs, svn или другой репозитарий, или скачав последний снимок) и скомпилируйте её, возможно эта ошибка уже исправлена.

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

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

Ошибки при выполнении команды make install

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

У вас нет прав пользователя root. Попробуйте выполнить команду make install, используя команду sudo, или станеть пользователем root, используя команду su. Команда sudo применяется следующим образом:

]$ sudo make install

Она спросит пароль; обычно используется собственный пароль или пароль пользователя root. Вы можете испльзовать команду su, чтобы стать польpователем root:

Эта команда тоже спросит пароль, но в данном случае наобходим именно пароль пользователя root. После того, как вы стали пользователем root, просто выполните команду make install.

Пакет, который вы только что скомпилировали не имеет команды установки. В этом случае вам надо скопировать скомпилированный бинарный файл в директорию bin вручную. Если вы выполните команду ls в директории исходного кода, исполняемый файл должен быть светло зеленого цвета. Его надо скопировать в /usr/bin (или, если хотите, в /usr/local/bin) следующей командой:

]$ cp <executablefile> /usr/bin

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

Другие проблемы

Вот список некоторых других возможных проблем и их решения:

Все проходит хорошо, но когда я набираю имя программы, которую только что установил, bash говорить, что не может её найти. Это обычно происходит из-за того, что make install устанавливает все в /usr/local или in /opt/<packagename>. Посмотрите на вывод команды make install: куда скопированы файлы? Попробуйте добвавить эту директорию в переменную PATH (следующий пример приведен для пакета, установленного в /usr/local):

Вам надо заменить /usr/local/bin на директорию, в которой установлены исполняемые файлы вашего пакета. Если это помогло, добавьте эту строку в /etc/profile, чтобы вам не пришлось набирать её каждый раз. Кстати, вы можете контролировать место, куда установится пакет, указав следующую опцию, когда запускаете конфигурационный скрипт:

Измените /usr на директорию, в которую хотите установить пакет. Не забудьте, что вы устанавливаете только префикс; бинарные файлы установятся в свою поддиректорию, библиотеки в свою, заголовочные файлы в свою и т.д. Например при использовании указанного префикса, бинарные файлы будут установлены в /usr/bin.

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

]$ rpm2cpio <pmfile> | cpio -idv

Теперь можно использовать исходный код, извлеченный из rpm файла.

Финальные слова

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

все собирается, запускается. однако make clean и make install не работают:

, дескать, "нет правила для сборки цели clean". Что не так?

версия make: GNU Make 3.82

1 ответ 1

программа gnu/make, если ей не указан файл с правилами, пытается использовать такие имена файлов (именно в таком порядке): GNUmakefile , makefile и Makefile .

в том каталоге, где вы запускаете программу gnu/make, вероятно, и присутствует файл с одним из перечисленных выше имён.

а файл с именем mkf не используется (по умолчанию).

для того, чтобы указать конкретный файл, можно передать программе gnu/make опцию -f имя_файла . например:

su -c make install

Иногда, чтобы освободить место на диске, или при перекомпиляции требуется удалить результаты предыдущей сборки – объектные файлы (*.o), двоичные файлы программы и другие временные файлы. Для этого нужно выполнить команду:

Эта команда удалит вышеуказанные файлы. Операция затронет только файлы в каталоге исходников, т.е. уже установленные в системные каталоги при помощи команды make install файлы затронуты не будут.

Если вы хотите привести исходники программы к первоначальному состоянию, т.е. удалить не только двоичные файлы, но и config.log, Makefile и другие, созданные скриптом ./configure, введите:

Теперь для повторной сборки программы вам нужно будет снова запустить ./configure.

И наконец, чтобы отменить действие команды make install, т.е. удалить установленную программу, нужно, как нетрудно догадаться, выполнить:

Как и для make install, этой команде могут потребоваться права root.

make: *** Не заданы цели и не найден make-файл. Останов.

Например, вы можете получить список файлов типа Makefile.linux, Makefile.hpux, Makefile.macosx. Это значит, что для компиляции одной и той же программы на разных платформах автор предусмотрел несколько вариантов Makefile. Другой вариант – если вы загрузили исходный код из CVS, файл будет назван Makefile.cvs. Учтите, что Makefile.in и Makefile.am не относятся к Makefile, это всего лишь заготовки для создания Makefile. Итак, если вы нашли нужный Makefile, запустите make с ключом -f, например, так:

make -f Makefile.cvs

АНТОН ИВАНОВ

Работа с утилитой make

В статье на конкретных примерах рассматриваются варианты применения утилиты make как пользователями, так и разработчиками.

make для пользователей

Начнём с самого начала. Самое главное, но далеко не последнее применение утилиты make – это автоматическая сборка (компиляция) программ. И хотя большинство программ для Linux могут быть получены в двоичном (то есть в скомпилированном виде, в пакетах .deb, .tgz или .rpm), в процессе работы с Linux вам наверняка потребуется собрать программу самостоятельно из исходного кода.

Итак, вы загрузили архив с исходниками программы, скорее всего в виде tarball, т.е. сжатого tar-архива. Распространены две программы сжатия: gzip и bzip2 (последняя сжимает файлы лучше, но медленнее). Имена файлов таких архивов оканчиваются соответственно на .tar.gz (или .tgz) и tar.bz2 (или .tbz). Распакуйте архив командой:

tar xzvf имя_файла.tar.gz

tar xjvf имя_файла.tar.bz2

Другой вид распространения исходных кодов – в пакетах .src.rpm, в этом случае просто установите такой пакет как обычно, и исходники появятся в каталоге /usr/src/RPM/SOURCES.

Первым этапом в сборке программы является настройка командой ./configure (она определяет параметры системы и создает Makefile, наиболее подходящий для данной конфигурации), но нас интересует следующий шаг – сама компиляция при помощи команды make.

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

Когда управление будет возвращено оболочке, т.е. появится приглашение ввода команд, внимательно просмотрите последние несколько строк, выведенных командой make. Если среди них есть «Error», или «Ошибка», это значит, что программа не скомпилировалась. Это может быть вызвано множеством причин: отсутствием каких-либо пакетов, ошибкой в программе, отсутствием прав записи в какой-либо файл или каталог и т. д. Еще раз внимательно перечитайте файлы README и INSTALL в каталоге с исходниками программы.

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

Если вы сомневаетесь, нормально ли скомпилировалась программа, сразу же после завершения работы make выполните команду:

На экран будет выведен код возврата программы. Он показывает, успешно ли завершилось выполнение программы. Если он равен нулю, то всё нормально, если отличен от нуля – произошла ошибка.

После команды make можно указывать цели сборки. Цель – это то, что нужно сделать программе make. В большинстве случаев, если цель не указана, то происходит сборка программы. Если выполнить команду:

то произойдет установка программы. Обратите внимание, что при выполнении этой команды файлы скорее всего будут скопированы в каталоги, в которые доступ на запись для простых пользователей закрыт. Поэтому вам нужно либо получить права суперпользователя (вы ведь не работаете постоянно под root, правда?), либо использовать программу su:

su -c make install

Иногда, чтобы освободить место на диске, или при перекомпиляции требуется удалить результаты предыдущей сборки – объектные файлы (*.o), двоичные файлы программы и другие временные файлы. Для этого нужно выполнить команду:

Эта команда удалит вышеуказанные файлы. Операция затронет только файлы в каталоге исходников, т.е. уже установленные в системные каталоги при помощи команды make install файлы затронуты не будут.

Если вы хотите привести исходники программы к первоначальному состоянию, т.е. удалить не только двоичные файлы, но и config.log, Makefile и другие, созданные скриптом ./configure, введите:

Теперь для повторной сборки программы вам нужно будет снова запустить ./configure.

И наконец, чтобы отменить действие команды make install, т.е. удалить установленную программу, нужно, как нетрудно догадаться, выполнить:

Как и для make install, этой команде могут потребоваться права root.

Например, вы можете получить список файлов типа Makefile.linux, Makefile.hpux, Makefile.macosx. Это значит, что для компиляции одной и той же программы на разных платформах автор предусмотрел несколько вариантов Makefile. Другой вариант – если вы загрузили исходный код из CVS, файл будет назван Makefile.cvs. Учтите, что Makefile.in и Makefile.am не относятся к Makefile, это всего лишь заготовки для создания Makefile. Итак, если вы нашли нужный Makefile, запустите make с ключом -f, например, так:

make -f Makefile.cvs

Вы начали компилировать программу, но вдруг. Ошибка 1. Что делать? Для начала еще раз перечитайте документацию к программе. Если ситуация не прояснилась, попробуйте запустить make с ключом -i, означающим «игнорировать все ошибки»:

Теперь давайте заглянем внутрь Makefile. Попробуем его немного поизменять. Откройте в своем любимом текстовом редакторе, например, Makefile из исходного кода Linux (если у вас установлены исходники Linux, то это /usr/src/linux/Makefile). Посмотрите на самые первые строчки:

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

и пересобрав ядро, вы можете потом хвастаться перед друзьями командой uname -r, которая будет показывать доставшуюся вам сверхсекретную версию ядра (3.0.0.topsecret).

Если же говорить о практическом применении, то иногда вам может потребоваться немного изменить Makefile, скажем, для того, чтобы исключить компиляцию какой-либо программы из большого пакета утилит. Пример: вы загрузили свежую версию утилит KDE (пакет kdeutils). Но какая-то программа из этого пакета никак не компилируется, и make -i не помогает. Допустим, программой, на которой происходит ошибка, является kedit. Откройте kdeutils/Makefile. Теперь просто найдите все встречающиеся слова «kedit» (в редакторе vim для этого введите /kedit) и удалите их:

TOPSUBDIRS = kdf kedit kfloppy

Это список подкаталогов с исходным кодом различных программ. Утилита make по очереди заходит в каждый из них и выполняет Makefile, находящийся в этом подкаталоге. Удалите слово kedit, сохраните файл и снова запустите make. Вы увидите, что сборка kedit будет пропущена.

make для разработчиков

Пока ваша программа состоит из одного файла, проще всего компилировать ее командой:

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

Для примера создадим простую программу на C, вычисляющую квадрат числа. Она будет состоять из двух файлов: главного (main.c) и kvadrat.c, содержащего функцию возведения в квадрат. Ниже приведен исходный код этой программы:

printf("Program calculates the square of a number. ");

printf("Please enter an integer: ");

printf("%d x %d = %d ", a, a, rslt);

return number * number;

Заранее скажу, что и эту программу можно скомпилировать довольно быстро без помощи Makefile командой cc *.c. Но мы все будем делать «по-правильному».

Сборка программы у нас будет разбита на два этапа: препроцессинг и компиляция, т.е. преобразование исходного кода в объектный код (файлы *.o), и сборка и линковка, т.е. объединение .o-файлов в один исполняемый файл и подключение динамических библиотек. Первый этап выполняется командой «gcc -c -o», второй – «gcc -o». gcc при запуске пытается осуществить все этапы сборки программы; параметр -c означает, что нужно только получить объектные файлы.

Итак, как вы уже знаете, утилита make ищет файл с именем Makefile. Создайте его.

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

цель: зависимость_1 зависимость_2 зависимость_N

Давайте рассуждать логически. Нам требуется собрать программу, пусть имя ее исполняемого файла будет «kv». У нас два файла с исходным кодом, каждый из них должен быть преобразован в .o-файл (принято называть объектные файлы так же, как и исходные файлы, но с расширением .o; в нашем случае это будут main.o и kvadrat.o). Именно они необходимы для сборки исполняемого файла, значит, они являются зависимостями. Ну а про команды уже было сказано выше. Итак, Makefile должен выглядеть так:

kv: main.o kvadrat.o

cc -o kv main.o kvadrat.o

cc -c -o main.o main.c

cc -c -o kvadrat.o kvadrat.c

Здесь нужно обратить внимание на несколько особенностей:

Для понятности я опишу логику работы утилиты make с этим Makefile: сначала проверяется наличие файла main.o – первой зависимости у цели kv. Если его нет, то выполняется его компиляция, если есть, то проверяется, не был ли изменен файл main.c с момента последней его компиляции (вот зачем нужно указывать main.c как зависимость для main.o!). Если он был изменен, он компилируется заново. Если же он не был изменен, то просто пропускается; таким образом при повторной сборке можно значительно сократить затрачиваемое время.

Далее та же проверка происходит и для kvadrat.o, и как только будут получены main.o и kvadrat.o, включающие все изменения в исходном коде, начнется сборка исполняемого файла.

Итак, сохраните Makefile и запустите make. Должны появиться два .o-файла и сам исполняемый файл kv. Для проверки запустите его:

Теперь давайте добавим в Makefile еще одну цель: clean. При вводе make clean должны удаляться три полученных в результате компиляции файла. Допишите в конец Makefile такие строки:

Сохранив Makefile, введите make clean. Все три двоичных файла будут удалены.

Теперь создадим последнюю цель – install. Она будет служить для копирования двоичного файла программы в системный каталог.

Добавьте в конец Makefile следующие строки:

install -D -m 544 kv /opt/kv/kv

Запустите make install, затем введите команду:

чтобы убедиться в правильности установки.

После параметра -m у команды install указываются права доступа, предпоследним параметром – файл, который нужно скопировать, последним параметром является каталог назначения с именем файла (т.е. исполняемый файл можно установить под другим именем, введя, например, /opt/kv/program_name в качестве последнего параметра).

Теперь поговорим о переменных. Представьте, что вам нужен Makefile для более сложного проекта, где в каталог назначения копируется одновременно несколько файлов. Вы укажете путь установки для каждого из них, например, так:

install /opt/kv/file2 и т.д.

Но вдруг вам потребовалось изменить путь установки. Вам придется поменять параметр у каждой команды. И хотя это можно сделать относительно быстро при помощи команды «заменить» в текстовом редакторе, проще всего определить переменную один раз в начале Makefile и потом использовать ее (при необходимости изменяя только ее значение). Добавьте в начало Makefile определение переменной:

И затем измените команду install таким образом:

install -D -m 544 kv $(INSTALL_PATH)/kv

На что здесь нужно обратить внимание:

  • в объявлении переменной указывается просто ее имя, а когда вы ее используете – знак $ и имя;
  • если имя переменной состоит более чем из одного символа, при ее использовании нужно заключать такое имя в скобки;
  • нужно или нет ставить косую черту в значении переменной (/opt/kv/ или /opt/kv)? Ответ: лучше перестраховаться и поставить. Как вы можете заметить, в команде установки косая черта идет подряд дважды: /opt/kv//kv (одна косая черта из значения переменной, другая – из записи $(INSTALL_PATH)/kv). Это не приведет к ошибке – вы можете поставить символ «/» хоть десять раз подряд. А вот если забудете поставить ее хотя бы один раз, то результаты, ясное дело, будут отличаться от ожидаемых.

Теперь рассмотрим такой момент: допустим, нужно выполнить некоторую команду и присвоить переменной выводимое этой командой значение. Например, если для разных версий ядра Linux существуют разные версии вашей программы. В таком случае при выполнении установки программы на системе с ядром 2.6.1 можно установить ее в каталог /opt/kv/2.6.1/, а если система запущена с ядром 2.4.24 – в каталог /opt/kv/2.4.24/. Версию ядра можно определить при помощи команды uname -r (попробуйте выполнить ее, чтобы посмотреть вашу версию ядра). Вопрос в том, как же передать полученное значение переменной? Очень просто:

INSTALL_PATH = /opt/kv/`uname -r`/

Теперь установка будет производиться в каталог /opt/kv/версия_вашего_ядра/. Обратите внимание на косые кавычки: они вводятся при помощи Shift+

(крайняя левая клавиша в ряду кнопок с цифрами).

backup: backup/1 backup/2 backup/3

Домашнее задание для вас: разберитесь, как работает этот пример, а к первому добавьте цель uninstall, так, чтобы при выполнении команды make uninstall установленная программа удалялась.

Читайте также: