Visual Studio Command Prompt

Dosyć często używam narzędzie Visual Studio spod linii poleceń, głownie nmake do budowania z wykorzystaniem makefiles. Nieraz jest to bardziej wygodniejsze od odpalania i zabawy w IDE.

Standardowo przy odpalaniu Visual Studio 2008 Command Prompt wykonywany jest skrypt vcvarsall.bat, który ustawia środowisko, czyli odpowiednie zmienne środowiskowe, ścieżki...
Wszystko fajnie i cacy, ale przy ustawieniach ścieżek do nagłówków i bibliotek nie są brane pod uwagę pozycje zapisane w ustawieniach IDE, jedynie skrypt ustawia standardowe pathe, do standardowych nagłówków, ewentualnie do PSDK.

Jest to problem przy kompilowaniu projektów używających dodatkowych kilku bibliotek, np. boosta, cppunit ulokowanych w innej lokalizacji niż standardowe pliki. Kompilator i linker nie potrafią zlokalizować wymaganych plików, przez co proces kończy się nie powodzeniem.

Nie chce zaburzać struktury katalogów gdzie trzymam swoje biblioteki, tak samo nie chce uzależniać makefilsow od tych ścieżek, ani dodawać dodatkowych zmiennych lub hardkodowych ścieżek.
Nie chce także pakować tych ścieżek do globalnych zmiennych środowiskowych, bo wtedy m.in. będzie problem z synchronizacja ich z wartościami w IDE.

Co zrobić?

Przeszukałem sieć mając nadzieje, że ktoś miał podobny problem i znalazł rozwiązanie, po nieudanej próbie poszedłem na Usenetową grupę pl.comp.lang.c ze swoim problemem.

Znalazłem kilka rozwiązań, może zacznę od tych które mi się nie podobają i mnie nie zadowalają.

Najprościej byłoby napisać skrypt wyciągający z ustawień VS ścieżki. Byłoby pięknie, gdyby config nie był przechowywany w binarnych plikach .prf.

Kolejny pomysł to eksportowanie ustawień z VS plus skrypt parsujący. Udało mi się w prosty sposób uruchomić eksportera z linii poleceń, a następnie zamknąć IDE:

devenv /command "Tools.ImportandExportSettings /export:c:\vcset.xml" /command "File.Exit"

Ale mignięcie okna VS jest denerwujące przy każdym uruchomieniu konsoli, tak samo odpalanie za każdym razem IDE, co na słabszym sprzęcie może być bardzo uciążliwe i upierdliwe, mimo iż na moim lapku to tylko 1 sekunda ;)

Inna idea to porzucenie ustawień ścieżek w VS na rzecz pliku bat z ścieżkami i uruchamianie środowiska z opcją:

/useenv         Use PATH, INCLUDE, LIBPATH, and LIB environment variables
                instead of IDE paths for VC++ builds.

Zrobienie skrótu ustawiającego ścieżki i uruchamiającego VS z tym przełącznikiem proste, ale co zorbie, aby ścieżki także były ustawione przy odpalaniu dwuklikiem na polucji lub projekcie? Nie chce babrać się w ustawieniach systemowych i powiązaniach plików.

Inne rozwiązanie to olanie nmake i przesiadka na msbuild, ale wołałbym pozostać przy nmake.

Wpadłem również na pomysł, aby napisać makro, które będzie eksportować ustawione ścieżki do pliku. I jak się okazało jest to najlepsze rozwiązanie jakie mnie zadowala.

Bardzo prosto można dobrać się do ustawień IDE, o czym można się dowiedzieć z MSDN: Controlling Options Settings, ja niestety dotarłem do tego eksperymentami i przeglądarką obiektów w samym środowisku makr.

Nasz funkcja używana w makrze do pobierania ścieżki dla konkretnej platformy prezentuje się następująco:

Private Function GetPath(ByRef type As Object, ByRef platform As String) As String
    Dim prop As EnvDTE.Property
    prop = DTE.Properties("Projects", "VCDirectories").Item(type)
    Dim arr As Array = prop.Value.ToString.Split("|")
    Dim idx As Integer = arr.IndexOf(arr, platform)
    If idx = -1 Then
        Throw New ArgumentException("Invalid platform argument")
    End If
    Return arr.GetValue(idx + 1)
End Function

Ścieżki w VS zawierają makra (nie mylić z tymi makrami automatyzującymi prace), które reprezentują ścieżki do różnych katalogów, takich jak instalacyjny, projektu, psdk, etc. Musimy je rozwinąć, albo zamienić na zmienne środowiskowe, bo akurat tak się składa że pokrywają się one z tymi zmiennymi ustawionymi przez vcvarsall.bat.

Prosty regexp załatwia sprawę:

Regex.Replace(str, "\$\((?<val>\w+)\)", "%${val}%\")

Główna cześć makra, czyli generowanie pliku, uruchamiane jest przez event generowany przy zamykaniu środowiska, pewnie lepiej byłoby, gdyby następowało to tylko przy zmianie ustawień, ale nie udało mi się znaleźć takiego eventu lub innego sposobu na dokonanie tego.
Jeśli komuś nie odpowiada event zamykania, może dodać prostą funkcję generującą plik i podpiąć to pod klawisz skrótu, menu lub toolbox i uruchamiać ręcznie w razie potrzeby.
Ja wolę, aby automat, aby nie musieć o tym pamiętać ;)

Makro można pobrać tutaj: VS Path Exporter.

Makro generuje plik bat, który należy uruchamiać przed rozpoczęciem pracy w VS Command Prompt lub dodać jego uruchamianie przy stracie, np. w skrócie uruchamiającym konsolę.

U mnie skrót ten wyglada tak:

vccmdprmt

Plik generowany przez makro to vcpaths.bat, a setvar.bat to inny skrypt dodający do zmiennej PATH dodatkowe ścieżki znajdujące się w innym pliku, pisałem o tym notce Wiersz poleceń i PATH.

Jedno przemyślenie nt. „Visual Studio Command Prompt”

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *