- MAKEFILE И КОМПИЛЯЦИЯ ПРОГРАММЫ
- Что такое Makefile и как начать его использовать
- Введение
- Что такое make и Makefile
- Синтаксис Makefile
- Продвинутое использование
- Фальшивая цель
- Последовательный запуск команд и игнорирование ошибок
- Переменные
- Заключение
- Дополнительные материалы
- Как запустить makefile под WINDOWS.
- Как запустить make-файл в Windows?
MAKEFILE И КОМПИЛЯЦИЯ ПРОГРАММЫ
Сначала создадим на диске папку, где будут находиться файлы вашего проекта. Запустим редактор программиста Programmers Notepad [WinAVR]. В меню редактора выберем File -> New -> C/C++ и напишем программу на языке Си. Сохраним листинг программы в предварительно созданной нами папке в файле с именем «my_test.c» (каждый проект лучше сохранять в отдельной папке). Имя файла может быть любым без пробелов и иметь расширение «.c» .
В WinAVR исходный текст программы компилируется при помощи утилиты make.exe, которая находится в папке WinAVR\utils\bin. Make.exe контролирует генерацию исполняемых файлов из исходного кода программы. Для управления работой этой утилиты используют make-файлы. Make-файл сообщает компилятору, какие команды запускать, какие файлы компилировать и линковать, какой выходной код генерировать и т. д. После установки WinAVR в папке WinAVR\sample можно найти шаблон с именем Makefile, который нужно скопировать в папку с проектом и уже там редактировать. Внимание: Makefile и компилируемый файл (в нашем случае my_test.c ) должны находиться в одной папке. Откроем Makefile в редакторе Programmers Notepad и отредактируем несколько важных для компилятора инструкций. Во-первых, обязательно нужно указать, для какого типа микроконтроллера мы хотим получить выходной код. Найдем следующие строки: # MCU name Первая строка — комментарий, а во второй вместо atmega128 пишем тот микроконтроллер, который нас интересует (например, atmega8, attiny2313, attiny26). Частота тактирования микроконтроллера в герцах определяется в строках: # Processor frequency. Вместо 8000000 напишем 1000000, что будет составлять 1 мегагерц (1 МГц). # Processor frequency. Имя проекта, а соответственно и имя исходного файла с функцией main и выходные файлы с расширениями hex и cof, определяется в следующих строках: # Target file name (without extension). Здесь вместо testpp пишем нужное имя проекта (в нашем случае my_test ). # List C source files here. (C dependencies are automatically generated.) После знака «равно» пишем $(TARGET).c, чтобы получилось # List C source files here. (C dependencies are automatically generated.) # List C++ source files here. (C dependencies are automatically generated.) Стираем запись после знака «равно». Должно получиться: # List C++ source files here. (C dependencies are automatically generated.) В разделе Optimization level проверяем уровень оптимизации. Можно оставить все как есть (s — оптимизирует выходной файл по размеру). # Optimization level, can be [0, 1, 2, 3, s]. После этого, немного ниже, ищем раздел: В дальнейшем в статьях раздела «Шаг за шагом» мы будем опираться на вариант программатора USBASP. AVRDUDE_PORT = com1 # programmer connected to serial device Программатор USBASP использует USB-порт. Вы можете использовать более удобный шаблон Makefile, в котором часто изменяемые опции вынесены в начало файла. В простейшем случае для использования этого Makefile’а достаточно скопировать его в папку с проектом и изменить, если потребуется, строки в разделе «ОСНОВНЫЕ ИНСТРУКЦИИ». Кроме того, в состав пакета WinAVR входит утилита MFile , которая помогает правильно составить или отредактировать Makefile. Запустить утилиту можно через меню «Пуск -> Программы -> WinAVR -> MFile [WinAVR]»
Откройте в редакторе Programmers Notepad исходный текст программы my_test.c, в меню выберете Tools -> [WinAVR] Make All. Команда Make All выполняет компиляцию исходного кода программы и в случае отсутствия ошибок генерирует файл, который можно прошивать в микроконтроллер AVR. Внизу, в окне «Output», должно появиться сообщение об успешной компиляции: А в папке вашего проекта должны появиться следующие файлы: Самым главным из этих файлов для нас будет файл my_test.hex. В нем хранится шестнадцатиричный код для загрузки в память программ (Flash ROM) микроконтроллера. В файле my_test.eep хранится шестнадцатиричный код для загрузки в энергонезависимую память данных (EEPROM). Следует помнить, что после каждого изменения кода программа должна быть перекомпилирована, т.е. в редакторе Programmers Notepad выполнено Tools -> [WinAVR] Make All. Если проект будет состоять из нескольких файлов и в одном из них что-то изменили, то при повторной компиляции будет компилироваться только измененный файл. Для полной перекомпиляции необходимо вначале выполнить команду Tools -> [WinAVR] Make Clean, а затем команду [WinAVR] Make All. Команда Make Clean удаляет все файлы, сгенерированные предыдущей командой Make All. |
Это оригинальная статья myROBOT.ru Постоянный адрес статьи: http://myrobot.ru/stepbystep/mc_makefile.php |
Исходный текст программы «ПРИМЕР МИГАНИЯ СВЕТОДИОДАМИ»
my_test.c
Что такое Makefile и как начать его использовать
Гайд по основам make и Makefile для использования в собственных проектах.
Содержание
Введение
В жизни многих разработчиков найдётся история про первый рабочий день с новым проектом. После клонирования основного репозитория проекта наступает этап, когда приходится вводить множество команд с определёнными флагами и в заданной последовательности. Без описания команд, в большинстве случаев, невозможно понять что происходит, например:
Эти команды являются лишь частью того, что необходимо выполнить при разворачивании проекта. В приведённом примере видно, что команды сами по себе длинные, содержат много флагов, а значит, их трудно не только запомнить, но и вводить вручную. Постоянно вести документацию становится сложнее с ростом проекта, она неизбежно устаревает, а порог входа для новичков становится выше, ведь уже никто не в состоянии вспомнить всех деталей проекта. Некоторые такие команды необходимо использовать каждый день, и даже не один раз в день.
Со временем становится понятно, что нужен инструмент, способный объединить в себе подобные команды, предоставить к ним удобные шорткаты (более короткие и простые команды) и обеспечить самодокументацию проекта. Именно таким инструментом стал Makefile и утилита make . Этот гайд расскажет, как использование этих инструментов позволит свести процесс разворачивания проекта к нескольким коротким и понятным командам:
Что такое make и Makefile
Makefile — это файл, который хранится вместе с кодом в репозитории. Его обычно помещают в корень проекта. Он выступает и как документация, и как исполняемый код. Мейкфайл скрывает за собой детали реализации и раскладывает “по полочкам” команды, а утилита make запускает их из того мейкфайла, который находится в текущей директории.
Изначально make предназначалась для автоматизации сборки исполняемых программ и библиотек из исходного кода. Она поставлялась по умолчанию в большинство *nix дистрибутивов, что и привело к её широкому распространению и повсеместному использованию. Позже оказалось что данный инструмент удобно использовать и при разработке любых других проектов, потому что процесс в большинстве своём сводится к тем же задачам — автоматизация и сборка приложений.
Применение мейка в проектах стало стандартом для многих разработчиков, включая крупные проекты. Примеры мейкфайла можно найти у таких проектов, как Kubernetes, Babel, Ansible и, конечно же, повсеместно на Хекслете.
Синтаксис Makefile
make запускает цели из Makefile, которые состоят из команд:
Но недостаточно просто начать использовать мейкфайл в проекте. Чтобы получить эффект от его внедрения, понадобится поработать над разделением команд на цели, а целям дать семантически подходящие имена. Поначалу, перенос команд в Makefile может привести к свалке всех команд в одну цель с «размытым» названием:
Здесь происходит сразу несколько действий: создание файла с переменными окружения, подготовка базы данных, генерация ключей, установка зависимостей и запуск проекта. Это невозможно понять из комментариев и названия цели, поэтому будет правильно разделить эти независимые команды на разные цели:
Теперь, когда команды разбиты на цели, можно отдельно установить зависимости командой make install или запустить приложение через make start . Но остальные цели нужны только при первом разворачивании проекта и выполнять их нужно в определённой последовательности. Говоря языком мейкфайла, цель имеет пререквизиты:
Задачи будут выполняться только в указанной последовательности и только в случае успеха предыдущей задачи. Значит, можно добавить цель setup , чтобы объединить в себе все необходимые действия:
Теперь развернуть и запустить проект достаточно двумя командами:
Благодаря проделанной работе Makefile, команды проекта вместе с флагами сведены в Makefile. Он обеспечивает правильный порядок выполнения и не важно, какие при этом задействованы языки и технологии.
Продвинутое использование
Фальшивая цель
Использование make в проекте однажды может привести к появлению ошибки make: is up to date. , хотя всё написано правильно. Зачастую, её появление связано с наличием каталога или файла, совпадающего с именем цели. Например:
Как уже говорилось ранее, изначально make предназначалась для сборок из исходного кода. Поэтому она ищет каталог или файл с указанным именем, и пытается собрать из него проект. Чтобы изменить это поведение, необходимо в конце мейкфайла добавить .PHONY указатель на цель:
Последовательный запуск команд и игнорирование ошибок
Запуск команд можно производить по одной: make setup , make start , make test или указывать цепочкой через пробел: make setup start test . Последний способ работает как зависимость между задачами, но без описания её в мейкфайле. Сложности могут возникнуть, если одна из команд возвращает ошибку, которую нужно игнорировать. В примерах ранее такой командой было создание .env-файла при разворачивании проекта:
Самый простой (но не единственный) способ «заглушить» ошибку — это сделать логическое ИЛИ прямо в мейкфайле:
Добавлять такие хаки стоит с осторожностью, чтобы не «выстрелить себе в ногу» в более сложных случаях.
Переменные
Зачастую в команды подставляют параметры для конфигурации, указания путей, переменные окружения и make тоже позволяет этим управлять. Переменные можно прописать прямо в команде внутри мейкфайла и передавать их при вызове:
Переменные могут быть необязательными и содержать значение по умолчанию. Обычно их объявляют в начале мейкфайла.
Некоторые переменные в Makefile имеют названия отличные от системных. Например, $PWD называется $CURDIR в мейкфайле:
Заключение
В рамках данного гайда было рассказано об основных возможностях Makefile и утилиты make . Более плотное знакомство с данным инструментом откроет множество других его полезных возможностей: условия, циклы, подключение файлов. В компаниях, где имеется множество проектов, написанных разными командами в разное время, мейкфайл станет отличным подспорьем в стандартизации типовых команд: setup start test deploy . .
Возможность описывать в мейкфале последовательно многострочные команды позволяет использовать его как «универсальный клей» между менеджерами языков и другими утилитами. Широкая распространённость этого инструмента и общая простота позволяют внедрить его в свой проект достаточно легко, без необходимости доработок. Но мейкфайл может быть по-настоящему большим и сложным, это можно увидеть на примере реальных проектов:
Дополнительные материалы
- Руководство по современному Make — «выжимка» из документации на русском языке;
- Утилита make: полезный универсальный инструмент программиста — видео-версия данного гайда.
Мейкфайлы, использованные при составлении гайда:
Как запустить makefile под WINDOWS.
Не так давно я пересел на AtmelStudio6 с AVRStudio4. Есть у меня классный программатор клон STK500. Который просто прекрасно работает с 4й версией. Вот и получается, что пишу я теперь проги под 6й версией, а программатором пользуюсь из под 4ой. Неудобно как то. Попробовал подключить программатор к 6й. Работает через пень колоду. То работает, то не работает. Решил я сделать новый, чтоб работал по 6й версией и не пукал. Решил что это будет AVRISP mkII.
Нарыл я проект LUFA. ТУТ
Скачал код, а там торчит makefile. Самой прошивки там нет, чтоб сразу залить в микроконтроллер. Значит надо запустить сборку makefile чтоб родился hex файл. А как это сделать? Без понятия. А надо. Начал рыть. Помог один товарищ линуксоид. Вместе с ним поколупались и нарыли вот что.
1). Установить прогу mingw-get-inst-20120426.exe. В одном из окон при установке галочку поставить напротив msys. Эта прога есть здесь.
2). Установить прогу bc-1.06-2.exe. Отсюда.
3). Указать путь для переменной PATH в XP 32bit,
Переменная PATH находится здесь.
Компьютер/свойства/дополнительно/переменные среды.
C:\MinGW\msys\1.0\bin;
C:\Program Files\GnuWin32\bin;
C:\Program Files\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.2.939\avr8-gnu-toolchain\bin
Для WINDIWS_7 64bit
C:\MinGW\msys\1.0\bin;
C:\Program Files (x86)\GnuWin32\bin;
C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.2.939\avr8-gnu-toolchain\bin
4).Открыть консоль, зайти в нужную папку где находится файл make. Набрать команду make. Вот и все. Там же и появится желанный hex файл. Команда Make clean очищает от прежней сборки файлов.
Вот можно видео глянуть как это происходит.
Продолжение здесь.
Как запустить make-файл в Windows?
У меня есть некоторые загруженные демонстрации, которые идут с Makefile.win и Makefile.sgi. Как я могу запустить их в Windows, чтобы скомпилировать демки?
Если у вас есть Visual Studio, запустите командную строку Visual Studio из меню «Пуск», перейдите в каталог, содержащий Makefile.win и введите следующее:
Вы также можете использовать обычную командную строку и запустить vsvars32.bat (c: \ Program Files (x86) \ Microsoft Visual Studio 9.0 \ Common7 \ Tools for VS2008). Это настроит среду для запуска nmake и поиска инструментов компилятора.
Ознакомьтесь с Cygwin , Unix-подобной средой для Windows
Проверьте GnuWin «s делает , что обеспечивает родной порт для ОС Windows (без необходимости полной среды выполнения , как Cygwin)
Вот мой быстрый и временный способ запустить Makefile
- скачать сделайте из SourceForge: gnuwin32
- установить его
- перейти в папку установки
C: \ Program Files (x86) \ GnuWin32 \ bin
- скопируйте все файлы в папке с папкой, содержащей Makefile
- откройте cmd(вы можете сделать это с помощью правого клика со смещением ) в папке, содержащей Makefile, и запустите
Кроме того, вы можете добавить аргументы после команды, такие как
Этот вопрос может быть старым, но мое решение, которое является самым простым для любого пользователя Windows, я полагаю, не указано в списке.
Шаг 1: Установите менеджер пакетов шоколада для WINDOWS (совместимый с Windows 7+ / Windows Server 2003+) здесь
Шаг 2: беги choco install make
Шаг 3: Прибыль от ухоженного менеджера пакетов. Make будет добавлен в глобальный путь и работает на всех CLI (powershell, git bash, cmd…)
Я не связан с choco, но это просто хорошо.
Если вы устанавливаете Cygwin . Убедитесь, что в программе установки выбрано make. Затем вы можете запустить следующую команду, если у вас есть Makefile.
В Visual Studio 2017 мне пришлось добавить эту папку в переменную env пути Windows 10:
Там также HostX86
Во-первых, добавьте путь общих инструментов visual studio ( c:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools ) в системный путь. Чтобы узнать, как добавить путь в системный путь, посетите этот веб-сайт: http://www.computerhope.com/issues/ch000549.htm . Тебе просто нужно это один раз.
После этого, когда вам нужно, откройте командную строку и выполните команду, vsvars32.bat чтобы добавить пути всех необходимых инструментов Visual Studio в системный путь.
Затем вы можете позвонить nmake -f makefile.mak
PS: Путь к обычным инструментам Visual Studio может отличаться в вашей системе. Пожалуйста, измените его соответственно.
Если это «Makeake-файл NMake», то есть синтаксис и команда совместимы с NMake, он будет работать в Windows. Обычно Makefile.win ( .win суффикс) указывает, что это make-файл, совместимый с Windows NMake. Так что вы можете попробовать nmake -f Makefile.win .
Часто предоставляются стандартные файлы Makefile для Linux, которые NMake выглядят многообещающе. Тем не менее, следующая ссылка берет простой Linux Makefile и объясняет некоторые фундаментальные проблемы, с которыми можно столкнуться. Он также предлагает несколько альтернатив для обработки Linux Makefiles в Windows.
Я попробовал с cygwin & gnuwin, и у меня ничего не вышло, наверное, потому что в make-файле использовался в основном специфический код Linux.
Он работал с Ubuntu Bash для Windows 10 . Это чудо, если вы пришли из MAC, так как это мой случай:
- Чтобы установить Ubuntu Bash: https://itsfoss.com/install-bash-on-windows/
- Оказавшись в консоли, для установки make просто наберите «make», и он даст инструкции для его загрузки.
Дополнительно:
- Полезное включение копирования / вставки в Bash: Копировать Вставить в Bash в Ubuntu в Windows
- В моем случае эта модель называется Maven, поэтому я должен установить ее также: /ubuntu/722993/unable-to-locate-package-maven
- Для доступа к файловой системе C: Windows, например: «cd / mnt / c /»
Я использую набор инструментов MinGW , который предоставляет mingw32-make инструмент для сборки, если он есть в вашей PATH системной переменной , в командной строке Windows просто перейдите в каталог, содержащий файлы, и введите следующую команду: