Visual Studio Command Prompt

tech • 759 słów • 4 minuty czytania

Dosyć często używam narzędzi dostarczanych z Visual Studio spod linii poleceń, głównie nmake do budowania z wykorzystaniem plików makefile. Nieraz jest to bardziej wygodne i optymalne w pracy od odpalania i zabawy z 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. Skrypt ten jedynie ustawia standardowe ścieżki, do standardowych nagłówków, ewentualnie do PSDK.

Jest to duży problem przy kompilowaniu projektów używających dodatkowych, innych bibliotek, np. boost, cppunit ulokowanych w innej lokalizacji niż standardowe miejsca. Kompilator i linker nie potrafią wtedy zlokalizować wymaganych plików, przez co proces kompilacji i budowy kończy się nie powodzeniem.

Nie chcę zaburzać swojej struktury katalogów, w których trzymam biblioteki. Tak samo nie chcę uzależniać plików makefile od tych ścieżek, ani dodawać dodatkowych zmiennych lub hardkodowanych ścieżek. Nie chcę również pakować tych ścieżek do globalnych zmiennych środowiskowych, bo wtedy m.in. będę miał kolejny problem z ich synchronizacją z tymi wartościami zapisanymi w IDE.

Jak w takim wypadku poradzić sobie z tę problematyczną niedogodnością?

Przeszukałem sieć z nadzieją, że ktoś już miał podobny problem i znalazł jakieś rozwiązanie. Po nieudanej próbie poszedłem na Usenetową grupę pl.comp.lang.c ze swoim problemem i też nic. Wymyśliłem kilka rozwiązań, ale niektóre pomysły mi się nie spodobały. Opiszę je pokrótce zaczynając od tych, które odrzuciłem, bo mnie nie zadowalały.

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

Kolejny pomysł to eksportowanie ustawień z VS i jakiś skrypt parsujący te dane. Udało mi się w prosty sposób uruchomić eksportera z linii poleceń, a następnie zamknąć IDE przy użyciu kilku wbudowanych komend:

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

Ale mignięcie okna VS przy każdym uruchomieniu konsoli jest denerwujące. Tak samo jak odpalanie za każdym razem IDE, co na słabszym sprzęcie może być 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 ze ś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 jest proste. Co jednak zrobić, aby ścieżki także były ustawione przy odpalaniu dwuklikiem na solucji lub projekcie? Nie chcę babrać się w ustawieniach systemowych i powiązaniach plików.

Następne rozwiązanie to olanie nmake i przesiadka na msbuild, ale wołałbym pozostać przy tym windowsowym make-u.

Ostatecznie wpadłem na pomysł, aby napisać sobie makro do Visuala, które będzie eksportować ustawione w programie ścieżki do pliku. I jak się okazało jest to najlepsze rozwiązanie jakie wymyśliłem i które 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 własnymi eksperymentami i przeglądarką obiektów. Moja funkcja używana w tworzonym makrze VS 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, np. instalacyjny, projektu, psdk, etc. Musimy je rozwinąć, albo zamienić na zmienne środowiskowe, bo akurat tak się składa, że pokrywają się ze zmiennymi ustawionymi przez vcvarsall.bat. Prosty regexp załatwia sprawę:

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

Główną częścią makra jest generowanie pliku, które uruchamiane jest przez zdarzenie otrzymywane przy zamykaniu środowiska. Zapewne lepiej byłoby, gdyby następowało to tylko przy zmianie ustawień, ale nie udało mi się znaleźć takiego eventu, ani innego sensownego sposobu na zrobienie tego. Jeśli komuś nie odpowiada event zamykania, może dodać prostą funkcję generującą plik, podpiąć ją pod klawisz skrótu, menu lub toolbox-a i uruchamiać ręcznie w razie potrzeby. Ja wolę, aby robił to automat, żeby nie musieć o tym pamiętać ;)

Makro można pobrać ze strony projektu: VS Path Exporter.

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

Plik generowany przez makro to vcpaths.bat, a setvar.bat to mój 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.

Komentarze (0)

Dodaj komentarz

/dozwolony markdown/

/nie zostanie opublikowany/