- Как использовать GNU Make в Windows?
- test-tool run-command : научиться управлять (частями) тестового набора
- Как запустить makefile под WINDOWS.
- Gnu makefile on windows
- Capabilities of Make
- Make Rules and Targets
- Advantages of GNU Make
- Makefiles And Conventions
- Downloading Make
- Documentation
- Mailing lists
- Getting involved
- Licensing
- Make files not war: что такое утилита GNU make, зачем ее использовать и как это делать правильно
- Почему стоит использовать утилиту make
- Пишем make-файлы
- Вызываем make
- Специальные цели
- Переменные и функции
- Основные операции
- Передача аргументов встроенным шаблонным правилам
- Программные переменные
- Функции нескольких переменных
- Продвинутое использование переменных
- Замена суффиксов
- Целезависимые переменные
- Интеграция с внешними процессами
- Определение шаблонных правил
- Динамические переменные
- Итоги
Как использовать GNU Make в Windows?
Я установил MinGW и MSYS, добавил C:\MinGW\bin в PATH , но я все еще не могу запустить Makefile в Windows cmd . Я хотел бы запустить cmd.exe и там введите, например, make all , но мой cmd говорит, что такой команды нет.
Что мне делать? Я не хочу использовать оболочку MSYS, это не главное. Любые идеи о том, как использовать GNU Make в Windows cmd, как я могу это сделать в Ubuntu? Меня не интересует Cygwin .
Вот как я получил его для работы:
Затем я могу открыть командную строку и набрать make:
Это означает, что он работает сейчас!
Я использую GNU Make из проекта GnuWin32, см. http://gnuwin32.sourceforge.net/, но каких-то обновлений на некоторое время не было, поэтому я не уверен в этом статусе проекта.
Хотя этот вопрос старый, его все же задают многие, кто использует MSYS2.
Я начал использовать его в этом году, чтобы заменить CygWin, и я очень доволен.
Чтобы установить make , откройте оболочку MSYS2 и введите следующие команды:
Вы можете добавить папку приложения в свой путь из командной строки, используя:
setx PATH “% PATH%; c:\MinGW\bin”
Обратите внимание, что вам, вероятно, нужно будет открыть новое окно команд для изменения измененного параметра пути.
В качестве альтернативы, если вы просто хотите установить make, вы можете использовать диспетчер пакетов chocolatey для установки gnu make с помощью
choco install make -y
Это касается любых проблем с путями, которые могут у вас возникнуть.
user1594322 дал правильный ответ, но когда я попробовал это, я столкнулся с проблемами администратора/разрешения. Я смог скопировать “mingw32-make.exe” и вставить его, переопределив/обойдя проблемы администратора, а затем отредактировав копию в “make.exe”. На VirtualBox в гостях Win7.
Ответ пользователя 1594322 хороший, у меня сейчас работает (mingw64). Спасибо!
Хотя make сам по себе доступен как отдельный исполняемый файл ( gnuwin32.sourceforge.net пакет make ), его использование в надлежащей среде разработки означает использование msys2.
Git 2.24 (Q4 2019) показывает, что:
test-tool run-command : научиться управлять (частями) тестового набора
Signed-off-by: Johannes Schindelin
Git для Windows переключается между циклами, предоставляя среду разработки, которая позволяет собирать Git и запускать его набор тестов.
Для этого вся система MSYS2, включая GNU make и GCC, предлагается как “Git для Windows SDK”.
Это имеет свою цену: первоначальная загрузка указанного SDK весит несколько сотен мегабайт, а распакованный SDK занимает
2 ГБ дискового пространства.
Гораздо более естественной средой разработки для Windows является Visual Studio. Чтобы помочь разработчикам использовать эту среду, у нас уже есть цель Makefile vcxproj , которая генерирует коммит с файлами проекта (и другими сгенерированными файлами), и ветвь vs/master Git for Windows непрерывно перегенерируется с использованием этой цели.
Идея состоит в том, чтобы позволить сборку Git в Visual Studio и запускать отдельные тесты с использованием Portable Git.
Как запустить 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 очищает от прежней сборки файлов.
Вот можно видео глянуть как это происходит.
Продолжение здесь.
Gnu makefile on windows
GNU Make is a tool which controls the generation of executables and other non-source files of a program from the program’s source files.
Make gets its knowledge of how to build your program from a file called the makefile, which lists each of the non-source files and how to compute it from other files. When you write a program, you should write a makefile for it, so that it is possible to use Make to build and install the program.
Capabilities of Make
- Make enables the end user to build and install your package without knowing the details of how that is done — because these details are recorded in the makefile that you supply.
- Make figures out automatically which files it needs to update, based on which source files have changed. It also automatically determines the proper order for updating files, in case one non-source file depends on another non-source file.
As a result, if you change a few source files and then run Make, it does not need to recompile all of your program. It updates only those non-source files that depend directly or indirectly on the source files that you changed.
Make Rules and Targets
A rule in the makefile tells Make how to execute a series of commands in order to build a target file from source files. It also specifies a list of dependencies of the target file. This list should include all files (whether source files or other targets) which are used as inputs to the commands in the rule.
Here is what a simple rule looks like:
When you run Make, you can specify particular targets to update; otherwise, Make updates the first target listed in the makefile. Of course, any other target files needed as input for generating these targets must be updated first.
Make uses the makefile to figure out which target files ought to be brought up to date, and then determines which of them actually need to be updated. If a target file is newer than all of its dependencies, then it is already up to date, and it does not need to be regenerated. The other target files do need to be updated, but in the right order: each target file must be regenerated before it is used in regenerating other targets.
Advantages of GNU Make
GNU Make has many powerful features for use in makefiles, beyond what other Make versions have. It can also regenerate, use, and then delete intermediate files which need not be saved.
GNU Make also has a few simple features that are very convenient. For example, the -o file option which says «pretend that source file file has not changed, even though it has changed.» This is extremely useful when you add a new macro to a header file. Most versions of Make will assume they must therefore recompile all the source files that use the header file; but GNU Make gives you a way to avoid the recompilation, in the case where you know your change to the header file does not require it.
However, the most important difference between GNU Make and most versions of Make is that GNU Make is free software.
Makefiles And Conventions
We have developed conventions for how to write Makefiles, which all GNU packages ought to follow. It is a good idea to follow these conventions in your program even if you don’t intend it to be GNU software, so that users will be able to build your package just like many other packages, and will not need to learn anything special before doing so.
Downloading Make
Make can be found on the main GNU ftp server: http://ftp.gnu.org/gnu/make/ (via HTTP) and ftp://ftp.gnu.org/gnu/make/ (via FTP). It can also be found on the GNU mirrors; please use a mirror if possible.
Documentation
Documentation for Make is available online, as is documentation for most GNU software. You may also find more information about Make by running info make or man make, or by looking at /usr/share/doc/make/, /usr/local/doc/make/, or similar directories on your system. A brief summary is available by running make —help.
Mailing lists
Make has the following mailing lists:
- bug-make is used to discuss most aspects of Make, including development and enhancement requests, as well as bug reports.
- help-make is for general user help and discussion.
Announcements about Make and most other GNU software are made on info-gnu (archive).
Security reports that should not be made immediately public can be sent directly to the maintainer. If there is no response to an urgent issue, you can escalate to the general security mailing list for advice.
Getting involved
Development of Make, and GNU in general, is a volunteer effort, and you can contribute. For information, please read How to help GNU. If you’d like to get involved, it’s a good idea to join the discussion mailing list (see above).
Test releases Trying the latest test release (when available) is always appreciated. Test releases of Make can be found at http://alpha.gnu.org/gnu/make/ (via HTTP) and ftp://alpha.gnu.org/gnu/make/ (via FTP). Development For development sources, issue trackers, and other information, please see the Make project page at savannah.gnu.org. Translating Make To translate Make’s messages into other languages, please see the Translation Project page for Make. If you have a new translation of the message strings, or updates to the existing strings, please have the changes made in this repository. Only translations from this site will be incorporated into Make. For more information, see the Translation Project. Maintainer Make is currently being maintained by Paul Smith. Please use the mailing lists for contact.
Licensing
Make is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version.
“The Free Software Foundation (FSF) is a nonprofit with a worldwide mission to promote computer user freedom. We defend the rights of all software users.”
Please send general FSF & GNU inquiries to . There are also other ways to contact the FSF. Broken links and other corrections or suggestions can be sent to .
For information on coordinating and submitting translations of our web pages, see Translations README. —> Please see the Translations README for information on coordinating and submitting translations of this article.
Copyright © 2019 Free Software Foundation, Inc.
Make files not war: что такое утилита GNU make, зачем ее использовать и как это делать правильно
В этой статье мы поговорим о некоторых тонкостях работы с утилитой GNU make , а также научимся писать простые и аккуратные make-файлы. Последнее особенно важно — make-файлы выглядят сложно и нечитабельно, если им не уделить должного внимания. Это обеспечивает make плохую репутацию, хотя на самом деле инструмент крайне удобный, особенно для автоматизации сборки.
В большинстве проектов, будь то разработка ПО, написание книги или публикация записи в блоге, в какой-то момент приходится генерировать «конечные продукты» из вручную написанных исходных файлов, то есть осуществлять сборку.
Суть автоматической сборки состоит в том, чтобы взять за основу генерацию какого-то одного элемента, вычленить правила, по которым она происходит, и применить их к большему количеству элементов такого же типа, обновляя только изменяемые параметры.
Это может быть сделано (и часто делается) под определенную задачу с помощью кастомных скриптов, но мы в данной статье рассмотрим, как можно удобно автоматизировать сборку, используя утилиту make и её встроенные правила.
Почему стоит использовать утилиту make
- она работает;
- легко настраивается как для новых, так и для существующих проектов;
- в большинстве ОС она предустановлена, если нет — её легко скачать;
- она крошечная и содержит мало зависимостей;
- make-файлы всё-таки могут быть короткими, ёмкими и красивыми;
- она не использует загадочные папки типа working или resource ;
- да и вообще темной магией не занимается — всё на виду.
Пишем make-файлы
Создадим файл и назовем его makefile или Makefile . Содержание стандартного make-файла можно описать так: «если любой из файлов-пререквизитов был изменен, то целевой файл должен быть обновлен». Суть make в том, что нам нужно по определенным правилам произвести какие-то действия с пререквизитами, чтобы получить некую цель.
СберЗдоровье , Удалённо , По итогам собеседования
Правила, которые и составляют основу make-файла, по сути являются командами и могут быть сколь угодно сложными, а также могут содержать в себе вызов других инструментов, таких как компиляторы и парсеры.
Базовый синтаксис для определения цели (в файле makefile ):
Важно Индентация производится с помощью табуляции, а не пробелов.
В командах описывается, что make должна сделать, чтобы создать целевой файл. Они исполняются, когда мы делаем запрос на создание или обновление целевого файла и make заключает, что пререквизиты изменились или целевой файл еще не существует.
Часто нам нужно обрабатывать несколько файлов одного вида по одним и тем же правилам. Например, при создании страниц HTML на основе размеченного текста. Это делается с помощью шаблонных правил, наличие которых является отличительной чертой make в сравнении с обычной сборкой через командную строку.
Шаблонные правила работают на основе сопоставления расширений файлов. Например, make знает, как создавать объектные файлы *.o из исходных C-файлов *.c , компилируя их и передавая компилятору флаг -c . В make есть несколько встроенных шаблонных правил, самые известные из которых используются для компиляции кода на C и C++.
Теперь мы можем упростить make-файл, избегая написания команд в случаях, когда make сама знает, что делать. Главное, не забывать ставить пустую строку после цели — make это нужно, чтобы определять, где кончается одна цель и начинается другая.
В большинстве случаев мы можем даже опустить пререквизиты: внутренние правила make подразумевают, что для того, чтобы, например, собрать somefile.o по принципу Исходник на C → Объектный файл, нам нужен somefile.c .
Будьте аккуратны: когда вы предлагаете make свой список команд, она будет ориентироваться только на ваш код и в данном случае не будет искать шаблонные правила для сборки цели.
Вызываем make
Запустим make в текущей директории:
Если make-файл в ней уже есть, будет создана (собрана) первая цель, которую make сможет найти. Если make-файла нет (или он есть, но в нем нет целей), make об этом сообщит.
Чтобы обратиться к конкретной цели, запустите:
Здесь цель — это название цели (без квадратных скобок).
make может догадаться, что делать, используя встроенные правила, без дополнительной информации от пользователя. Попробуйте создать файл test.c в пустой папке и запустить make . test.make скомпилирует test.c , используя встроенное шаблонное правило, и соберет цель с названием test . Это сработает даже через несколько шагов генерации промежуточных файлов.
Специальные цели
В большинстве make-файлов можно найти цели, называемые специальными. Вот самые распространенные:
- all — собрать весь проект целиком;
- clean — удалить все сгенерированные артефакты;
- install — установить сгенерированные файлы в систему;
- release или dist — для подготовки дистрибутивов (модули и тарболы).
Они не обязательно должны присутствовать в make-файле, но большинство сборочных процессов странно представить без хотя бы первых трех.
При сборке этих целей не будут созданы файлы с именами, например, all или clean . make обычно решает, запускать ли какие-либо процессы, основываясь на данных о том, нужно ли изменять целевой файл. Создание файлов с подобными именами не даст make произвести никаких изменений с целями.
Для предотвращения этого GNU make позволяет помечать такие цели как «фиктивные» (phony), чтобы запускать их в любом случае. Сделать это можно, добавив необходимые цели в качестве пререквизитов во внутреннюю цель .PHONY следующим образом:
Цель all обычно просто содержит главный исполняемый файл в пререквизите — иногда с дополнительными командами для пост-обработки генерируемых файлов. Так как мы в большинстве случаев хотим, чтобы цель all исполнялась по умолчанию, она должна стоять первой в файле.
Для цели clean стоит добавить список команд, удаляющих все генерируемые файлы. Это может быть легко сделано с использованием переменных, о которых мы поговорим в следующем разделе.
Переменные и функции
Как и в большинстве языков программирования, make-файлы можно сделать более читабельными, используя переменные. make импортирует свою среду, позволяя нам определять переменные внутри файла через внешние источники.
Основные операции
Определять переменные и ссылаться на них можно следующим образом:
Ссылаться на переменные можно через $(NAME) или $
Наконец, большинство реализаций make позволяют нам задать выходную переменную с помощью оператора != при порождении одного подпроцесса за операцию.
Передача аргументов встроенным шаблонным правилам
Ранее мы видели некоторые шаблонные правила в действии, правда, во всех случаях они запускали одни и те же базовые команды. Конечно, требования к сборке не всегда одинаковы, и инструменты могут запрашивать разные флаги для разных задач.
Например, какому-то ПО нужно обеспечить соединение с разными библиотеками, или заданные оптимизации различаются для сборки отладки и итоговой сборки.
Поэтому встроенные правила в make включают в себя несколько распространённых переменных в важных местах команд. Мы можем установить их по желанию из make-файла или внешней среды.
Это позволяет, например, запускать один и тот же make-файл с разными компиляторами, снабдив make необходимым именем бинарного файла для выполнения. Так задаётся переменная среды компилятора C:
Вот некоторые из самых известных переменных, которые вы могли видеть, если когда-нибудь заглядывали в make-файл:
- $(CC) / $(CXX) — бинарные файлы для компиляторов C и C++, которые make использует для сборки;
- $(CFLAGS) / $(CXXFLAGS) — флаги, передаваемые компиляторам;
- $(LDLIBS) — присоединяемые библиотеки.
Программные переменные
make хранит некоторые распространённые программы в переменных. В основном это делается для того, чтобы при необходимости их можно было перезаписать.
Самая важная из них — $(MAKE) , которая должна использоваться при рекурсивном вызове make из make-файла. Она принимает во внимание аргументы командной строки из исходного вызова.
В цели clean , главная задача которой — удаление файлов, безопаснее использовать переменную $(RM) вместо прямого вызова rm .
Функции нескольких переменных
GNU make определяет некоторые очень полезные методы, большинство которых работает со словами, то есть с разделенными пробелами строками символов. Это облегчает работу с переменными, содержащими в себе списки файлов.
Функции вызываются таким же образом, как вызывалась бы переменная с таким же именем, но с добавлением аргументов перед закрывающей скобкой.
Вот некоторые наиболее интересные методы:
- $(wildcard шаблон) возвращает список с названиями файлов, соответствующих шаблону, которые в том числе могут представлять собой относительный путь. Список внутри разделен с помощью пробелов, что проблематично для работы с файлами, содержащими пробелы в названии. Лучше всего избегать таких файлов при работе с make . Шаблон может содержать универсальный символ * ;
- $(patsubst шаблон поиска, шаблон замены, список слов) заменяет все слова в списке, которые соответствуют шаблону поиска в соответствии с шаблоном замены. Оба шаблона используют % в качестве символа;
- $(filter-out шаблон поиска, список слов) возвращает список всех слов, отфильтрованных по шаблону поиска;
- $(notdir список слов) возвращает список слов, где имя каждой записи сокращается до основного (то есть если имя содержит название директории, то оно отфильтровывается);
- $(shell команда) запускает команду в подпроцессоре и перехватывает стандартный вывод подобно оператору != . Оболочка для выполнения команды определяется переменной $(SHELL) .
Подробное описание функций можно найти в официальной документации.
Продвинутое использование переменных
Отсылки к переменным можно делать в любом контексте внутри make-файла. Можно даже соорудить имя исполняемого файла внутри списка команд с помощью соединения нескольких переменных. Это позволяет использовать переменные в качестве целей или пререквизитов и создавать простые конструкции типа:
Данный make-файл создает список всех исходных C-файлов в директории, заменяет суффикс .c на .o , используя функцию $(patsubst . ) , и потом использует этот список файлов в качестве пререквизитов к цели all . При запуске make станет собирать цель all , потому что она определена первой. Так как цель зависит от нескольких объектных файлов, которые могут ещё не существовать или должны быть обновлены, а make знает, как их сделать из исходных C-файлов, все запрашиваемые файлы также будут собраны.
Это становится мощным инструментом в сочетании с шаблонными правилами — мы можем автоматически собирать пререквизиты, которые косвенно используются в качестве новых целей.
Замена суффиксов
Для совместимости с другими реализациями make обеспечивает альтернативный синтаксис при вызове функции $(patsubst . ) , называемый «ссылка с заменой» и позволяющий заменить некоторые суффиксы в списке слов на другие.
Make-файл из предыдущего примера можно преобразовать следующим образом:
Важно Вместо функции $(wildcard . ) используется оператор != .
Целезависимые переменные
Это ещё одна интересная особенность, использование которой ведёт к сокращению кода: она позволяет устанавливать переменным разные значения в зависимости от текущей цели.
В этом примере мы бы установили $(FOO) значение bar глобально, значение frob для цели один и значение bar baz для цели два.
Можно использовать любые необходимые операторы присваивания, что позволяет, например, создавать цели с разными наборами флагов для компилятора, просто присвоив переменной $(CFLAGS) разные значения.
Интеграция с внешними процессами
В связи с тем, что дистрибутивы Linux в большинстве случаев поставляются с системой управления пакетами и многие пакеты создаются из проектов, использующих make для сборки, были приняты некоторые общие правила использования переменных.
В основном они касаются установки целей проекта, так как бинарные пакеты часто состоят из результатов запуска make install , упакованных в распространённом формате. Важно запомнить следующие переменные:
- $(DESTDIR) должна быть пустой по умолчанию и никогда не должна задаваться из make-файла (режим чтения). Используется составителями пакета для вставки пути доступа перед устанавливаемыми файлами;
- $(PREFIX) — значение этой переменной в вашем make-файле должно соответствовать /usr/local или другому заданному вами пути. Она позволяет пользователю пакета задать желаемую директорию для установки. Задавайте значение этой переменной, только если оно не было передано окружением (используя оператор ?= ).
Определение шаблонных правил
Синтаксис для написания шаблонных правил во многом похож на обычный синтаксис целей. Основное отличие состоит в использовании шаблонного символа % в основе цели (её имени до расширения), который и будет применяться для поиска соответствий.
Шаблон также может быть использован в списке пререквизитов, где он будет заменён на основу для формирования неявно определённых пререквизитов. (Список пререквизитов в случае чего можно расширить и явно определёнными.)
Также можно перезаписать любое из встроенных правил с помощью определения правила с такой же целью и пререквизитами.
Так как шаблонное правило должно быть написано таким образом, чтобы отличаться от реальных имён файлов, с которыми оно вызывается, make предоставляет специальные переменные для определения шаблонных правил.
Динамические переменные
Все имена динамических переменных состоят из одного знака, поэтому скобки для ссылки на них не нужны. Таких переменных довольно много, рассмотрим наиболее необходимые:
- $@ — полное название цели;
- $ — имя первого пререквизита (в том числе косвенно сгенерированного поиском по шаблону);
- $^ — разделенный пробелами список всех пререквизитов (версия GNU).
Шаблонное правило, конвертирующее размеченные файлы в HTML с использованием markdown , получает такой вид:
Итоги
Ранее мы разобрали некоторые из наиболее трудных аспектов в контексте make-файлов. Перед вами относительно сложный, но тем не менее полезный make-файл, использующийся для статей на сайте автора:
Скрипт generate_article.py реализует минималистичный шаблонизатор, используя index.htm в качестве базы для вставки HTML, сгенерированного из входных файлов. Присутствие шаблонизатора в пререквизитах шаблонного правила обеспечивает, что изменения в шаблонизаторе вызовут изменения всех файлов, относящихся к статье.
Для дальнейшего изучения make рекомендуем ознакомиться с официальным руководством.