Use goto to exit in build.cmd so that error code propagates out of cmd - #990

Merged
safern merged 3 commits into
dotnet:masterfrom
safern:CoreclrBuildcmdExit
Dec 19, 2019
Merged

Use goto to exit in build.cmd so that error code propagates out of cmd#990
safern merged 3 commits into
dotnet:masterfrom
safern:CoreclrBuildcmdExit

Conversation

@safern

Copy link
Copy Markdown
Member

If there is a failure in some nested steps of coreclr/build.cmd the exit code was not being propagated due to nested calls and if blocks, instead, go to the end of the script and exit. Because the exit code wasn't propagated, when running build.cmd from the root, coreclr.proj is called and that shells out via Exec into coreclr/build.cmd, and MSBuild was getting a 0 exit code, so the build wouldn't fail if there was a failure. I.e: the sdk.txt failure which was manifesting latter on the build up when the installer tried to crossgen libraries assemblies.

cc: @dotnet/runtime-infrastructure

@ViktorHofer

Copy link
Copy Markdown
Member

What's the difference between an exit and an goto somewhere and then exit?

@trylek

Copy link
Copy Markdown
Member

I don't think there's a difference, I guess Santi is basically trying to create a unified choke point for error handling.

@safern

Copy link
Copy Markdown
MemberAuthor

There is a difference if you're within a subroutine or a call. So basically doing goto and then exiting, goto is telling the script to exit the subroutine and then execute exit /b 1.

@dagood

Copy link
Copy Markdown
Member

This call is the (only) subroutine call in this script, right?

for%%iin (%__BuildArchList%) do (
for%%jin (%__BuildTypeList%) do (
call :BuildOne%%i%%j
)
)

(Based on looking it up--didn't know batch files had this concept.)

@safern

Copy link
Copy Markdown
MemberAuthor

Right. That's the only subroutine call. The weird thing is that if we exit outside of any of these ifs:

https://github.com/dotnet/runtime/blob/master/src/coreclr/build.cmd#L528

The exit code is propagated. However if we exit within the if ( ) blocks, then it is not propagated and the calling process (either Powershell or MSBuild) would get an exit code 0. That's why I decided to do a goto, to be in the root of the script, and that indeed fixes the issue. I've tried everything else, I will try and read the script one more time very careful to see why that can be, however, if any of you have any other better ideas I would really appreciate it.

Comment threadsrc/coreclr/build.cmd
exit /b 1

:ExitWithCode
exit /b !__exitCode!

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually, maybe document the weird subroutine behavior here, so someone doesn't try to remove it in the future thinking it's just someone trying to do "single return". (And if someone hits a similar issue, maybe they'll see this and get their fix without as much headache.)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds good.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is the expectation of this method that a zero exit code is acceptable? Basically is this explicitly an error routine or a general purpose exit routine?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think a general purpose exit routine is acceptable. That's why there's also ExitWithError which exits with 1.

@safern

Copy link
Copy Markdown
MemberAuthor

@BruceForstall@jkoritzinsky@trylek it seems like the format windows job was already broken but since the exit code wasn't flowing from src\coreclr\build.cmd the python script was not exiting with error. Could you help me understand what is wrong?

-- Configuring done
CMake Error: Error required internal CMake variable not set, cmake may not be built correctly.
Missing variable is:
CMAKE_RC_CREATE_SHARED_LIBRARY
CMake Error: Error required internal CMake variable not set, cmake may not be built correctly.
Missing variable is:
CMAKE_RC_CREATE_SHARED_LIBRARY
CMake Error: Error required internal CMake variable not set, cmake may not be built correctly.
Missing variable is:
CMAKE_RC_CREATE_SHARED_LIBRARY
-- Generating done
CMake Generate step failed. Build files cannot be regenerated correctly.
BUILD: Error: failed to generate native component build project

@BruceForstall

Copy link
Copy Markdown
Contributor

@safern Are you saying that "goto" from within a call, then calling "exit" will exit the entire script? I don't believe that's how it works. I thought that any call :local_label needs a corresponding exit /b XXX (or fall off the end of the script).

@BruceForstall

Copy link
Copy Markdown
Contributor

@BruceForstall@jkoritzinsky@trylek it seems like the format windows job was already broken but since the exit code wasn't flowing from src\coreclr\build.cmd the python script was not exiting with error. Could you help me understand what is wrong?

The formatting job probably needs work to make it work in the new repo. If there's not an issue, we should add one. In particular, it looks like src\jit-format\jit-format.cs in the https://github.com/dotnet/jitutils repo might need work to handle the new artifacts directory and build scripts. e.g., it's looking for:

string[] compileCommandsPath = { _rootPath, "bin", "nmakeobj", "Windows_NT." + _arch + "." + _build, "compile_commands.json" }; 

where _rootPath is the src\coreclr directory, and it's obviously not going to find it.

@erozenfeld Can you look into getting the formatting job to work?

@erozenfeld

Copy link
Copy Markdown
Contributor

@erozenfeld Can you look into getting the formatting job to work?

Sure, I'll fix it tomorrow.

@safern

Copy link
Copy Markdown
MemberAuthor

Sure, I'll fix it tomorrow.

Thanks @erozenfeld could you cc me on whatever it is needed and let me know whenever it is fixed so I can merge this PR?

Comment threadsrc/coreclr/build.cmd
REM =========================================================================================
REM === These two routines are intended for the exit code to propagate to the parent process
REM === Like MSBuild or Powershell. If we directly exit /b 1 from within a if statement in
REM === any of the routines, the exit code is not propagated.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is another great item / design principal that we could include in scripting design guideline documents.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we have a doc for those guidelines yet? If not, do we have an issue?

@erozenfeld

Copy link
Copy Markdown
Contributor

@BruceForstall

The formatting job probably needs work to make it work in the new repo. If there's not an issue, we should add one. In particular, it looks like src\jit-format\jit-format.cs in the https://github.com/dotnet/jitutils repo might need work to handle the new artifacts directory and build scripts.

That was already fixed in dotnet/jitutils#227

We had this CMAKE error

CMake Error: Error required internal CMake variable not set, cmake may not be built correctly.
Missing variable is:
CMAKE_RC_CREATE_SHARED_LIBRARY

for at least 3 years, e.g., see the output here: dotnet/jitutils#64

We get this error when we run
build.cmd -usenmakemakefiles

It's benign, compile_commands.json file is generated and clang-tidy uses it to run.

I'm trying to figure out a way to work around this error. cmake documentation is not very helpful.
I found one relevant thread: https://cmake.org/pipermail/cmake/2012-January/048647.html
and the suggested fix here https://octolinker-demo.now.sh/sakura-editor/sakura/commit/537bdf11452f62d10e1dbc09176d7a2d91c7e68a
Not sure if we need something similar.

Will keep digging.

@safern

Copy link
Copy Markdown
MemberAuthor

We had this CMAKE error

@janvorli might have ideas...

@erozenfeld

Copy link
Copy Markdown
Contributor

Adding

SET(CMAKE_RC_CREATE_SHARED_LIBRARY "${CMAKE_CXX_CREATE_SHARED_LIBRARY}")

at the end of
https://github.com/dotnet/runtime/blob/0c002ccca614688d2bc666ae44ff0ac07b3add5f/src/coreclr/configurecompiler.cmake

makes the error disappear.

@safern

Copy link
Copy Markdown
MemberAuthor

Thanks @erozenfeld. I'll include that as part of my PR.

@safern

Copy link
Copy Markdown
MemberAuthor

I added: ceefc5f to fix it.

@safern
safern merged commit 639122a into dotnet:masterDec 19, 2019
@safern
safern deleted the CoreclrBuildcmdExit branch December 19, 2019 01:37
@ghostghost locked as resolved and limited conversation to collaborators Dec 11, 2020
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants

@safern@ViktorHofer@trylek@dagood@BruceForstall@erozenfeld@jaredpar@jkoritzinsky@Dotnet-GitSync-Bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Use goto to exit in build.cmd so that error code propagates out of cmd - #990

Merged
safern merged 3 commits into
dotnet:masterfrom
safern:CoreclrBuildcmdExit
Dec 19, 2019
Merged

Use goto to exit in build.cmd so that error code propagates out of cmd#990
safern merged 3 commits into
dotnet:masterfrom
safern:CoreclrBuildcmdExit

Conversation

@safern

Copy link
Copy Markdown
Member

If there is a failure in some nested steps of coreclr/build.cmd the exit code was not being propagated due to nested calls and if blocks, instead, go to the end of the script and exit. Because the exit code wasn't propagated, when running build.cmd from the root, coreclr.proj is called and that shells out via Exec into coreclr/build.cmd, and MSBuild was getting a 0 exit code, so the build wouldn't fail if there was a failure. I.e: the sdk.txt failure which was manifesting latter on the build up when the installer tried to crossgen libraries assemblies.

cc: @dotnet/runtime-infrastructure

@ViktorHofer

Copy link
Copy Markdown
Member

What's the difference between an exit and an goto somewhere and then exit?

@trylek

Copy link
Copy Markdown
Member

I don't think there's a difference, I guess Santi is basically trying to create a unified choke point for error handling.

@safern

Copy link
Copy Markdown
MemberAuthor

There is a difference if you're within a subroutine or a call. So basically doing goto and then exiting, goto is telling the script to exit the subroutine and then execute exit /b 1.

@dagood

Copy link
Copy Markdown
Member

This call is the (only) subroutine call in this script, right?

for%%iin (%__BuildArchList%) do (
for%%jin (%__BuildTypeList%) do (
call :BuildOne%%i%%j
)
)

(Based on looking it up--didn't know batch files had this concept.)

@safern

Copy link
Copy Markdown
MemberAuthor

Right. That's the only subroutine call. The weird thing is that if we exit outside of any of these ifs:

https://github.com/dotnet/runtime/blob/master/src/coreclr/build.cmd#L528

The exit code is propagated. However if we exit within the if ( ) blocks, then it is not propagated and the calling process (either Powershell or MSBuild) would get an exit code 0. That's why I decided to do a goto, to be in the root of the script, and that indeed fixes the issue. I've tried everything else, I will try and read the script one more time very careful to see why that can be, however, if any of you have any other better ideas I would really appreciate it.

Comment threadsrc/coreclr/build.cmd
exit /b 1

:ExitWithCode
exit /b !__exitCode!

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually, maybe document the weird subroutine behavior here, so someone doesn't try to remove it in the future thinking it's just someone trying to do "single return". (And if someone hits a similar issue, maybe they'll see this and get their fix without as much headache.)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds good.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is the expectation of this method that a zero exit code is acceptable? Basically is this explicitly an error routine or a general purpose exit routine?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think a general purpose exit routine is acceptable. That's why there's also ExitWithError which exits with 1.

@safern

Copy link
Copy Markdown
MemberAuthor

@BruceForstall@jkoritzinsky@trylek it seems like the format windows job was already broken but since the exit code wasn't flowing from src\coreclr\build.cmd the python script was not exiting with error. Could you help me understand what is wrong?

-- Configuring done
CMake Error: Error required internal CMake variable not set, cmake may not be built correctly.
Missing variable is:
CMAKE_RC_CREATE_SHARED_LIBRARY
CMake Error: Error required internal CMake variable not set, cmake may not be built correctly.
Missing variable is:
CMAKE_RC_CREATE_SHARED_LIBRARY
CMake Error: Error required internal CMake variable not set, cmake may not be built correctly.
Missing variable is:
CMAKE_RC_CREATE_SHARED_LIBRARY
-- Generating done
CMake Generate step failed. Build files cannot be regenerated correctly.
BUILD: Error: failed to generate native component build project

@BruceForstall

Copy link
Copy Markdown
Contributor

@safern Are you saying that "goto" from within a call, then calling "exit" will exit the entire script? I don't believe that's how it works. I thought that any call :local_label needs a corresponding exit /b XXX (or fall off the end of the script).

@BruceForstall

Copy link
Copy Markdown
Contributor

@BruceForstall@jkoritzinsky@trylek it seems like the format windows job was already broken but since the exit code wasn't flowing from src\coreclr\build.cmd the python script was not exiting with error. Could you help me understand what is wrong?

The formatting job probably needs work to make it work in the new repo. If there's not an issue, we should add one. In particular, it looks like src\jit-format\jit-format.cs in the https://github.com/dotnet/jitutils repo might need work to handle the new artifacts directory and build scripts. e.g., it's looking for:

string[] compileCommandsPath = { _rootPath, "bin", "nmakeobj", "Windows_NT." + _arch + "." + _build, "compile_commands.json" }; 

where _rootPath is the src\coreclr directory, and it's obviously not going to find it.

@erozenfeld Can you look into getting the formatting job to work?

@erozenfeld

Copy link
Copy Markdown
Contributor

@erozenfeld Can you look into getting the formatting job to work?

Sure, I'll fix it tomorrow.

@safern

Copy link
Copy Markdown
MemberAuthor

Sure, I'll fix it tomorrow.

Thanks @erozenfeld could you cc me on whatever it is needed and let me know whenever it is fixed so I can merge this PR?

Comment threadsrc/coreclr/build.cmd
REM =========================================================================================
REM === These two routines are intended for the exit code to propagate to the parent process
REM === Like MSBuild or Powershell. If we directly exit /b 1 from within a if statement in
REM === any of the routines, the exit code is not propagated.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is another great item / design principal that we could include in scripting design guideline documents.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we have a doc for those guidelines yet? If not, do we have an issue?

@erozenfeld

Copy link
Copy Markdown
Contributor

@BruceForstall

The formatting job probably needs work to make it work in the new repo. If there's not an issue, we should add one. In particular, it looks like src\jit-format\jit-format.cs in the https://github.com/dotnet/jitutils repo might need work to handle the new artifacts directory and build scripts.

That was already fixed in dotnet/jitutils#227

We had this CMAKE error

CMake Error: Error required internal CMake variable not set, cmake may not be built correctly.
Missing variable is:
CMAKE_RC_CREATE_SHARED_LIBRARY

for at least 3 years, e.g., see the output here: dotnet/jitutils#64

We get this error when we run
build.cmd -usenmakemakefiles

It's benign, compile_commands.json file is generated and clang-tidy uses it to run.

I'm trying to figure out a way to work around this error. cmake documentation is not very helpful.
I found one relevant thread: https://cmake.org/pipermail/cmake/2012-January/048647.html
and the suggested fix here https://octolinker-demo.now.sh/sakura-editor/sakura/commit/537bdf11452f62d10e1dbc09176d7a2d91c7e68a
Not sure if we need something similar.

Will keep digging.

@safern

Copy link
Copy Markdown
MemberAuthor

We had this CMAKE error

@janvorli might have ideas...

@erozenfeld

Copy link
Copy Markdown
Contributor

Adding

SET(CMAKE_RC_CREATE_SHARED_LIBRARY "${CMAKE_CXX_CREATE_SHARED_LIBRARY}")

at the end of
https://github.com/dotnet/runtime/blob/0c002ccca614688d2bc666ae44ff0ac07b3add5f/src/coreclr/configurecompiler.cmake

makes the error disappear.

@safern

Copy link
Copy Markdown
MemberAuthor

Thanks @erozenfeld. I'll include that as part of my PR.

@safern

Copy link
Copy Markdown
MemberAuthor

I added: ceefc5f to fix it.

@safern
safern merged commit 639122a into dotnet:masterDec 19, 2019
@safern
safern deleted the CoreclrBuildcmdExit branch December 19, 2019 01:37
@ghostghost locked as resolved and limited conversation to collaborators Dec 11, 2020
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants

@safern@ViktorHofer@trylek@dagood@BruceForstall@erozenfeld@jaredpar@jkoritzinsky@Dotnet-GitSync-Bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Use goto to exit in build.cmd so that error code propagates out of cmd - #990

Merged
safern merged 3 commits into
dotnet:masterfrom
safern:CoreclrBuildcmdExit
Dec 19, 2019
Merged

Use goto to exit in build.cmd so that error code propagates out of cmd#990
safern merged 3 commits into
dotnet:masterfrom
safern:CoreclrBuildcmdExit

Conversation

@safern

Copy link
Copy Markdown
Member

If there is a failure in some nested steps of coreclr/build.cmd the exit code was not being propagated due to nested calls and if blocks, instead, go to the end of the script and exit. Because the exit code wasn't propagated, when running build.cmd from the root, coreclr.proj is called and that shells out via Exec into coreclr/build.cmd, and MSBuild was getting a 0 exit code, so the build wouldn't fail if there was a failure. I.e: the sdk.txt failure which was manifesting latter on the build up when the installer tried to crossgen libraries assemblies.

cc: @dotnet/runtime-infrastructure

@ViktorHofer

Copy link
Copy Markdown
Member

What's the difference between an exit and an goto somewhere and then exit?

@trylek

Copy link
Copy Markdown
Member

I don't think there's a difference, I guess Santi is basically trying to create a unified choke point for error handling.

@safern

Copy link
Copy Markdown
MemberAuthor

There is a difference if you're within a subroutine or a call. So basically doing goto and then exiting, goto is telling the script to exit the subroutine and then execute exit /b 1.

@dagood

Copy link
Copy Markdown
Member

This call is the (only) subroutine call in this script, right?

for%%iin (%__BuildArchList%) do (
for%%jin (%__BuildTypeList%) do (
call :BuildOne%%i%%j
)
)

(Based on looking it up--didn't know batch files had this concept.)

@safern

Copy link
Copy Markdown
MemberAuthor

Right. That's the only subroutine call. The weird thing is that if we exit outside of any of these ifs:

https://github.com/dotnet/runtime/blob/master/src/coreclr/build.cmd#L528

The exit code is propagated. However if we exit within the if ( ) blocks, then it is not propagated and the calling process (either Powershell or MSBuild) would get an exit code 0. That's why I decided to do a goto, to be in the root of the script, and that indeed fixes the issue. I've tried everything else, I will try and read the script one more time very careful to see why that can be, however, if any of you have any other better ideas I would really appreciate it.

Comment threadsrc/coreclr/build.cmd
exit /b 1

:ExitWithCode
exit /b !__exitCode!

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually, maybe document the weird subroutine behavior here, so someone doesn't try to remove it in the future thinking it's just someone trying to do "single return". (And if someone hits a similar issue, maybe they'll see this and get their fix without as much headache.)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds good.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is the expectation of this method that a zero exit code is acceptable? Basically is this explicitly an error routine or a general purpose exit routine?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think a general purpose exit routine is acceptable. That's why there's also ExitWithError which exits with 1.

@safern

Copy link
Copy Markdown
MemberAuthor

@BruceForstall@jkoritzinsky@trylek it seems like the format windows job was already broken but since the exit code wasn't flowing from src\coreclr\build.cmd the python script was not exiting with error. Could you help me understand what is wrong?

-- Configuring done
CMake Error: Error required internal CMake variable not set, cmake may not be built correctly.
Missing variable is:
CMAKE_RC_CREATE_SHARED_LIBRARY
CMake Error: Error required internal CMake variable not set, cmake may not be built correctly.
Missing variable is:
CMAKE_RC_CREATE_SHARED_LIBRARY
CMake Error: Error required internal CMake variable not set, cmake may not be built correctly.
Missing variable is:
CMAKE_RC_CREATE_SHARED_LIBRARY
-- Generating done
CMake Generate step failed. Build files cannot be regenerated correctly.
BUILD: Error: failed to generate native component build project

@BruceForstall

Copy link
Copy Markdown
Contributor

@safern Are you saying that "goto" from within a call, then calling "exit" will exit the entire script? I don't believe that's how it works. I thought that any call :local_label needs a corresponding exit /b XXX (or fall off the end of the script).

@BruceForstall

Copy link
Copy Markdown
Contributor

@BruceForstall@jkoritzinsky@trylek it seems like the format windows job was already broken but since the exit code wasn't flowing from src\coreclr\build.cmd the python script was not exiting with error. Could you help me understand what is wrong?

The formatting job probably needs work to make it work in the new repo. If there's not an issue, we should add one. In particular, it looks like src\jit-format\jit-format.cs in the https://github.com/dotnet/jitutils repo might need work to handle the new artifacts directory and build scripts. e.g., it's looking for:

string[] compileCommandsPath = { _rootPath, "bin", "nmakeobj", "Windows_NT." + _arch + "." + _build, "compile_commands.json" }; 

where _rootPath is the src\coreclr directory, and it's obviously not going to find it.

@erozenfeld Can you look into getting the formatting job to work?

@erozenfeld

Copy link
Copy Markdown
Contributor

@erozenfeld Can you look into getting the formatting job to work?

Sure, I'll fix it tomorrow.

@safern

Copy link
Copy Markdown
MemberAuthor

Sure, I'll fix it tomorrow.

Thanks @erozenfeld could you cc me on whatever it is needed and let me know whenever it is fixed so I can merge this PR?

Comment threadsrc/coreclr/build.cmd
REM =========================================================================================
REM === These two routines are intended for the exit code to propagate to the parent process
REM === Like MSBuild or Powershell. If we directly exit /b 1 from within a if statement in
REM === any of the routines, the exit code is not propagated.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is another great item / design principal that we could include in scripting design guideline documents.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we have a doc for those guidelines yet? If not, do we have an issue?

@erozenfeld

Copy link
Copy Markdown
Contributor

@BruceForstall

The formatting job probably needs work to make it work in the new repo. If there's not an issue, we should add one. In particular, it looks like src\jit-format\jit-format.cs in the https://github.com/dotnet/jitutils repo might need work to handle the new artifacts directory and build scripts.

That was already fixed in dotnet/jitutils#227

We had this CMAKE error

CMake Error: Error required internal CMake variable not set, cmake may not be built correctly.
Missing variable is:
CMAKE_RC_CREATE_SHARED_LIBRARY

for at least 3 years, e.g., see the output here: dotnet/jitutils#64

We get this error when we run
build.cmd -usenmakemakefiles

It's benign, compile_commands.json file is generated and clang-tidy uses it to run.

I'm trying to figure out a way to work around this error. cmake documentation is not very helpful.
I found one relevant thread: https://cmake.org/pipermail/cmake/2012-January/048647.html
and the suggested fix here https://octolinker-demo.now.sh/sakura-editor/sakura/commit/537bdf11452f62d10e1dbc09176d7a2d91c7e68a
Not sure if we need something similar.

Will keep digging.

@safern

Copy link
Copy Markdown
MemberAuthor

We had this CMAKE error

@janvorli might have ideas...

@erozenfeld

Copy link
Copy Markdown
Contributor

Adding

SET(CMAKE_RC_CREATE_SHARED_LIBRARY "${CMAKE_CXX_CREATE_SHARED_LIBRARY}")

at the end of
https://github.com/dotnet/runtime/blob/0c002ccca614688d2bc666ae44ff0ac07b3add5f/src/coreclr/configurecompiler.cmake

makes the error disappear.

@safern

Copy link
Copy Markdown
MemberAuthor

Thanks @erozenfeld. I'll include that as part of my PR.

@safern

Copy link
Copy Markdown
MemberAuthor

I added: ceefc5f to fix it.

@safern
safern merged commit 639122a into dotnet:masterDec 19, 2019
@safern
safern deleted the CoreclrBuildcmdExit branch December 19, 2019 01:37
@ghostghost locked as resolved and limited conversation to collaborators Dec 11, 2020
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants

@safern@ViktorHofer@trylek@dagood@BruceForstall@erozenfeld@jaredpar@jkoritzinsky@Dotnet-GitSync-Bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Use goto to exit in build.cmd so that error code propagates out of cmd - #990

Merged
safern merged 3 commits into
dotnet:masterfrom
safern:CoreclrBuildcmdExit
Dec 19, 2019
Merged

Use goto to exit in build.cmd so that error code propagates out of cmd#990
safern merged 3 commits into
dotnet:masterfrom
safern:CoreclrBuildcmdExit

Conversation

@safern

Copy link
Copy Markdown
Member

If there is a failure in some nested steps of coreclr/build.cmd the exit code was not being propagated due to nested calls and if blocks, instead, go to the end of the script and exit. Because the exit code wasn't propagated, when running build.cmd from the root, coreclr.proj is called and that shells out via Exec into coreclr/build.cmd, and MSBuild was getting a 0 exit code, so the build wouldn't fail if there was a failure. I.e: the sdk.txt failure which was manifesting latter on the build up when the installer tried to crossgen libraries assemblies.

cc: @dotnet/runtime-infrastructure

@ViktorHofer

Copy link
Copy Markdown
Member

What's the difference between an exit and an goto somewhere and then exit?

@trylek

Copy link
Copy Markdown
Member

I don't think there's a difference, I guess Santi is basically trying to create a unified choke point for error handling.

@safern

Copy link
Copy Markdown
MemberAuthor

There is a difference if you're within a subroutine or a call. So basically doing goto and then exiting, goto is telling the script to exit the subroutine and then execute exit /b 1.

@dagood

Copy link
Copy Markdown
Member

This call is the (only) subroutine call in this script, right?

for%%iin (%__BuildArchList%) do (
for%%jin (%__BuildTypeList%) do (
call :BuildOne%%i%%j
)
)

(Based on looking it up--didn't know batch files had this concept.)

@safern

Copy link
Copy Markdown
MemberAuthor

Right. That's the only subroutine call. The weird thing is that if we exit outside of any of these ifs:

https://github.com/dotnet/runtime/blob/master/src/coreclr/build.cmd#L528

The exit code is propagated. However if we exit within the if ( ) blocks, then it is not propagated and the calling process (either Powershell or MSBuild) would get an exit code 0. That's why I decided to do a goto, to be in the root of the script, and that indeed fixes the issue. I've tried everything else, I will try and read the script one more time very careful to see why that can be, however, if any of you have any other better ideas I would really appreciate it.

Comment threadsrc/coreclr/build.cmd
exit /b 1

:ExitWithCode
exit /b !__exitCode!

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually, maybe document the weird subroutine behavior here, so someone doesn't try to remove it in the future thinking it's just someone trying to do "single return". (And if someone hits a similar issue, maybe they'll see this and get their fix without as much headache.)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds good.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is the expectation of this method that a zero exit code is acceptable? Basically is this explicitly an error routine or a general purpose exit routine?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think a general purpose exit routine is acceptable. That's why there's also ExitWithError which exits with 1.

@safern

Copy link
Copy Markdown
MemberAuthor

@BruceForstall@jkoritzinsky@trylek it seems like the format windows job was already broken but since the exit code wasn't flowing from src\coreclr\build.cmd the python script was not exiting with error. Could you help me understand what is wrong?

-- Configuring done
CMake Error: Error required internal CMake variable not set, cmake may not be built correctly.
Missing variable is:
CMAKE_RC_CREATE_SHARED_LIBRARY
CMake Error: Error required internal CMake variable not set, cmake may not be built correctly.
Missing variable is:
CMAKE_RC_CREATE_SHARED_LIBRARY
CMake Error: Error required internal CMake variable not set, cmake may not be built correctly.
Missing variable is:
CMAKE_RC_CREATE_SHARED_LIBRARY
-- Generating done
CMake Generate step failed. Build files cannot be regenerated correctly.
BUILD: Error: failed to generate native component build project

@BruceForstall

Copy link
Copy Markdown
Contributor

@safern Are you saying that "goto" from within a call, then calling "exit" will exit the entire script? I don't believe that's how it works. I thought that any call :local_label needs a corresponding exit /b XXX (or fall off the end of the script).

@BruceForstall

Copy link
Copy Markdown
Contributor

@BruceForstall@jkoritzinsky@trylek it seems like the format windows job was already broken but since the exit code wasn't flowing from src\coreclr\build.cmd the python script was not exiting with error. Could you help me understand what is wrong?

The formatting job probably needs work to make it work in the new repo. If there's not an issue, we should add one. In particular, it looks like src\jit-format\jit-format.cs in the https://github.com/dotnet/jitutils repo might need work to handle the new artifacts directory and build scripts. e.g., it's looking for:

string[] compileCommandsPath = { _rootPath, "bin", "nmakeobj", "Windows_NT." + _arch + "." + _build, "compile_commands.json" }; 

where _rootPath is the src\coreclr directory, and it's obviously not going to find it.

@erozenfeld Can you look into getting the formatting job to work?

@erozenfeld

Copy link
Copy Markdown
Contributor

@erozenfeld Can you look into getting the formatting job to work?

Sure, I'll fix it tomorrow.

@safern

Copy link
Copy Markdown
MemberAuthor

Sure, I'll fix it tomorrow.

Thanks @erozenfeld could you cc me on whatever it is needed and let me know whenever it is fixed so I can merge this PR?

Comment threadsrc/coreclr/build.cmd
REM =========================================================================================
REM === These two routines are intended for the exit code to propagate to the parent process
REM === Like MSBuild or Powershell. If we directly exit /b 1 from within a if statement in
REM === any of the routines, the exit code is not propagated.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is another great item / design principal that we could include in scripting design guideline documents.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we have a doc for those guidelines yet? If not, do we have an issue?

@erozenfeld

Copy link
Copy Markdown
Contributor

@BruceForstall

The formatting job probably needs work to make it work in the new repo. If there's not an issue, we should add one. In particular, it looks like src\jit-format\jit-format.cs in the https://github.com/dotnet/jitutils repo might need work to handle the new artifacts directory and build scripts.

That was already fixed in dotnet/jitutils#227

We had this CMAKE error

CMake Error: Error required internal CMake variable not set, cmake may not be built correctly.
Missing variable is:
CMAKE_RC_CREATE_SHARED_LIBRARY

for at least 3 years, e.g., see the output here: dotnet/jitutils#64

We get this error when we run
build.cmd -usenmakemakefiles

It's benign, compile_commands.json file is generated and clang-tidy uses it to run.

I'm trying to figure out a way to work around this error. cmake documentation is not very helpful.
I found one relevant thread: https://cmake.org/pipermail/cmake/2012-January/048647.html
and the suggested fix here https://octolinker-demo.now.sh/sakura-editor/sakura/commit/537bdf11452f62d10e1dbc09176d7a2d91c7e68a
Not sure if we need something similar.

Will keep digging.

@safern

Copy link
Copy Markdown
MemberAuthor

We had this CMAKE error

@janvorli might have ideas...

@erozenfeld

Copy link
Copy Markdown
Contributor

Adding

SET(CMAKE_RC_CREATE_SHARED_LIBRARY "${CMAKE_CXX_CREATE_SHARED_LIBRARY}")

at the end of
https://github.com/dotnet/runtime/blob/0c002ccca614688d2bc666ae44ff0ac07b3add5f/src/coreclr/configurecompiler.cmake

makes the error disappear.

@safern

Copy link
Copy Markdown
MemberAuthor

Thanks @erozenfeld. I'll include that as part of my PR.

@safern

Copy link
Copy Markdown
MemberAuthor

I added: ceefc5f to fix it.

@safern
safern merged commit 639122a into dotnet:masterDec 19, 2019
@safern
safern deleted the CoreclrBuildcmdExit branch December 19, 2019 01:37
@ghostghost locked as resolved and limited conversation to collaborators Dec 11, 2020
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants

@safern@ViktorHofer@trylek@dagood@BruceForstall@erozenfeld@jaredpar@jkoritzinsky@Dotnet-GitSync-Bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Use goto to exit in build.cmd so that error code propagates out of cmd - #990

Merged
safern merged 3 commits into
dotnet:masterfrom
safern:CoreclrBuildcmdExit
Dec 19, 2019
Merged

Use goto to exit in build.cmd so that error code propagates out of cmd#990
safern merged 3 commits into
dotnet:masterfrom
safern:CoreclrBuildcmdExit

Conversation

@safern

Copy link
Copy Markdown
Member

If there is a failure in some nested steps of coreclr/build.cmd the exit code was not being propagated due to nested calls and if blocks, instead, go to the end of the script and exit. Because the exit code wasn't propagated, when running build.cmd from the root, coreclr.proj is called and that shells out via Exec into coreclr/build.cmd, and MSBuild was getting a 0 exit code, so the build wouldn't fail if there was a failure. I.e: the sdk.txt failure which was manifesting latter on the build up when the installer tried to crossgen libraries assemblies.

cc: @dotnet/runtime-infrastructure

@ViktorHofer

Copy link
Copy Markdown
Member

What's the difference between an exit and an goto somewhere and then exit?

@trylek

Copy link
Copy Markdown
Member

I don't think there's a difference, I guess Santi is basically trying to create a unified choke point for error handling.

@safern

Copy link
Copy Markdown
MemberAuthor

There is a difference if you're within a subroutine or a call. So basically doing goto and then exiting, goto is telling the script to exit the subroutine and then execute exit /b 1.

@dagood

Copy link
Copy Markdown
Member

This call is the (only) subroutine call in this script, right?

for%%iin (%__BuildArchList%) do (
for%%jin (%__BuildTypeList%) do (
call :BuildOne%%i%%j
)
)

(Based on looking it up--didn't know batch files had this concept.)

@safern

Copy link
Copy Markdown
MemberAuthor

Right. That's the only subroutine call. The weird thing is that if we exit outside of any of these ifs:

https://github.com/dotnet/runtime/blob/master/src/coreclr/build.cmd#L528

The exit code is propagated. However if we exit within the if ( ) blocks, then it is not propagated and the calling process (either Powershell or MSBuild) would get an exit code 0. That's why I decided to do a goto, to be in the root of the script, and that indeed fixes the issue. I've tried everything else, I will try and read the script one more time very careful to see why that can be, however, if any of you have any other better ideas I would really appreciate it.

Comment threadsrc/coreclr/build.cmd
exit /b 1

:ExitWithCode
exit /b !__exitCode!

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually, maybe document the weird subroutine behavior here, so someone doesn't try to remove it in the future thinking it's just someone trying to do "single return". (And if someone hits a similar issue, maybe they'll see this and get their fix without as much headache.)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds good.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is the expectation of this method that a zero exit code is acceptable? Basically is this explicitly an error routine or a general purpose exit routine?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think a general purpose exit routine is acceptable. That's why there's also ExitWithError which exits with 1.

@safern

Copy link
Copy Markdown
MemberAuthor

@BruceForstall@jkoritzinsky@trylek it seems like the format windows job was already broken but since the exit code wasn't flowing from src\coreclr\build.cmd the python script was not exiting with error. Could you help me understand what is wrong?

-- Configuring done
CMake Error: Error required internal CMake variable not set, cmake may not be built correctly.
Missing variable is:
CMAKE_RC_CREATE_SHARED_LIBRARY
CMake Error: Error required internal CMake variable not set, cmake may not be built correctly.
Missing variable is:
CMAKE_RC_CREATE_SHARED_LIBRARY
CMake Error: Error required internal CMake variable not set, cmake may not be built correctly.
Missing variable is:
CMAKE_RC_CREATE_SHARED_LIBRARY
-- Generating done
CMake Generate step failed. Build files cannot be regenerated correctly.
BUILD: Error: failed to generate native component build project

@BruceForstall

Copy link
Copy Markdown
Contributor

@safern Are you saying that "goto" from within a call, then calling "exit" will exit the entire script? I don't believe that's how it works. I thought that any call :local_label needs a corresponding exit /b XXX (or fall off the end of the script).

@BruceForstall

Copy link
Copy Markdown
Contributor

@BruceForstall@jkoritzinsky@trylek it seems like the format windows job was already broken but since the exit code wasn't flowing from src\coreclr\build.cmd the python script was not exiting with error. Could you help me understand what is wrong?

The formatting job probably needs work to make it work in the new repo. If there's not an issue, we should add one. In particular, it looks like src\jit-format\jit-format.cs in the https://github.com/dotnet/jitutils repo might need work to handle the new artifacts directory and build scripts. e.g., it's looking for:

string[] compileCommandsPath = { _rootPath, "bin", "nmakeobj", "Windows_NT." + _arch + "." + _build, "compile_commands.json" }; 

where _rootPath is the src\coreclr directory, and it's obviously not going to find it.

@erozenfeld Can you look into getting the formatting job to work?

@erozenfeld

Copy link
Copy Markdown
Contributor

@erozenfeld Can you look into getting the formatting job to work?

Sure, I'll fix it tomorrow.

@safern

Copy link
Copy Markdown
MemberAuthor

Sure, I'll fix it tomorrow.

Thanks @erozenfeld could you cc me on whatever it is needed and let me know whenever it is fixed so I can merge this PR?

Comment threadsrc/coreclr/build.cmd
REM =========================================================================================
REM === These two routines are intended for the exit code to propagate to the parent process
REM === Like MSBuild or Powershell. If we directly exit /b 1 from within a if statement in
REM === any of the routines, the exit code is not propagated.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is another great item / design principal that we could include in scripting design guideline documents.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we have a doc for those guidelines yet? If not, do we have an issue?

@erozenfeld

Copy link
Copy Markdown
Contributor

@BruceForstall

The formatting job probably needs work to make it work in the new repo. If there's not an issue, we should add one. In particular, it looks like src\jit-format\jit-format.cs in the https://github.com/dotnet/jitutils repo might need work to handle the new artifacts directory and build scripts.

That was already fixed in dotnet/jitutils#227

We had this CMAKE error

CMake Error: Error required internal CMake variable not set, cmake may not be built correctly.
Missing variable is:
CMAKE_RC_CREATE_SHARED_LIBRARY

for at least 3 years, e.g., see the output here: dotnet/jitutils#64

We get this error when we run
build.cmd -usenmakemakefiles

It's benign, compile_commands.json file is generated and clang-tidy uses it to run.

I'm trying to figure out a way to work around this error. cmake documentation is not very helpful.
I found one relevant thread: https://cmake.org/pipermail/cmake/2012-January/048647.html
and the suggested fix here https://octolinker-demo.now.sh/sakura-editor/sakura/commit/537bdf11452f62d10e1dbc09176d7a2d91c7e68a
Not sure if we need something similar.

Will keep digging.

@safern

Copy link
Copy Markdown
MemberAuthor

We had this CMAKE error

@janvorli might have ideas...

@erozenfeld

Copy link
Copy Markdown
Contributor

Adding

SET(CMAKE_RC_CREATE_SHARED_LIBRARY "${CMAKE_CXX_CREATE_SHARED_LIBRARY}")

at the end of
https://github.com/dotnet/runtime/blob/0c002ccca614688d2bc666ae44ff0ac07b3add5f/src/coreclr/configurecompiler.cmake

makes the error disappear.

@safern

Copy link
Copy Markdown
MemberAuthor

Thanks @erozenfeld. I'll include that as part of my PR.

@safern

Copy link
Copy Markdown
MemberAuthor

I added: ceefc5f to fix it.

@safern
safern merged commit 639122a into dotnet:masterDec 19, 2019
@safern
safern deleted the CoreclrBuildcmdExit branch December 19, 2019 01:37
@ghostghost locked as resolved and limited conversation to collaborators Dec 11, 2020
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants

@safern@ViktorHofer@trylek@dagood@BruceForstall@erozenfeld@jaredpar@jkoritzinsky@Dotnet-GitSync-Bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Use goto to exit in build.cmd so that error code propagates out of cmd - #990

Merged
safern merged 3 commits into
dotnet:masterfrom
safern:CoreclrBuildcmdExit
Dec 19, 2019
Merged

Use goto to exit in build.cmd so that error code propagates out of cmd#990
safern merged 3 commits into
dotnet:masterfrom
safern:CoreclrBuildcmdExit

Conversation

@safern

Copy link
Copy Markdown
Member

If there is a failure in some nested steps of coreclr/build.cmd the exit code was not being propagated due to nested calls and if blocks, instead, go to the end of the script and exit. Because the exit code wasn't propagated, when running build.cmd from the root, coreclr.proj is called and that shells out via Exec into coreclr/build.cmd, and MSBuild was getting a 0 exit code, so the build wouldn't fail if there was a failure. I.e: the sdk.txt failure which was manifesting latter on the build up when the installer tried to crossgen libraries assemblies.

cc: @dotnet/runtime-infrastructure

@ViktorHofer

Copy link
Copy Markdown
Member

What's the difference between an exit and an goto somewhere and then exit?

@trylek

Copy link
Copy Markdown
Member

I don't think there's a difference, I guess Santi is basically trying to create a unified choke point for error handling.

@safern

Copy link
Copy Markdown
MemberAuthor

There is a difference if you're within a subroutine or a call. So basically doing goto and then exiting, goto is telling the script to exit the subroutine and then execute exit /b 1.

@dagood

Copy link
Copy Markdown
Member

This call is the (only) subroutine call in this script, right?

for%%iin (%__BuildArchList%) do (
for%%jin (%__BuildTypeList%) do (
call :BuildOne%%i%%j
)
)

(Based on looking it up--didn't know batch files had this concept.)

@safern

Copy link
Copy Markdown
MemberAuthor

Right. That's the only subroutine call. The weird thing is that if we exit outside of any of these ifs:

https://github.com/dotnet/runtime/blob/master/src/coreclr/build.cmd#L528

The exit code is propagated. However if we exit within the if ( ) blocks, then it is not propagated and the calling process (either Powershell or MSBuild) would get an exit code 0. That's why I decided to do a goto, to be in the root of the script, and that indeed fixes the issue. I've tried everything else, I will try and read the script one more time very careful to see why that can be, however, if any of you have any other better ideas I would really appreciate it.

Comment threadsrc/coreclr/build.cmd
exit /b 1

:ExitWithCode
exit /b !__exitCode!

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually, maybe document the weird subroutine behavior here, so someone doesn't try to remove it in the future thinking it's just someone trying to do "single return". (And if someone hits a similar issue, maybe they'll see this and get their fix without as much headache.)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds good.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is the expectation of this method that a zero exit code is acceptable? Basically is this explicitly an error routine or a general purpose exit routine?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think a general purpose exit routine is acceptable. That's why there's also ExitWithError which exits with 1.

@safern

Copy link
Copy Markdown
MemberAuthor

@BruceForstall@jkoritzinsky@trylek it seems like the format windows job was already broken but since the exit code wasn't flowing from src\coreclr\build.cmd the python script was not exiting with error. Could you help me understand what is wrong?

-- Configuring done
CMake Error: Error required internal CMake variable not set, cmake may not be built correctly.
Missing variable is:
CMAKE_RC_CREATE_SHARED_LIBRARY
CMake Error: Error required internal CMake variable not set, cmake may not be built correctly.
Missing variable is:
CMAKE_RC_CREATE_SHARED_LIBRARY
CMake Error: Error required internal CMake variable not set, cmake may not be built correctly.
Missing variable is:
CMAKE_RC_CREATE_SHARED_LIBRARY
-- Generating done
CMake Generate step failed. Build files cannot be regenerated correctly.
BUILD: Error: failed to generate native component build project

@BruceForstall

Copy link
Copy Markdown
Contributor

@safern Are you saying that "goto" from within a call, then calling "exit" will exit the entire script? I don't believe that's how it works. I thought that any call :local_label needs a corresponding exit /b XXX (or fall off the end of the script).

@BruceForstall

Copy link
Copy Markdown
Contributor

@BruceForstall@jkoritzinsky@trylek it seems like the format windows job was already broken but since the exit code wasn't flowing from src\coreclr\build.cmd the python script was not exiting with error. Could you help me understand what is wrong?

The formatting job probably needs work to make it work in the new repo. If there's not an issue, we should add one. In particular, it looks like src\jit-format\jit-format.cs in the https://github.com/dotnet/jitutils repo might need work to handle the new artifacts directory and build scripts. e.g., it's looking for:

string[] compileCommandsPath = { _rootPath, "bin", "nmakeobj", "Windows_NT." + _arch + "." + _build, "compile_commands.json" }; 

where _rootPath is the src\coreclr directory, and it's obviously not going to find it.

@erozenfeld Can you look into getting the formatting job to work?

@erozenfeld

Copy link
Copy Markdown
Contributor

@erozenfeld Can you look into getting the formatting job to work?

Sure, I'll fix it tomorrow.

@safern

Copy link
Copy Markdown
MemberAuthor

Sure, I'll fix it tomorrow.

Thanks @erozenfeld could you cc me on whatever it is needed and let me know whenever it is fixed so I can merge this PR?

Comment threadsrc/coreclr/build.cmd
REM =========================================================================================
REM === These two routines are intended for the exit code to propagate to the parent process
REM === Like MSBuild or Powershell. If we directly exit /b 1 from within a if statement in
REM === any of the routines, the exit code is not propagated.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is another great item / design principal that we could include in scripting design guideline documents.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we have a doc for those guidelines yet? If not, do we have an issue?

@erozenfeld

Copy link
Copy Markdown
Contributor

@BruceForstall

The formatting job probably needs work to make it work in the new repo. If there's not an issue, we should add one. In particular, it looks like src\jit-format\jit-format.cs in the https://github.com/dotnet/jitutils repo might need work to handle the new artifacts directory and build scripts.

That was already fixed in dotnet/jitutils#227

We had this CMAKE error

CMake Error: Error required internal CMake variable not set, cmake may not be built correctly.
Missing variable is:
CMAKE_RC_CREATE_SHARED_LIBRARY

for at least 3 years, e.g., see the output here: dotnet/jitutils#64

We get this error when we run
build.cmd -usenmakemakefiles

It's benign, compile_commands.json file is generated and clang-tidy uses it to run.

I'm trying to figure out a way to work around this error. cmake documentation is not very helpful.
I found one relevant thread: https://cmake.org/pipermail/cmake/2012-January/048647.html
and the suggested fix here https://octolinker-demo.now.sh/sakura-editor/sakura/commit/537bdf11452f62d10e1dbc09176d7a2d91c7e68a
Not sure if we need something similar.

Will keep digging.

@safern

Copy link
Copy Markdown
MemberAuthor

We had this CMAKE error

@janvorli might have ideas...

@erozenfeld

Copy link
Copy Markdown
Contributor

Adding

SET(CMAKE_RC_CREATE_SHARED_LIBRARY "${CMAKE_CXX_CREATE_SHARED_LIBRARY}")

at the end of
https://github.com/dotnet/runtime/blob/0c002ccca614688d2bc666ae44ff0ac07b3add5f/src/coreclr/configurecompiler.cmake

makes the error disappear.

@safern

Copy link
Copy Markdown
MemberAuthor

Thanks @erozenfeld. I'll include that as part of my PR.

@safern

Copy link
Copy Markdown
MemberAuthor

I added: ceefc5f to fix it.

@safern
safern merged commit 639122a into dotnet:masterDec 19, 2019
@safern
safern deleted the CoreclrBuildcmdExit branch December 19, 2019 01:37
@ghostghost locked as resolved and limited conversation to collaborators Dec 11, 2020
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants

@safern@ViktorHofer@trylek@dagood@BruceForstall@erozenfeld@jaredpar@jkoritzinsky@Dotnet-GitSync-Bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Use goto to exit in build.cmd so that error code propagates out of cmd - #990

Merged
safern merged 3 commits into
dotnet:masterfrom
safern:CoreclrBuildcmdExit
Dec 19, 2019
Merged

Use goto to exit in build.cmd so that error code propagates out of cmd#990
safern merged 3 commits into
dotnet:masterfrom
safern:CoreclrBuildcmdExit

Conversation

@safern

Copy link
Copy Markdown
Member

If there is a failure in some nested steps of coreclr/build.cmd the exit code was not being propagated due to nested calls and if blocks, instead, go to the end of the script and exit. Because the exit code wasn't propagated, when running build.cmd from the root, coreclr.proj is called and that shells out via Exec into coreclr/build.cmd, and MSBuild was getting a 0 exit code, so the build wouldn't fail if there was a failure. I.e: the sdk.txt failure which was manifesting latter on the build up when the installer tried to crossgen libraries assemblies.

cc: @dotnet/runtime-infrastructure

@ViktorHofer

Copy link
Copy Markdown
Member

What's the difference between an exit and an goto somewhere and then exit?

@trylek

Copy link
Copy Markdown
Member

I don't think there's a difference, I guess Santi is basically trying to create a unified choke point for error handling.

@safern

Copy link
Copy Markdown
MemberAuthor

There is a difference if you're within a subroutine or a call. So basically doing goto and then exiting, goto is telling the script to exit the subroutine and then execute exit /b 1.

@dagood

Copy link
Copy Markdown
Member

This call is the (only) subroutine call in this script, right?

for%%iin (%__BuildArchList%) do (
for%%jin (%__BuildTypeList%) do (
call :BuildOne%%i%%j
)
)

(Based on looking it up--didn't know batch files had this concept.)

@safern

Copy link
Copy Markdown
MemberAuthor

Right. That's the only subroutine call. The weird thing is that if we exit outside of any of these ifs:

https://github.com/dotnet/runtime/blob/master/src/coreclr/build.cmd#L528

The exit code is propagated. However if we exit within the if ( ) blocks, then it is not propagated and the calling process (either Powershell or MSBuild) would get an exit code 0. That's why I decided to do a goto, to be in the root of the script, and that indeed fixes the issue. I've tried everything else, I will try and read the script one more time very careful to see why that can be, however, if any of you have any other better ideas I would really appreciate it.

Comment threadsrc/coreclr/build.cmd
exit /b 1

:ExitWithCode
exit /b !__exitCode!

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually, maybe document the weird subroutine behavior here, so someone doesn't try to remove it in the future thinking it's just someone trying to do "single return". (And if someone hits a similar issue, maybe they'll see this and get their fix without as much headache.)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds good.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is the expectation of this method that a zero exit code is acceptable? Basically is this explicitly an error routine or a general purpose exit routine?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think a general purpose exit routine is acceptable. That's why there's also ExitWithError which exits with 1.

@safern

Copy link
Copy Markdown
MemberAuthor

@BruceForstall@jkoritzinsky@trylek it seems like the format windows job was already broken but since the exit code wasn't flowing from src\coreclr\build.cmd the python script was not exiting with error. Could you help me understand what is wrong?

-- Configuring done
CMake Error: Error required internal CMake variable not set, cmake may not be built correctly.
Missing variable is:
CMAKE_RC_CREATE_SHARED_LIBRARY
CMake Error: Error required internal CMake variable not set, cmake may not be built correctly.
Missing variable is:
CMAKE_RC_CREATE_SHARED_LIBRARY
CMake Error: Error required internal CMake variable not set, cmake may not be built correctly.
Missing variable is:
CMAKE_RC_CREATE_SHARED_LIBRARY
-- Generating done
CMake Generate step failed. Build files cannot be regenerated correctly.
BUILD: Error: failed to generate native component build project

@BruceForstall

Copy link
Copy Markdown
Contributor

@safern Are you saying that "goto" from within a call, then calling "exit" will exit the entire script? I don't believe that's how it works. I thought that any call :local_label needs a corresponding exit /b XXX (or fall off the end of the script).

@BruceForstall

Copy link
Copy Markdown
Contributor

@BruceForstall@jkoritzinsky@trylek it seems like the format windows job was already broken but since the exit code wasn't flowing from src\coreclr\build.cmd the python script was not exiting with error. Could you help me understand what is wrong?

The formatting job probably needs work to make it work in the new repo. If there's not an issue, we should add one. In particular, it looks like src\jit-format\jit-format.cs in the https://github.com/dotnet/jitutils repo might need work to handle the new artifacts directory and build scripts. e.g., it's looking for:

string[] compileCommandsPath = { _rootPath, "bin", "nmakeobj", "Windows_NT." + _arch + "." + _build, "compile_commands.json" }; 

where _rootPath is the src\coreclr directory, and it's obviously not going to find it.

@erozenfeld Can you look into getting the formatting job to work?

@erozenfeld

Copy link
Copy Markdown
Contributor

@erozenfeld Can you look into getting the formatting job to work?

Sure, I'll fix it tomorrow.

@safern

Copy link
Copy Markdown
MemberAuthor

Sure, I'll fix it tomorrow.

Thanks @erozenfeld could you cc me on whatever it is needed and let me know whenever it is fixed so I can merge this PR?

Comment threadsrc/coreclr/build.cmd
REM =========================================================================================
REM === These two routines are intended for the exit code to propagate to the parent process
REM === Like MSBuild or Powershell. If we directly exit /b 1 from within a if statement in
REM === any of the routines, the exit code is not propagated.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is another great item / design principal that we could include in scripting design guideline documents.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we have a doc for those guidelines yet? If not, do we have an issue?

@erozenfeld

Copy link
Copy Markdown
Contributor

@BruceForstall

The formatting job probably needs work to make it work in the new repo. If there's not an issue, we should add one. In particular, it looks like src\jit-format\jit-format.cs in the https://github.com/dotnet/jitutils repo might need work to handle the new artifacts directory and build scripts.

That was already fixed in dotnet/jitutils#227

We had this CMAKE error

CMake Error: Error required internal CMake variable not set, cmake may not be built correctly.
Missing variable is:
CMAKE_RC_CREATE_SHARED_LIBRARY

for at least 3 years, e.g., see the output here: dotnet/jitutils#64

We get this error when we run
build.cmd -usenmakemakefiles

It's benign, compile_commands.json file is generated and clang-tidy uses it to run.

I'm trying to figure out a way to work around this error. cmake documentation is not very helpful.
I found one relevant thread: https://cmake.org/pipermail/cmake/2012-January/048647.html
and the suggested fix here https://octolinker-demo.now.sh/sakura-editor/sakura/commit/537bdf11452f62d10e1dbc09176d7a2d91c7e68a
Not sure if we need something similar.

Will keep digging.

@safern

Copy link
Copy Markdown
MemberAuthor

We had this CMAKE error

@janvorli might have ideas...

@erozenfeld

Copy link
Copy Markdown
Contributor

Adding

SET(CMAKE_RC_CREATE_SHARED_LIBRARY "${CMAKE_CXX_CREATE_SHARED_LIBRARY}")

at the end of
https://github.com/dotnet/runtime/blob/0c002ccca614688d2bc666ae44ff0ac07b3add5f/src/coreclr/configurecompiler.cmake

makes the error disappear.

@safern

Copy link
Copy Markdown
MemberAuthor

Thanks @erozenfeld. I'll include that as part of my PR.

@safern

Copy link
Copy Markdown
MemberAuthor

I added: ceefc5f to fix it.

@safern
safern merged commit 639122a into dotnet:masterDec 19, 2019
@safern
safern deleted the CoreclrBuildcmdExit branch December 19, 2019 01:37
@ghostghost locked as resolved and limited conversation to collaborators Dec 11, 2020
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants

@safern@ViktorHofer@trylek@dagood@BruceForstall@erozenfeld@jaredpar@jkoritzinsky@Dotnet-GitSync-Bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Use goto to exit in build.cmd so that error code propagates out of cmd - #990

Merged
safern merged 3 commits into
dotnet:masterfrom
safern:CoreclrBuildcmdExit
Dec 19, 2019
Merged

Use goto to exit in build.cmd so that error code propagates out of cmd#990
safern merged 3 commits into
dotnet:masterfrom
safern:CoreclrBuildcmdExit

Conversation

@safern

Copy link
Copy Markdown
Member

If there is a failure in some nested steps of coreclr/build.cmd the exit code was not being propagated due to nested calls and if blocks, instead, go to the end of the script and exit. Because the exit code wasn't propagated, when running build.cmd from the root, coreclr.proj is called and that shells out via Exec into coreclr/build.cmd, and MSBuild was getting a 0 exit code, so the build wouldn't fail if there was a failure. I.e: the sdk.txt failure which was manifesting latter on the build up when the installer tried to crossgen libraries assemblies.

cc: @dotnet/runtime-infrastructure

@ViktorHofer

Copy link
Copy Markdown
Member

What's the difference between an exit and an goto somewhere and then exit?

@trylek

Copy link
Copy Markdown
Member

I don't think there's a difference, I guess Santi is basically trying to create a unified choke point for error handling.

@safern

Copy link
Copy Markdown
MemberAuthor

There is a difference if you're within a subroutine or a call. So basically doing goto and then exiting, goto is telling the script to exit the subroutine and then execute exit /b 1.

@dagood

Copy link
Copy Markdown
Member

This call is the (only) subroutine call in this script, right?

for%%iin (%__BuildArchList%) do (
for%%jin (%__BuildTypeList%) do (
call :BuildOne%%i%%j
)
)

(Based on looking it up--didn't know batch files had this concept.)

@safern

Copy link
Copy Markdown
MemberAuthor

Right. That's the only subroutine call. The weird thing is that if we exit outside of any of these ifs:

https://github.com/dotnet/runtime/blob/master/src/coreclr/build.cmd#L528

The exit code is propagated. However if we exit within the if ( ) blocks, then it is not propagated and the calling process (either Powershell or MSBuild) would get an exit code 0. That's why I decided to do a goto, to be in the root of the script, and that indeed fixes the issue. I've tried everything else, I will try and read the script one more time very careful to see why that can be, however, if any of you have any other better ideas I would really appreciate it.

Comment threadsrc/coreclr/build.cmd
exit /b 1

:ExitWithCode
exit /b !__exitCode!

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually, maybe document the weird subroutine behavior here, so someone doesn't try to remove it in the future thinking it's just someone trying to do "single return". (And if someone hits a similar issue, maybe they'll see this and get their fix without as much headache.)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds good.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is the expectation of this method that a zero exit code is acceptable? Basically is this explicitly an error routine or a general purpose exit routine?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think a general purpose exit routine is acceptable. That's why there's also ExitWithError which exits with 1.

@safern

Copy link
Copy Markdown
MemberAuthor

@BruceForstall@jkoritzinsky@trylek it seems like the format windows job was already broken but since the exit code wasn't flowing from src\coreclr\build.cmd the python script was not exiting with error. Could you help me understand what is wrong?

-- Configuring done
CMake Error: Error required internal CMake variable not set, cmake may not be built correctly.
Missing variable is:
CMAKE_RC_CREATE_SHARED_LIBRARY
CMake Error: Error required internal CMake variable not set, cmake may not be built correctly.
Missing variable is:
CMAKE_RC_CREATE_SHARED_LIBRARY
CMake Error: Error required internal CMake variable not set, cmake may not be built correctly.
Missing variable is:
CMAKE_RC_CREATE_SHARED_LIBRARY
-- Generating done
CMake Generate step failed. Build files cannot be regenerated correctly.
BUILD: Error: failed to generate native component build project

@BruceForstall

Copy link
Copy Markdown
Contributor

@safern Are you saying that "goto" from within a call, then calling "exit" will exit the entire script? I don't believe that's how it works. I thought that any call :local_label needs a corresponding exit /b XXX (or fall off the end of the script).

@BruceForstall

Copy link
Copy Markdown
Contributor

@BruceForstall@jkoritzinsky@trylek it seems like the format windows job was already broken but since the exit code wasn't flowing from src\coreclr\build.cmd the python script was not exiting with error. Could you help me understand what is wrong?

The formatting job probably needs work to make it work in the new repo. If there's not an issue, we should add one. In particular, it looks like src\jit-format\jit-format.cs in the https://github.com/dotnet/jitutils repo might need work to handle the new artifacts directory and build scripts. e.g., it's looking for:

string[] compileCommandsPath = { _rootPath, "bin", "nmakeobj", "Windows_NT." + _arch + "." + _build, "compile_commands.json" }; 

where _rootPath is the src\coreclr directory, and it's obviously not going to find it.

@erozenfeld Can you look into getting the formatting job to work?

@erozenfeld

Copy link
Copy Markdown
Contributor

@erozenfeld Can you look into getting the formatting job to work?

Sure, I'll fix it tomorrow.

@safern

Copy link
Copy Markdown
MemberAuthor

Sure, I'll fix it tomorrow.

Thanks @erozenfeld could you cc me on whatever it is needed and let me know whenever it is fixed so I can merge this PR?

Comment threadsrc/coreclr/build.cmd
REM =========================================================================================
REM === These two routines are intended for the exit code to propagate to the parent process
REM === Like MSBuild or Powershell. If we directly exit /b 1 from within a if statement in
REM === any of the routines, the exit code is not propagated.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is another great item / design principal that we could include in scripting design guideline documents.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we have a doc for those guidelines yet? If not, do we have an issue?

@erozenfeld

Copy link
Copy Markdown
Contributor

@BruceForstall

The formatting job probably needs work to make it work in the new repo. If there's not an issue, we should add one. In particular, it looks like src\jit-format\jit-format.cs in the https://github.com/dotnet/jitutils repo might need work to handle the new artifacts directory and build scripts.

That was already fixed in dotnet/jitutils#227

We had this CMAKE error

CMake Error: Error required internal CMake variable not set, cmake may not be built correctly.
Missing variable is:
CMAKE_RC_CREATE_SHARED_LIBRARY

for at least 3 years, e.g., see the output here: dotnet/jitutils#64

We get this error when we run
build.cmd -usenmakemakefiles

It's benign, compile_commands.json file is generated and clang-tidy uses it to run.

I'm trying to figure out a way to work around this error. cmake documentation is not very helpful.
I found one relevant thread: https://cmake.org/pipermail/cmake/2012-January/048647.html
and the suggested fix here https://octolinker-demo.now.sh/sakura-editor/sakura/commit/537bdf11452f62d10e1dbc09176d7a2d91c7e68a
Not sure if we need something similar.

Will keep digging.

@safern

Copy link
Copy Markdown
MemberAuthor

We had this CMAKE error

@janvorli might have ideas...

@erozenfeld

Copy link
Copy Markdown
Contributor

Adding

SET(CMAKE_RC_CREATE_SHARED_LIBRARY "${CMAKE_CXX_CREATE_SHARED_LIBRARY}")

at the end of
https://github.com/dotnet/runtime/blob/0c002ccca614688d2bc666ae44ff0ac07b3add5f/src/coreclr/configurecompiler.cmake

makes the error disappear.

@safern

Copy link
Copy Markdown
MemberAuthor

Thanks @erozenfeld. I'll include that as part of my PR.

@safern

Copy link
Copy Markdown
MemberAuthor

I added: ceefc5f to fix it.

@safern
safern merged commit 639122a into dotnet:masterDec 19, 2019
@safern
safern deleted the CoreclrBuildcmdExit branch December 19, 2019 01:37
@ghostghost locked as resolved and limited conversation to collaborators Dec 11, 2020
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants

@safern@ViktorHofer@trylek@dagood@BruceForstall@erozenfeld@jaredpar@jkoritzinsky@Dotnet-GitSync-Bot