Skip to content

use rcedit to embed icon and version information into pwsh.exe #5178

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

Merged
merged 2 commits into from
Oct 27, 2017

Conversation

SteveL-MSFT
Copy link
Member

@SteveL-MSFT SteveL-MSFT commented Oct 20, 2017

pwsh.exe today doesn't contain file version information and the icon is only associated with the shortcut file and not the exe

Fix is to use rcedit to embed:

  • icon
  • product version
  • file version
  • product name
  • copyright

Fix #2883
Fix #5166
Fix #5034

@@ -1862,6 +1862,18 @@ function New-MSIPackage
[Switch] $Force
)

## need RCEdit to modify the binaries embedded resources
if (-not (Test-Path "~/.rcedit/rcedit-x64.exe"))
Copy link
Collaborator

Choose a reason for hiding this comment

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

What about Unix?

Copy link
Member Author

Choose a reason for hiding this comment

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

I'm not as familiar on non-Windows with regards to viewing resources (which Explorer does easily), is this something I can do easily with Ubuntu? If so, I can move this to the build step rather than packaging.

Copy link
Member Author

Choose a reason for hiding this comment

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

Also rcedit only works on Windows

Copy link
Collaborator

Choose a reason for hiding this comment

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

Get-Item <file> | fl * show ProductVersion on WSL.

Copy link
Member Author

Choose a reason for hiding this comment

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

@iSazonov not working for me with WSL:

PS /mnt/c/Windows/System32/WindowsPowerShell/v1.0> get-item ./powershell.exe | fl *


PSPath            : Microsoft.PowerShell.Core\FileSystem::/mnt/c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe
PSParentPath      : Microsoft.PowerShell.Core\FileSystem::/mnt/c/Windows/System32/WindowsPowerShell/v1.0
PSChildName       : powershell.exe
PSDrive           : /
PSProvider        : Microsoft.PowerShell.Core\FileSystem
PSIsContainer     : False
Mode              : --r--l
VersionInfo       : File:             /mnt/c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe
                    InternalName:
                    OriginalFilename:
                    FileVersion:
                    FileDescription:
                    Product:
                    ProductVersion:

Copy link
Member Author

Choose a reason for hiding this comment

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

It looks like PowerShell is simply using the FileVersionInfo class which doesn't return anything on Linux:

PS /mnt/c/Windows/System32/WindowsPowerShell/v1.0> [System.Diagnostics.FileVersionInfo]::GetVersionInfo("/mnt/c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe")

ProductVersion   FileVersion      FileName
--------------   -----------      --------
                                  /mnt/c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe

but on Windows:

PS C:\Windows\System32\WindowsPowerShell\v1.0> [System.Diagnostics.FileVersionInfo]::GetVersionInfo("C:\Windows\system32
\WindowsPowerShell\v1.0\powershell.exe")

ProductVersion   FileVersion      FileName
--------------   -----------      --------
10.0.17019.1000  10.0.17019.10... C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe

Copy link
Member Author

Choose a reason for hiding this comment

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

Linux ELF binaries probably don't have a resource section to stuff this info into.

Copy link
Collaborator

@iSazonov iSazonov Oct 21, 2017

Choose a reason for hiding this comment

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

@SteveL-MSFT Why you test the Windows FullCLR exe file? In my test I used SMA.dll from PowerShell Core.

Copy link
Member Author

Choose a reason for hiding this comment

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

I used Windows PowerShell.exe as I knew that had that info populated. I see that SMA.dll from PSCore6 does have that info as does powershell.exe from PSCore6. So dotnet build is adding that, but the executable doesn't have it.

Copy link
Member Author

Choose a reason for hiding this comment

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

This might be because the executable is an actual ELF binary while the dlls are using the same format as Windows making them portable.

@thezim
Copy link
Contributor

thezim commented Oct 20, 2017

This will fix #5034 as well.

@iSazonov
Copy link
Collaborator

iSazonov commented Oct 20, 2017

It seems CoreFX use System.Reflection.Metadata to read FileVersionInfo. Perhaps we can use the API to write meta data too.
CoreFX implementation

@SteveL-MSFT
Copy link
Member Author

@iSazonov I think we can move to that later particularly if we expose cmdlets for it

@iSazonov
Copy link
Collaborator

@SteveL-MSFT Do you want to exclude Unix from the PR?

@SteveL-MSFT
Copy link
Member Author

@iSazonov using the file command, the executable is a native executable whereas the .dll assemblies are PE32+ format which supports the embedded resources. I don't think we can support this for non-Windows executables.

@iSazonov
Copy link
Collaborator

@SteveL-MSFT Thanks for clarify. I see Unix haven't a standard for this.

build.psm1 Outdated
## need RCEdit to modify the binaries embedded resources
if (-not (Test-Path "~/.rcedit/rcedit-x64.exe"))
{
$rceditUrl = "https://github.com/electron/rcedit/releases/download/v1.0.0/rcedit-x64.exe"
Copy link
Member

Choose a reason for hiding this comment

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

Can we install this via chocolatey or nuget? Based on my understanding of our requirements for release builds, this will have to be rewritten sooner rather than later.

Copy link
Member

Choose a reason for hiding this comment

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

And move it to Start-PSBootstrap?

Copy link
Collaborator

Choose a reason for hiding this comment

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

I don't found nuget package.

Copy link
Member Author

Choose a reason for hiding this comment

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

It's not on chocolatey or nuget currently. I could move the install to start-psbootstrap.

Copy link
Member

Choose a reason for hiding this comment

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

It's under MIT license. Nothing keeps us from packaging it our self... and chocolatey, doesn't even package it, it just encapsulates the installation code.

Copy link
Member

Choose a reason for hiding this comment

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

But this can wait until we have to do it.

@@ -1442,6 +1442,15 @@ function Start-PSBootstrap {

# Install Windows dependencies if `-Package` or `-BuildWindowsNative` is specified
if ($Environment.IsWindows) {
## need RCEdit to modify the binaries embedded resources
if (-not (Test-Path "~/.rcedit/rcedit-x64.exe"))
Copy link
Collaborator

Choose a reason for hiding this comment

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

What about Windows 32-bit?

Copy link
Member Author

Choose a reason for hiding this comment

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

Yeah, will add 32-bit support

Copy link
Member Author

Choose a reason for hiding this comment

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

Actually, I don't think any change is needed here. I believe we build x86 running as x64, so we can still use the x64 rcedit to modify the x86 binary.

Copy link
Collaborator

Choose a reason for hiding this comment

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

Clear. Thanks.

Closed.

@TravisEz13 TravisEz13 merged commit 4df7036 into PowerShell:master Oct 27, 2017
@SteveL-MSFT SteveL-MSFT deleted the rcedit branch November 10, 2017 02:11
@thezim thezim mentioned this pull request Sep 2, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants