Хорошие методы использования Makefiles в VisualStudio?

Я знаю, что идеальный способ создания проектов - это не требовать файлов проекта на основе IDE, поскольку теоретически это вызывает всевозможные проблемы с автоматизацией, а что нет. Но мне еще предстоит работать над проектом, который компилируется в Windows и не зависит от проекта VisualStudio (хорошо, очевидно, что некоторые вещи с открытым исходным кодом выполняются с помощью Cygwin, но я здесь в общих чертах).

С другой стороны, если мы просто используем VS для запуска make-файла, мы теряем все преимущества окна параметров компиляции, и становится сложно поддерживать внешний make-файл.

Итак, как люди, использующие VS, на самом деле обрабатывают внешние make-файлы? Мне еще предстоит найти безболезненную систему для этого...

Или на самом деле большинство людей этого не делают, хотя это проповедуется как хорошая практика?


person Robert Gould    schedule 27.02.2009    source источник


Ответы (11)


Мы используем NAnt-скрипт, который на этапе компиляции вызывает MSBuild. Использование NAnt позволяет нам выполнять задачи как до, так и после сборки, такие как установка номеров версий в соответствии с номерами версий системы управления версиями, сопоставление информации о покрытии кода, сборка и архивирование источников развертывания. Но, тем не менее, в основе всего лежит MSBuild, который на самом деле выполняет компиляцию.

Вы можете интегрировать сборку NAnt в качестве пользовательского инструмента в IDE, чтобы ее можно было использовать как на сервере сборки или непрерывной интеграции, так и разработчиками таким же образом.

person David M    schedule 27.03.2009

Взгляните на MSBuild!

  • MSBuild может работать с файлами sln/csproj из VS, поэтому для простых проектов вы можете просто вызывать их напрямую.
  • если вам нужно больше контроля, оберните проекты в свой собственный процесс сборки, добавьте свои собственные задачи и т. д. - это очень расширяемо!

(Я хотел добавить образец, но этот редактор полностью испортил XML... извините)

person laktak    schedule 24.03.2009

В идеале возможно, на практике нет.

Я бы предпочел Makefiles в качестве мастера сборки, однако разработчики проводят все свое время внутри Visual Studio IDE, и когда они вносят изменения, они вносят изменения в файл vcproj, а не в makefile. Поэтому, если я делаю глобальные сборки с помощью make-файлов, это слишком легко рассинхронизируется с файлами проекта/решения, используемыми 8 или 10 другими.

Единственный способ, которым я могу идти в ногу со всей командой, — запустить devenv.exe для файлов решений непосредственно в моих сценариях процесса сборки.

В моих билдах очень мало make-файлов, где они есть в разделах pre-build или custom build или в отдельном служебном проекте.

person SumoRunner    schedule 27.02.2009
comment
Что плохого в том, чтобы все делать на заказ? Это требует обновления make-файлов, не так ли? - person Simon Buchan; 03.03.2009
comment
Разработчики предпочитают IDE всему остальному, и я не могу заставить их изучать Nmake. Это возложило бы на мои плечи всю поддержку make-файла, и я не собираюсь делать их работу за них. - person SumoRunner; 03.03.2009
comment
Вам не нужно запускать devenv.exe. Msbuild является частью платформы .NET. - person Anton Tykhyy; 28.03.2009
comment
msbuild — это то, что используется Visual Studio для запуска сборок, а msbuild можно запускать из командной строки, даже не открывая VS и не запуская devenv.exe. Используйте инструмент VS для разработки и msbuild из командной строки для автоматической сборки — та же сборка и та же структура проекта. - person Cheeso; 28.03.2009

Одна из возможностей — использовать CMake — вы описываете с помощью сценария, как выполняется ваш проект. для сборки, а CMake создаст для вас файлы решения/проекта Visual Studio.

А если вам нужно собрать свой проект из командной строки или в инструменте непрерывной интеграции, вы используете CMake для создания файла Makefile для NMake.

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

Простой скрипт CMake выглядит так:

project(hello)
add_executable(hello hello.cpp)

Сравните эти две строки с make-файлом или с тем, как вы настраиваете простой проект в своей любимой IDE.

В двух словах, CMake не только кросс-платформен – позволяет вашему проекту, но и делает его кросс-IDE. Если вы хотите просто протестировать свой проект с помощью eclipse, KDevelop или codeblocks, просто запустите CMake, чтобы сгенерировать соответствующие файлы проекта.

Что ж, на практике это не всегда так просто, но идея CMake просто потрясающая.

Например, если вы планируете использовать CMake с Visual Studio, потребуется некоторая настройка, чтобы получить знакомое ощущение проекта VS, основным препятствием является организация ваших заголовочных и исходных файлов, но это возможно - проверьте вики CMake (и написав краткий script, вы можете даже упростить эту задачу).

person siddhadev    schedule 28.03.2009

Лично я использую Rake для вызова msbuild в моем решении или проекте. Для регулярной разработки я использую IDE и все ее преимущества.

Rake настроен так, что я могу просто компилировать, компилировать и запускать тесты или компилировать запуск тестов и создавать развертываемые артефакты. .

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

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

person Garry Shutler    schedule 27.02.2009
comment
Гарри: У меня есть вопрос о совместном использовании MsBuild и Rake. Я хотел бы получить ваш ответ на него! Спасибо! stackoverflow.com/questions/679009/ - person Charlie Flowers; 25.03.2009
comment
Если честно, это выходит за рамки всего, что я когда-либо делал, но я буду следить за этим вопросом, поскольку мне было бы интересно узнать, что вы или кто-то еще придумали. - person Garry Shutler; 25.03.2009
comment
Мы просто вызываем msbuild напрямую, это не ракетостроение. - person Anton Tykhyy; 28.03.2009

Мы используем devenv.exe (тот же исполняемый файл, который запускает IDE) для сборки наших проектов из сценариев сборки (или из командной строки). При указании параметра /Build IDE не отображается и все записывается обратно в консоль (или в лог-файл, если указан параметр /Out)

См. http://msdn.microsoft.com/en-us/library/xee0c8y7(VS.80).aspx для получения дополнительной информации

Пример:

devenv.exe [имя-файла-решения] /Build [имя-проекта] /Rebuild "Release|Win32" /Out solution.log

где «Release|Win32» — это конфигурация, определенная в решении, а solution.log — это файл, который получает выходные данные компилятора (что очень удобно, когда вам нужно выяснить, что пошло не так при компиляции)

person Milander    schedule 22.03.2009
comment
На самом деле это devenv.com, который отображает результаты в консоли. devenv.exe немедленно возвращается после запуска и выполняет процесс сборки в фоновом режиме. - person macbirdie; 27.03.2009
comment
По крайней мере, так в VS 2005. - person macbirdie; 27.03.2009
comment
Лучше использовать msbuild для сборки консоли, потому что VS использует msbuild для компиляции решения и проекта. - person abatishchev; 28.03.2009
comment
devenv.exe требуется для таких вещей, как проекты установки, которые не имеют формата файла проекта, совместимого с msbuild. Для других проектов лучше использовать msbuild из строки cmd. - person Cheeso; 29.03.2009

У нас есть программа, которая анализирует файлы vcproj и генерирует из них фрагменты makefile. (К ним относятся список файлов и #define, а также имеется некоторая ограниченная поддержка пользовательских шагов сборки.) Затем эти фрагменты включаются в главный make-файл, который выполняет обычные действия GNU make.

(Это все для одной из целевых систем; ее инструменты не имеют встроенной поддержки Visual Studio.)

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

Тем не менее, комбинаторные проблемы, присущие обработке Visual Studio конфигураций сборки, остаются.

person Community    schedule 22.03.2009

Почему вы хотите иметь проект, который «компилируется в Windows и не зависит от проекта VisualStudio»? У вас уже есть файл решения — вы можете просто использовать его при сборке консоли.

Я бы посоветовал вам использовать msbuild в сочетании с makefile, nant или даже простым пакетным файлом, если ваша система сборки не такая запутанная, как наша...

Есть что-то, что мне не хватает?

person ya23    schedule 28.03.2009
comment
Что ж, полная сборка десяти компонентов и модулей нашей системы занимает около 2 часов (только релиз) и еще несколько часов во всех режимах сборки. Плюс 8 систем нужно компилировать под unix и еще несколько компиляторов. Да, сложный вид :) - person Robert Gould; 28.03.2009
comment
Нам нужно сделать сборку для unix и windows. Для этого мы используем комбинацию msbuild, makefiles и ant. И это не так уж и плохо :) Возможно, стоит попробовать оптимизировать процесс сборки - хотя бы итеративную скорость сборки. Недавно мы сократили время сборки с 35 минут до 7... - person ya23; 28.03.2009
comment
хорошо, у нас есть твердотельные накопители, потому что линковка и полная оптимизация программы съедают примерно треть времени. Искал другие оптимизации, но пока не повезло. В любом случае, ваша установка превосходит нашу текущую установку, у нас нет инженера-строителя. - person Robert Gould; 28.03.2009

