Вызов командных файлов с make и внесение постоянных изменений - PullRequest
3 голосов
/ 16 января 2009

Я программирую на Visual C ++ Express в командной строке, используя make-файлы (GNU Make). Чтобы это работало, мне нужно вызвать пакетный файл Visual Studio vsvars32.bat для настройки среды. Это нужно делать каждый раз, когда я открываю новый cmd.exe, перед использованием make. Когда я пытаюсь вызвать командный файл из моего make-файла, он, очевидно, выполняет командный файл как собственный процесс, потому что окружающая среда остается такой же.

Итак, мой вопрос: есть ли способ выполнить сценарии в cmd.exe, как встроенная команда source в Linux / Unix bash? Конечно, кроме установки bash в Windows.

Редактировать после публикации моего собственного ответа:

Приведенный выше вопрос не совсем верен, он должен быть таким:

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

Ответ на оригинальный вопрос - да: вы можете использовать встроенную команду call в cmd.exe. Но поскольку call является встроенной командой, а не реальной программой, она не работает в make-файле, только если вы вызываете пакетный файл из другого пакетного файла.

Ответы [ 6 ]

4 голосов
/ 16 января 2009

Ответ составлен из предыдущих ответов:

Я создал командный файл с именем make.bat, который содержит следующее:

вызов "% VS90COMNTOOLS% vsvars32.bat"
вызов make.exe% *

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

Редактировать: После переполнения переменной PATH повторным вызовом vsvars32.bat я сделал следующие изменения:

если не "% VISUALCVARS%" == "ИСТИНА" (
установить VISUALCVARS = TRUE
вызов "% VS90COMNTOOLS% vsvars32.bat"
)
call make.exe% *

1 голос
/ 16 января 2009

Как вы запускаете консоль? Если вы просто запускаете 'cmd', тогда вместо этого создайте ярлык, который выполняется (% comspec% разрешается в c: \ windows \ cmd.exe или что-либо другое в вашей системе)

%comspec% /k ""C:\Program Files\Microsoft Visual Studio 8\VC\vcvarsall.bat"" x86

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

1 голос
/ 16 января 2009

По крайней мере, в моей установке Visual Studio (хотя и несколько более старой VS .NET 2003) одна из ссылок в группе меню Пуск VS - открыть экземпляр cmd.exe с уже настроенной средой. Вы можете найти это полезным:

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

1 голос
/ 16 января 2009

используйте 'Call':

@echo off
pushd.
call "C:\Program Files\Microsoft Visual Studio 8\Common7\Tools\vsvars3235.bat"
msbuild LinqSupportClassesSDKBuild.csproj /t:rebuild /p:Configuration=Release /nologo /v:q /clp:ErrorsOnly;
popd

это файл cmd, который мы используем для создания нашего поставщика linq.

0 голосов
/ 23 июня 2009

Я нашел три решения этой проблемы:

1) Если переменные среды, устанавливаемые пакетным файлом, являются статическими (то есть они всегда являются одинаковыми значениями), установите эти значения для всего профиля пользователя. Щелкните правой кнопкой мыши на «Мой компьютер», выберите «Свойства» -> «Дополнительно» -> «Переменные среды». Добавьте переменные из пакетного файла в раздел «Пользовательские переменные» или «Системные переменные» (пользовательские переменные видны только вам, системные переменные видны всем пользователям этого компьютера).

2) Напишите пакетный файл-обертку, который вызывает скрипт настройки среды, затем вызывает Makefile.

3) Вместо использования команды SET для установки переменных среды в командном файле используйте команду SETX (требуется набор ресурсов Windows). SETX аналогичен SET, за исключением того, что он вносит свои изменения в основную среду в реестре и будет действовать во всех командных приглашениях, запущенных в будущем (но не в текущей).

0 голосов
/ 16 января 2009

Обернуть GNU make в скрипт (mmake.bat). Поместите скрипт в путь куда-нибудь.

Сам скрипт должен запустить vsvars32.bat и затем сделать, как это

vsvars32.bat
make %*

Насколько я помню, вызов скрипта из другого скрипта, подобного этому, выполняется в той же оболочке (аналогично команде Bash ".")

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