Chociaż jest to stare pytanie, istnieje metoda robienia tego, o co prosi; jest po prostu zawikłany, jak wszystko w plikach wsadowych!
Należy korzystać z połączonych mechanizmów polegających na tym, że importowane są zmienne środowiskowe i że preprocesor może wywoływać polecenia, a następnie wywoływać rekurencyjnie Makefile. Zakłada się, że Makefile jest nazywane Makefile (bez rozszerzenia, które jest domyślne).
!IFNDEF MAKE
MAKE=NMAKE
!ENDIF
!IFNDEF SHELLVALUE
! IF [echo off && FOR /F "usebackq" %i IN (`hostname`) DO SET SHELLVALUE=%i && $(MAKE) /$(MAKEFLAGS) /nologo /f $(MAKEDIR)\Makefile && exit /b ] == 0
! MESSAGE Make completed
! ELSE
! ERROR Error in nmake
! ENDIF
!ELSE
# $(SHELLVALUE) now contains the string returned from the command USERNAME
!MESSAGE Shellvalue is $(SHELLVALUE)
# Put the parts of the makefile that depend on SHELLVALUE here
!ENDIF
#
# To be a valid makefile it must have some rules to perform
all:
@echo;$(SHELLVALUE)
Tak, wiem, że jej straszne, ale nie pokazują, jak wykonać technikę, która może być wykonana z dowolnego polecenia powłoki, a nie tylko hostname
.
Nigdy nie znalazłem sposobu, aby to zrobić. Aby być sprawiedliwym, MSBuild też nie rozwiązał problemu, chociaż ostatecznie przekonałem go do tego z innych powodów. W końcu, aby rozwiązać ten problem, musiałem napisać skrypt MS PowerShell, aby wykonać niezbędne wywołania, które potrzebowaliśmy przed rozpoczęciem budowy projektu. –