Makefile vs code windows

Что такое 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: полезный универсальный инструмент программиста — видео-версия данного гайда.

Мейкфайлы, использованные при составлении гайда:

Create a C++ makefile project

A makefile is a text file that contains instructions for how to compile and link (or build) a set of C++ source code files. A make program reads the makefile and invokes a compiler, linker and possibly other programs to make an executable file. Microsoft’s implementation of the make program is called NMAKE.

If you have an existing makefile project, you have these choices if you want to code and/or debug it in the Visual Studio IDE:

  • Create a makefile project in Visual Studio that uses your existing makefile to configure a .vcxproj file that Visual Studio will use for IntelliSense. (You will not have all the IDE features that you get with a native MSBuild project.) See To create a makefile project below.
  • Use the Create New Project from Existing Code Files wizard to create a native MSBuild project from your source code. The original makefile will not be used after this. For more information, see How to: Create a C++ Project from Existing Code.
  • Visual Studio 2017 and later: Use the Open Folder feature to edit and build a makefile project as-is without any involvement of the MSBuild system. For more information, see Open Folder projects for C++.
  • Visual Studio 2019 and later: Create a UNIX makefile project for Linux.

To create a makefile project with the makefile project template

In Visual Studio 2017 and later, the Makefile project template is available when the C++ Desktop Development workload is installed.

Follow the wizard to specify the commands and environment used by your makefile. You can then use this project to build your code in Visual Studio.

By default, the makefile project displays no files in Solution Explorer. The makefile project specifies the build settings, which are reflected in the project’s property page.

The output file that you specify in the project has no effect on the name that the build script generates; it declares only an intention. Your makefile still controls the build process and specifies the build targets.

To create a makefile project in Visual Studio 2019

From the Visual Studio main menu, choose File > New > Project and type «makefile» into the search box. Or, in the New Project dialog box, expand Visual C++ > General (Visual Studio 2015) or Other (Visual Studio 2017) and then select from the two options depending on whether you will be targeting Windows or Linux.

Читайте также:  Zabbix не видит агент windows

Windows only: In the Debug Configuration Settings page, provide the command, output, clean, and rebuild information for debug and retail builds. Click Next if you want to specify different settings for a Release configuration.

Click Finish to close the dialog and open the newly created project in Solution Explorer.

To create a makefile project in Visual Studio 2015 or Visual Studio 2017

From the Visual Studio start page, type «makefile» in the New Project search box. Or, in the New Project dialog box, expand Visual C++ > General (Visual Studio 2015) or Other (Visual Studio 2017) and then select Makefile Project in the Templates pane to open the project wizard.

In the Application Settings page, provide the command, output, clean, and rebuild information for debug and retail builds.

Click Finish to close the wizard and open the newly created project in Solution Explorer.

You can view and edit the project’s properties in its property page. See Set C++ compiler and build properties in Visual Studio for information about displaying the property page.

Makefile project wizard

After you create a makefile project, you can view and edit each of the following options in the Nmake page of the project’s property page.

Build command line: Specifies the command line to run when the user selects Build from the Build menu. Displayed in the Build command line field on the Nmake page of the project’s property page.

Output: Specifies the name of the file that will contain the output for the command line. By default, this option is based on the project name. Displayed in the Output field on the Nmake page of the project’s property page.

Clean commands: Specifies the command line to run when the user selects Clean from the Build menu. Displayed in the Clean command line field on the Nmake page of the project’s property page.

Rebuild command line: Specifies the command line to run when the user selects Rebuild from the Build menu. Displayed in the Rebuild all command line field on the Nmake page of the project’s property page.

How to: Enable IntelliSense for Makefile Projects

IntelliSense fails in makefile projects when certain project settings or compiler options are set up incorrectly. Follow these steps to configure makefile projects so that IntelliSense works as expected:

Open the Property Pages dialog box. For details, see Set C++ compiler and build properties in Visual Studio.

Expand the Configuration Properties node.

Select the NMake property page, and then modify properties under IntelliSense as appropriate.

Set the Preprocessor Definitions property to define any preprocessor symbols in your makefile project. See /D (Preprocessor Definitions), for more information.

Set the Include Search Path property to specify the list of directories that the compiler will search to resolve file references that are passed to preprocessor directives in your makefile project. See /I (Additional Include Directories), for more information.

For projects that are built using CL.EXE from a Command Window, set the INCLUDE environment variable to specify directories that the compiler will search to resolve file references that are passed to preprocessor directives in your makefile project.

Set the Forced Includes property to specify which header files to process when building your makefile project. See /FI (Name Forced Include File), for more information.

Set the Assembly Search Path property to specify the list of directories that the compiler will search to resolve references to .NET assemblies in your project. See /AI (Specify Metadata Directories), for more information.

Set the Forced Using Assemblies property to specify which .NET assemblies to process when building your makefile project. See /FU (Name Forced #using File), for more information.

Читайте также:  Bootcamp для mac os big sur

Set the Additional Options property to specify additional compiler switches to be used by IntelliSense when parsing C++ files.

Click OK to close the property pages.

Use the Save All command to save the modified project settings.

The next time you open your makefile project in the Visual Studio development environment, run the Clean Solution command and then the Build Solution command on your makefile project. IntelliSense should work properly in the IDE.

Как запустить 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, так как это мой случай:

  1. Чтобы установить Ubuntu Bash: https://itsfoss.com/install-bash-on-windows/
  2. Оказавшись в консоли, для установки make просто наберите «make», и он даст инструкции для его загрузки.

Дополнительно:

  1. Полезное включение копирования / вставки в Bash: Копировать Вставить в Bash в Ubuntu в Windows
  2. В моем случае эта модель называется Maven, поэтому я должен установить ее также: /ubuntu/722993/unable-to-locate-package-maven
  3. Для доступа к файловой системе C: Windows, например: «cd / mnt / c /»

Я использую набор инструментов MinGW , который предоставляет mingw32-make инструмент для сборки, если он есть в вашей PATH системной переменной , в командной строке Windows просто перейдите в каталог, содержащий файлы, и введите следующую команду:

Оцените статью