Skip to content

Add a windows launcher program to replace the current .bat files #24858

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

sbc100
Copy link
Collaborator

@sbc100 sbc100 commented Aug 4, 2025

This is still just an experiment but eventually I hope to remove the .bat files in favor of this executable.

There are several reasons to want to do this:

  1. Batch files are notoriously painful to work with and mis-understood.
  2. Should be faster (no need to launch cmd.exe).
  3. Works around several known issues with .bat files including one that is known unsolvable one (see emcc.bat for more details)

@sbc100 sbc100 force-pushed the win32_launcher branch 12 times, most recently from 6c9f005 to a6f3fc0 Compare August 4, 2025 23:44
@sbc100 sbc100 changed the title Add a windows launcher program to replace the current .bat files [WIP] Add a windows launcher program to replace the current .bat files Aug 6, 2025
@sbc100
Copy link
Collaborator Author

sbc100 commented Aug 6, 2025

@dschuff @kripken WDYT?

@kripken
Copy link
Member

kripken commented Aug 6, 2025

I don't know much about windows, but would we need to build this as part of the emsdk, ship it, etc.? How important are the issues solved by this?

@sbc100
Copy link
Collaborator Author

sbc100 commented Aug 7, 2025

I don't know much about windows, but would we need to build this as part of the emsdk, ship it, etc.? How important are the issues solved by this?

I think since its just a tiny .exe we could just check it into git once.. then the create_entry_points.py script would make N copies of it, one for each script.

@kripken
Copy link
Member

kripken commented Aug 7, 2025

I think since its just a tiny .exe we could just check it into git once..

Isn't there windows-on-arm, so a single binary wouldn't work?

@sbc100
Copy link
Collaborator Author

sbc100 commented Aug 7, 2025

I think since its just a tiny .exe we could just check it into git once..

Isn't there windows-on-arm, so a single binary wouldn't work?

True! Although I'm not sure anyone is using that yet. We certainly don't yet provide emsdk binaries for windows/arm64.

@dschuff
Copy link
Member

dschuff commented Aug 7, 2025

I haven't reviewed the code yet but I think this idea is generally good We did something similar for the NaCl compiler (for a different reason, but a similar technique). I think I have a mild preference for building it with emsdk rather than checking it in, but I could be convinced.

}