Как насчет этого кода?

public TRunner CleanOutput()
{
    ScriptExecutionEnvironment.LogTaskStarted("Cleaning solution outputs");

    solution.ForEachProject(
        delegate (VSProjectInfo projectInfo)
            {             
                string projectOutputPath = GetProjectOutputPath(projectInfo.ProjectName);

                if (projectOutputPath == null)
                    return;

                projectOutputPath = Path.Combine(projectInfo.ProjectDirectoryPath, projectOutputPath);

                DeleteDirectory(projectOutputPath, false);

                string projectObjPath = String.Format(
                    CultureInfo.InvariantCulture,
                    @"{0}\obj\{1}",
                    projectInfo.ProjectName,
                    buildConfiguration);
                projectObjPath = Path.Combine(productRootDir, projectObjPath);
                DeleteDirectory(projectObjPath, false);
            });

    ScriptExecutionEnvironment.LogTaskFinished();
    return ReturnThisTRunner();
}

public TRunner CompileSolution()
{
    ScriptExecutionEnvironment.LogTaskStarted ("Compiling the solution");

    ProgramRunner
        .AddArgument(MakePathFromRootDir(productId) + ".sln")
        .AddArgument("/p:Configuration={0}", buildConfiguration)
        .AddArgument("/p:Platform=Any CPU")
        .AddArgument("/consoleloggerparameters:NoSummary")
        .Run(@"C:\Windows\Microsoft.NET\Framework\v3.5\msbuild.exe");

    ScriptExecutionEnvironment.LogTaskFinished ();
    return ReturnThisTRunner ();
}

Остальную часть можно найти здесь: http://code.google.com/p/projectpilot/source/browse/trunk/Flubu/Builds/BuildRunner.cs

person Igor Brejc    schedule 28.03.2009

Я еще не пробовал это сам, но у Microsoft есть реализация Make под названием NMake, которая, похоже, имеет интеграцию с Visual Studio:

person Armin Ronacher    schedule 28.03.2009
comment
нет - nmake устарел, существует уже много лет. Он поставляется как часть .NET Framework SDK и Windows SDK. Но это не то, что VS использует для сборки. Visual Studio использует msbuild. Это то, что вы должны изучить. - person Cheeso; 28.03.2009

Visual Studio, начиная с VS2005, использует «msbuild» для определения и запуска сборок. Когда вы возитесь с настройками проекта в конструкторе Visual Studio — скажем, вы включаете или отключаете создание документов XML, добавляете новую зависимость или добавляете новый проект или ссылку на сборку — Visual Studio обновит файл .csproj (или . vbproj и т. д.), который является файлом msbuild.

Подобно Java ant или Nant до него, msbuild использует XML-схему для описания проекта и сборки. Он запускается из VS, когда вы делаете сборку «F6», и вы также можете запустить его из командной строки, даже не открывая VS и не запуская devenv.exe.

Итак, используйте инструмент VS для разработки и msbuild из командной строки для автоматизированной сборки — та же сборка и та же структура проекта.

person Cheeso    schedule 28.03.2009
comment
Почти Visual Studio 2005 и 2009 используют msbuild только для проектов VB и C#. В этих версиях проекты C и C++ по-прежнему используют старый движок vcproj. VS2010, по-видимому, также переключается на MSBuild для C++. Если он говорит о внешних make-файлах, скорее всего, он собирает C или C++. - person Tim Lesher; 20.01.2010