For #771.
5.2 KiB
Build PowerShell on Linux
This guide will walk you through building PowerShell on Linux. We'll start by showing how to set up your environment from scratch.
Environment
These instructions are written assuming the Ubuntu 14.04 LTS, since that's the distro the team uses.
Toolchain Setup
We use the .NET Command Line Interface (dotnet
) to
build the managed components, and CMake to build the native
components. Install the following packages for the toolchain:
dotnet
cmake
make
g++
Unfortunately, the apt-get
feed for dotnet
has been deprecated,
and the latest version is only distributed in the form of three
separate packages, which require manual dependency resolution.
To ease this process, just run ./bootstrap.sh
and enter password
for sudo
when prompted.
The bootstrap script does the following:
- Adds the LLVM package feed
- Installs our dependencies combined with the dependencies of the .NET
CLI toolchain via
apt-get
- Installs the .NET CLI host, shared framework, and SDK by downloading
the three
.deb
packages to/tmp
and usingdpkg -i
.NET CLI
If you have any problems installing dotnet
, please see their
documentation.
The version of .NET CLI is very important, you need a recent build of 1.0.0 (not 1.0.1).
Previous installations of DNX, dnvm
, or older installations of .NET
CLI can cause odd failures when running. Please check your version and
uninstall prior any prior versions.
Git Setup
Using Git requires it to be setup correctly; refer to the Contributing Guidelines.
Please clone the superproject (this repo) and initialize a subset of the submodules:
git clone https://github.com/PowerShell/PowerShell.git
cd PowerShell
git submodule update --init -- src/windows-build src/Modules/Pester src/libpsl-native/test/googletest
Build using our module
We maintain a PowerShell module with
the function Start-PSBuild
to build PowerShell. Since this is
PowerShell code, it requires self-hosting. Fortunately, this is as
easy as downloading and installing the package. Unfortunately, while
the repository is still private, the package cannot be downloaded as
simply as with wget
. We have a script that wraps the GitHub API and
uses a personal access token to authorize and obtain the package.
You can alternativelly download via a browser and upload it to your box via some other method.
GITHUB_TOKEN=<replace with your token> ./download.sh
sudo dpkg -i ./powershell.deb
powershell
You should now be in a powershell
console host that is installed
separately from any development copy you're about to build. Just
import our module and build!
If you cannot or do not want to self-host,
Start-PSBuild
is just a convenience; you can execute each step of the build process yourself in Bash; see [Build manually][#Build manually] below.
Import-Module ./PowerShellGitHubDev.psm1
Start-PSBuild
Congratulations! If everything went right, PowerShell is now built.
The Start-PSBuild
script will output the location of the executable:
./src/Microsoft.PowerShell.Host/bin/Linux/netstandardapp1.5/ubuntu.14.04-x64/powershell
.
Note that the
./build.sh
script is deprecated and will be removed
You can run our cross-platform Pester tests with Start-PSPester
, and
our xUnit tests with Start-PSxUnit
.
Build manually
The following goes into detail about what Start-PSBuild
does.
Build the native library
The libpsl-native.so
library consists of native functions that
CorePsPlatform.cs
P/Invokes.
pushd src/libpsl-native
cmake -DCMAKE_BUILD_TYPE=Debug .
make -j
make test
popd
This library will be emitted in the src/Microsoft.PowerShell.Host
project, where dotnet
consumes it as "content" and thus
automatically deploys it.
Build the managed projects
The Microsoft.PowerShell.Host
project is the cross-platform host for
PowerShell targetting .NET Core. It is the top level project, so
dotnet build
transitively builds all its dependencies, and emits a
powershell
executable. The --configuration Linux
flag is
necessary to ensure that the preprocessor definition LINUX
is
defined (see issue #673).
dotnet restore
cd src/Microsoft.PowerShell.Host
dotnet build --configuration Linux
The executable will be in
./bin/[configuration]/[framework]/[rid]/[binary name]
, where our
configuration is Linux
, framework is netstandardapp1.5
, runtime
identifier is ubuntu.14.04-x64
, and binary name is powershell
. The
function Get-PSOutput
will return the path to the executable; thus
you can execute the development copy via & (Get-PSOutput)
.
For deploying PowerShell, dotnet publish
will emit a publish
directory that contains a flat list of every dependency required for
PowerShell. This can be copied to, say, /usr/local/share/powershell
or packaged.