I have this batch that builds some projects using msbuild.
What I want to do is to skip building my-last.proj if any of the above builds fail: my-proj1.proj to my-proj5.proj using environment variables.
I'm sure that there is another cleaner way to do this, but so far I just can't figure it out.
msbuild /target:Win32 my-proj1.proj
IF NOT ERRORLEVEL 0 (
set /p BUILDFAILED32=1
)
msbuild /target:X64 my-proj1.proj
IF NOT ERRORLEVEL 0 (
set /p BUILDFAILED64=1
)
msbuild /target:ManagedWin32 my-proj1.proj
IF NOT ERRORLEVEL 0 (
set /p BUILDFAILED32=1
)
msbuild /target:ManagedX64 my-proj1.proj
IF NOT ERRORLEVEL 0 (
set /p BUILDFAILED64=1
)
msbuild /target:Win32 my-proj2.proj
IF NOT ERRORLEVEL 0 (
set /p BUILDFAILED32=1
)
msbuild /target:X64 my-proj2.proj
IF NOT ERRORLEVEL 0 (
set /p BUILDFAILED64=1
)
msbuild /target:Win32 my-proj3.proj
IF NOT ERRORLEVEL 0 (
set /p BUILDFAILED32=1
)
msbuild /target:Win32 my-proj4.proj
IF NOT ERRORLEVEL 0 (
set /p BUILDFAILED32=1
)
msbuild /target:Win32 my-proj5.proj
IF NOT ERRORLEVEL 0 (
set /p BUILDFAILED32=1
)
IF NOT "%FAILED32%" == "1" (
msbuild /target:setup32 my-last.proj
)
msbuild /target:X64 my-proj3.proj
IF NOT ERRORLEVEL 0 (
set /p BUILDFAILED64=1
)
msbuild /target:X64 my-proj4.proj
IF NOT ERRORLEVEL 0 (
set /p BUILDFAILED64=1
)
msbuild /target:X64 my-proj5.proj
IF NOT ERRORLEVEL 0 (
set /p BUILDFAILED64=1
)
IF NOT "%FAILED64%" == "1" (
msbuild /target:setup64 my-last.proj
)
Does anyone have any ideas?
-
1\$\begingroup\$ Welcome to Code Review! It looks like you have figured out exactly what this site is about. You just passed the "first post" test with ease! \$\endgroup\$Simon Forsberg– Simon Forsberg2014年02月22日 20:48:38 +00:00Commented Feb 22, 2014 at 20:48
-
1\$\begingroup\$ @Simon André Forsberg - Thanks, I'm glad that Code Review exists. \$\endgroup\$Dimitri– Dimitri2014年02月22日 20:55:59 +00:00Commented Feb 22, 2014 at 20:55
2 Answers 2
You probably meant set %BUILDFAILEDxx%=1
? /p
is for prompting interactively (or reading from a file).
Otherwise, except a minor typo %BUILDFAILED32%
instead of just %FAILED32%
(and same for 64bit builds), this looks good (and "clean") enough for me.
You could get rid of the parentheses (for the sake of it?) if you wrote each if
on a single line.
-
\$\begingroup\$ @Jamal oops, thanks for the "codifying", I'll look up how to do it properly. As for the space before the question mark, sorry I'm French :-) so I may do it again. \$\endgroup\$FredP– FredP2014年02月22日 21:24:39 +00:00Commented Feb 22, 2014 at 21:24
-
\$\begingroup\$ Did you expect more ? Apart from reorganizing the order of builds (either by number 32b-1,64b-1,32b-2,... or by regrouping all the 32 and 64bit ones) I think this is the optimal & "cleanest" solution (with environment variables, in cmd). \$\endgroup\$FredP– FredP2014年02月23日 09:23:12 +00:00Commented Feb 23, 2014 at 9:23
You probably want to localize any environment changes.
You should initialize your variables to a known state at the beginning, otherwise you could get the wrong result.
You have a lot of redundant code that can be eliminated by using a CALLed subroutine
You can use the ||
operator to conditionally execute code if the previous command failed. I find it simpler than using IF ERRORLEVEL.
You can save a bit of typing by storing code in a variable to be used as a simple macro.
@echo off
setlocal
set "failed32="
set "failed64="
set "build=call :build"
%build% Win 32 my-proj1
%build% X 64 my-proj1
%build% ManagedWin 32 my-proj1
%build% ManagedX 64 my-proj1
%build% Win 32 my-proj2
%build% X 64 my-proj2
%build% Win 32 my-proj3
%build% Win 32 my-proj4
%build% Win 32 my-proj5
if not defined failed32 msbuild /target:setup32 my-last.proj
%build% X 64 my-proj3
%build% X 64 my-proj4
%build% X 64 my-proj5
if not defined failed64 msbuild /target:setup64 my-last.proj
exit /b
:build target size proj
msbuild /target:%1%2 %3.proj || set failed%%2=1
exit /b