int main() {
char exePath[MAX_PATH];
Copy link
Member

Choose a reason for hiding this comment

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

Does this work with non-ascii directory/path names?

Copy link
Contributor

Choose a reason for hiding this comment

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

There's a whole world of TCHAR pain and Win32 file API coming someone's way...

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

The new versions handles all that I believe.

@RReverser
Copy link
Collaborator

3. Works around several known issues with .bat files including one that is known unsolvable one (see emcc.bat for more details)

FWIW PowerShell scripts I added a while back should also already solve this issue, and they're chosen by default on Windows when users type emcc ... in PowerShell.

I don't mind the .exe approach, it might make it easier to solve the long-standing issue with Ctrl+C as well - that one is somewhat difficult to solve with either of scripting systems - just want to make sure it's not a burden to maintain.

@RReverser
Copy link
Collaborator

We certainly don't yet provide emsdk binaries for windows/arm64.

Windows have long had system similar to macOS Rosetta, it's just that Windows on ARM has only picked up in popularity recently with new laptops, but essentially any x64 .exe is automatically supported on ARM via translation layer.

Native ARM might be nice to have for wasm-binaries, but for something as simple as this invocation script perf shouldn't matter as much.

@sbc100
Copy link
Collaborator Author

sbc100 commented Aug 9, 2025

  1. Works around several known issues with .bat files including one that is known unsolvable one (see emcc.bat for more details)

FWIW PowerShell scripts I added a while back should also already solve this issue, and they're chosen by default on Windows when users type emcc ... in PowerShell.

I don't mind the .exe approach, it might make it easier to solve the long-standing issue with Ctrl+C as well - that one is somewhat difficult to solve with either of scripting systems - just want to make sure it's not a burden to maintain.

Having to maintain the .ps1 and .bat files in parallel is another reason to make this switch.

Sadly I don't think the .ps1 files can actually replace the .bat files because IIRC powershell is somehow optional in windows so its not guaranteed to always be there.

@RReverser
Copy link
Collaborator

Perhaps worth looking at py2exe than rolling something own?

@sbc100
Copy link
Collaborator Author

sbc100 commented Aug 9, 2025

Perhaps worth looking at py2exe than rolling something own?

I have looked at things like that over the years but the complexity always scared me off. It would also be little sad to loose the "edit-in-place" abilities of the plain-old-python files.

@sbc100
Copy link
Collaborator Author

sbc100 commented Aug 11, 2025

I asked Gemini CLI to help me write a better version. Its seems to have done it!

I asked it to find any discrpencies between these two and it came
up with:

launcher.c Analysis:

The C code replaces the batch script by directly launching Python or ccache. It correctly determines the Python executable and the script to run. Key features include:

  • Long Path Support: It uses the \?\ prefix, removing the 260-character MAX_PATH limit, a major improvement over the batch script.
  • Robust Path Discovery: It uses GetModuleFileNameW to reliably find its own path, avoiding the complex workarounds present in the batch script for PATH lookups.
  • ccache Handling: The ccache logic is similar to the batch script.
  • Argument and Stdin Handling: It uses the robust CommandLineToArgvW for arguments and a more reliable method for the Python stdin bug workaround.

Potential Issues & Discrepancies:

  1. Filename Length Limits: The C launcher is superior. It removes the MAX_PATH limitation of the batch script, so there are no new length restrictions. This is a clear advantage.

  2. Features Missing from launcher.c:

    • EM_WORKAROUND_WIN7_BAD_ERRORLEVEL_BUG: The batch script contains a workaround for a Windows 7 bug causing incorrect exit codes. The C launcher, despite being compiled for Windows 7
      compatibility, lacks this workaround. This is a potential regression for Windows 7 users.
    • %~f0 / %~dp0 Workaround: The batch script's workaround for a PATH lookup bug is obsolete, as the C launcher's method of finding its path is more reliable. This is an improvement.

Conclusion:

The primary concern is the missing EM_WORKAROUND_WIN7_BAD_ERRORLEVEL_BUG handling in launcher.c. This could cause issues for users on Windows 7. Otherwise, the C launcher is a significant
improvement, particularly in its handling of long file paths and command-line arguments. It does not introduce any new filename length limitations. I will now prepare my final answer based on
this.

This is still just an experiment but eventually I hope to remove
the `.bat` files in favor of this executable.

There are several reasons to want to do this:

1. Batch files are notoriously painful to work with and mis-understood.
2. Should be faster (no need to launch cmd.exe).
3. Works around several known issues with .bat files including one that
   is known unsolvable one (see emcc.bat for more details)
@sbc100 sbc100 changed the title [WIP] Add a windows launcher program to replace the current .bat files Add a windows launcher program to replace the current .bat files Aug 11, 2025
@RReverser
Copy link
Collaborator

Sadly I don't think the .ps1 files can actually replace the .bat files because IIRC powershell is somehow optional in windows so its not guaranteed to always be there.

Hm just saw this, what do you mean by optional? It's been bundled with Windows since Windows 7, that's around 15 years now.

Command line still exists for legacy usecases and they can never remove it, but it's purely in maintainance mode (critical bug fixing only).

@sbc100
Copy link
Collaborator Author

sbc100 commented Aug 12, 2025

Sadly I don't think the .ps1 files can actually replace the .bat files because IIRC powershell is somehow optional in windows so its not guaranteed to always be there.

Hm just saw this, what do you mean by optional? It's been bundled with Windows since Windows 7, that's around 15 years now.

Command line still exists for legacy usecases and they can never remove it, but it's purely in maintainance mode (critical bug fixing only).

IIRC there is some kind of "enable powershell" setting? Or "enable .ps1 script to lauch" setting? I don't know for sure since I'm not a windows user, but IIRC that is what came up last time we discuessed replacing the .bat files.

Including both .bat and .ps1 was IIRC the resulting compromise.

@RReverser
Copy link
Collaborator

IIRC there is some kind of "enable powershell" setting? Or "enable .ps1 script to lauch" setting?

I'm not aware of one, no. The only issue is that if you launch PowerShell scripts from command line, you have to explicitly invoke them with pwsh script.ps1 unlike bat which are "self-executable" but as long as you are in PowerShell yourself, it's not something you have to worry about.

I've been using emcc ... which goes to the PowerShell script ever since I added the ps1 wrappers in a PR, and haven't had issues yet.

@sbc100
Copy link
Collaborator Author

sbc100 commented Aug 12, 2025

IIRC there is some kind of "enable powershell" setting? Or "enable .ps1 script to lauch" setting?

I'm not aware of one, no. The only issue is that if you launch PowerShell scripts from command line, you have to explicitly invoke them with pwsh script.ps1 unlike bat which are "self-executable" but as long as you are in PowerShell yourself, it's not something you have to worry about.

I've been using emcc ... which goes to the PowerShell script ever since I added the ps1 wrappers in a PR, and haven't had issues yet.

Right.. so we can't get rid of batch files as long we we want cmd.exe users to be able to type emcc on its own, which I think we absolutely do want.

@juj
Copy link
Collaborator

juj commented Aug 12, 2025

It is a nice idea to try to use an exe instead of a bat launcher, though there is a complexity involved, namely Windows SmartScreen. It will prevent launching any .exe files downloaded off the internet, unless they are signed with a certificate from developer. So in order for this approach to work, we would have to maintain a code signing process so that Windows won't prevent the executables from working.

Batch files are notoriously painful to work with and mis-understood.
Works around several known issues with .bat files including one that is known unsolvable one (see emcc.bat for more details)

Are there current tickets/bugs related to these .bat files? What is the unsolvable issue?

@cwoffenden
Copy link
Contributor

So in order for this approach to work, we would have to maintain a code signing process so that Windows won't prevent the executables from working.

Clang, wasmopt and other executables would be subject to the same.

@juj
Copy link
Collaborator

juj commented Aug 12, 2025

Clang, wasmopt and other executables would be subject to the same.

Yes they are, that is a great point. SmartScreen operates in some kind of reputation based fashion: https://learn.microsoft.com/en-us/defender-endpoint/defender-endpoint-demonstration-app-reputation so I presume that clang and other tools are widely used in the database. Not sure of the exact details though.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants