2015-07-02 06:06:29 +08:00
|
|
|
# PowerShell for Linux
|
|
|
|
|
2015-10-09 04:44:37 +08:00
|
|
|
## Obtain the source code
|
2015-07-02 06:06:29 +08:00
|
|
|
|
2015-10-09 04:44:37 +08:00
|
|
|
### Setup Git
|
2015-07-02 06:06:29 +08:00
|
|
|
|
2016-01-13 04:20:54 +08:00
|
|
|
Install [Git][], the version control system. If you're new to Git, peruse the
|
|
|
|
documentation and go through some tutorials; I recommend familiarizing yourself
|
|
|
|
with `checkout`, `branch`, `pull`, `push`, `merge`, and after a while, `rebase`
|
|
|
|
and `cherry-pick`. Please commit early and often.
|
2015-10-09 04:25:59 +08:00
|
|
|
|
2015-07-07 02:56:29 +08:00
|
|
|
The user name and email must be set to do just about anything with Git.
|
2015-07-02 06:06:29 +08:00
|
|
|
|
|
|
|
```sh
|
2015-07-07 02:56:29 +08:00
|
|
|
git config --global user.name "First Last"
|
|
|
|
git config --global user.email "alias@microsoft.com"
|
2015-07-02 06:06:29 +08:00
|
|
|
```
|
|
|
|
|
2016-01-13 04:20:54 +08:00
|
|
|
I highly recommend these configurations to help deal with whitespace, rebasing,
|
|
|
|
and general use of Git.
|
2015-07-02 06:06:29 +08:00
|
|
|
|
2015-10-16 07:28:40 +08:00
|
|
|
> Auto-corrects your command when it's sure (`stats` to `status`)
|
2015-07-02 06:06:29 +08:00
|
|
|
```sh
|
2015-10-09 04:25:59 +08:00
|
|
|
git config --global help.autoCorrect -1
|
2015-10-16 07:28:40 +08:00
|
|
|
```
|
|
|
|
|
|
|
|
> Refuses to merge when pulling, and only pushes to branch with same name.
|
|
|
|
```sh
|
2015-10-09 04:25:59 +08:00
|
|
|
git config --global pull.ff only
|
|
|
|
git config --global push.default current
|
2015-10-16 07:28:40 +08:00
|
|
|
```
|
|
|
|
|
|
|
|
> Shows shorter commit hashes and always shows reference names in the log.
|
|
|
|
```sh
|
|
|
|
git config --global log.abbrevCommit true
|
|
|
|
git config --global log.decorate short
|
|
|
|
```
|
|
|
|
|
|
|
|
> Ignores whitespace changes and uses more information when merging.
|
|
|
|
```sh
|
|
|
|
git config --global apply.ignoreWhitespace change
|
2015-10-09 04:25:59 +08:00
|
|
|
git config --global rerere.enabled true
|
|
|
|
git config --global rerere.autoUpdate true
|
2015-10-16 07:28:40 +08:00
|
|
|
git config --global am.threeWay true
|
2015-07-02 06:06:29 +08:00
|
|
|
```
|
|
|
|
|
2015-10-09 04:25:59 +08:00
|
|
|
[Git]: https://git-scm.com/documentation
|
2015-07-07 02:56:29 +08:00
|
|
|
|
2015-10-09 04:44:37 +08:00
|
|
|
### Setup Visual Studio Online authentication
|
2015-07-07 02:56:29 +08:00
|
|
|
|
2015-10-09 04:25:59 +08:00
|
|
|
To use Git's `https` protocol with VSO, you'll want to setup tokens, and have Git remember them.
|
2015-07-07 02:56:29 +08:00
|
|
|
|
2015-10-09 04:25:59 +08:00
|
|
|
1. `git config --global credential.helper store`
|
|
|
|
2. Login to <https://msostc.visualstudio.com>
|
|
|
|
3. Click your name in the upper left corner and click 'My profile'
|
|
|
|
4. Click the "Security" tab in the left pane (under "Details")
|
|
|
|
5. Click "Add"
|
|
|
|
6. Enter "msostc" for "Description"
|
|
|
|
7. Set "Expires In" to "1 year"
|
|
|
|
8. Choose " msostc" for "Accounts"
|
|
|
|
9. Choose "All scopes"
|
|
|
|
10. Click "Create Token" (you may want to copy this token somewhere safe, as VSO will not show it again!)
|
2015-10-09 04:44:37 +08:00
|
|
|
11. Use this token as the password when cloning (and your username for the username)
|
2015-07-02 06:06:29 +08:00
|
|
|
|
2016-01-13 04:20:54 +08:00
|
|
|
### Setup GitHub authentication
|
|
|
|
|
|
|
|
We are working to move all our repositories to GitHub. Unfortunately, this
|
|
|
|
transition is incomplete, but in progress. The DSC and OMI submodules are
|
|
|
|
hosted on GitHub, and while the former is a public repository, the latter is
|
|
|
|
private, thus requiring authentication.
|
|
|
|
|
|
|
|
You should already have your credential helper setup to "store," and so should
|
|
|
|
use a token with GitHub (instead of your plaintext password). Follow [their
|
|
|
|
instructions](https://help.github.com/articles/creating-an-access-token-for-command-line-use/).
|
|
|
|
|
2015-10-09 04:44:37 +08:00
|
|
|
### Download source code
|
2015-07-02 06:06:29 +08:00
|
|
|
|
2016-01-13 04:20:54 +08:00
|
|
|
Clone our [monad-linux][] source from Visual Studio Online, it's the
|
|
|
|
superproject with a number of submodules.
|
2015-07-02 06:06:29 +08:00
|
|
|
|
|
|
|
```sh
|
2015-10-09 04:25:59 +08:00
|
|
|
git clone --recursive https://msostc.visualstudio.com/DefaultCollection/PS/_git/monad-linux
|
2015-07-02 06:06:29 +08:00
|
|
|
```
|
|
|
|
|
2016-01-13 04:20:54 +08:00
|
|
|
Please read the documentation on [submodules][] if you're not familiar with
|
|
|
|
them. Note that because VSO's "Complete Pull Request" button merges with
|
|
|
|
`--no-ff`, an extra merge commit will always be created. This can be annoying
|
|
|
|
when trying to commit updates to submodules. When a submodule PR is approved,
|
|
|
|
you can "complete" it without a merge commit by merging it to develop manually
|
|
|
|
and pushing the updated head.
|
2015-11-07 03:55:01 +08:00
|
|
|
|
2016-01-13 04:20:54 +08:00
|
|
|
Our convention is to create feature branches `dev/feature` off `master`, except
|
|
|
|
in `src/monad` where we branch off `develop`.
|
2015-07-15 06:07:43 +08:00
|
|
|
|
2015-07-02 06:06:29 +08:00
|
|
|
[monad-linux]: https://msostc.visualstudio.com/DefaultCollection/PS/_git/monad-linux
|
2015-10-09 04:25:59 +08:00
|
|
|
[submodules]: https://www.git-scm.com/book/en/v2/Git-Tools-Submodules
|
2015-07-02 06:06:29 +08:00
|
|
|
|
2015-10-09 04:44:37 +08:00
|
|
|
## Setup build environment
|
2015-07-07 02:56:29 +08:00
|
|
|
|
2016-01-13 04:20:54 +08:00
|
|
|
We use the [.NET Command Line Interface][dotnet-cli] (`dotnet-cli`) to build
|
|
|
|
the managed components, and [CMake][] to build the native components. Install
|
|
|
|
`dotnet-cli` by following their documentation (make sure to install the
|
|
|
|
`dotnet-dev` package to get the latest version). Then install the following
|
|
|
|
dependencies (assuming Ubuntu 14.04):
|
2015-11-07 03:55:01 +08:00
|
|
|
|
2015-12-10 05:38:03 +08:00
|
|
|
```sh
|
2016-01-13 04:20:54 +08:00
|
|
|
sudo apt-get install g++ cmake make lldb-3.6 strace
|
2015-12-10 05:38:03 +08:00
|
|
|
```
|
2015-07-07 02:56:29 +08:00
|
|
|
|
2015-12-10 05:38:03 +08:00
|
|
|
### OMI
|
2015-07-07 02:56:29 +08:00
|
|
|
|
2016-01-13 04:20:54 +08:00
|
|
|
To develop on the PowerShell Remoting Protocol (PSRP), you'll need to be able
|
|
|
|
to compile OMI, which additionally requires:
|
2015-07-07 02:56:29 +08:00
|
|
|
|
2015-12-10 05:38:03 +08:00
|
|
|
```sh
|
2016-01-13 04:20:54 +08:00
|
|
|
sudo apt-get install libpam0g-dev libssl-dev libcurl4-openssl-dev libboost-filesystem-dev
|
2015-12-10 05:38:03 +08:00
|
|
|
```
|
2015-07-07 02:56:29 +08:00
|
|
|
|
2015-12-19 08:11:07 +08:00
|
|
|
[dotnet-cli]: https://github.com/dotnet/cli#new-to-net-cli
|
2015-12-10 05:38:03 +08:00
|
|
|
[CMake]: https://cmake.org/cmake/help/v2.8.12/cmake.html
|
2015-07-07 02:56:29 +08:00
|
|
|
|
2015-10-09 04:44:37 +08:00
|
|
|
## Building
|
2015-07-02 06:06:29 +08:00
|
|
|
|
2016-01-13 04:20:54 +08:00
|
|
|
The command `dotnet restore` must be done at least once from the top directory
|
|
|
|
to obtain all the necessary .NET packages.
|
2015-12-18 03:29:12 +08:00
|
|
|
|
|
|
|
Build with `./build.sh`, which does the following steps.
|
|
|
|
|
|
|
|
> The variable `$BIN` is the output directory, `bin`.
|
2015-12-17 05:57:13 +08:00
|
|
|
|
2015-12-10 05:38:03 +08:00
|
|
|
### Native
|
|
|
|
|
2015-12-17 05:57:13 +08:00
|
|
|
- `libpsnative.so`: native functions that `CorePsPlatform.cs` P/Invokes
|
|
|
|
- `api-ms-win-core-registry-l1-1-0.dll`: registry stub to prevent missing DLL error on shutdown
|
|
|
|
|
|
|
|
#### monad-native
|
|
|
|
|
|
|
|
Driven by CMake, with its own unit tests using Google Test.
|
|
|
|
|
2015-12-10 05:38:03 +08:00
|
|
|
```sh
|
|
|
|
cd src/monad-native
|
|
|
|
cmake -DCMAKE_BUILD_TYPE=Debug .
|
2015-12-17 05:57:13 +08:00
|
|
|
make -j
|
2015-12-10 05:38:03 +08:00
|
|
|
ctest -V
|
2015-12-17 05:57:13 +08:00
|
|
|
# Deploy development copy of libpsnative
|
|
|
|
cp native/libpsnative.so $BIN
|
|
|
|
```
|
|
|
|
|
|
|
|
#### registry-stub
|
|
|
|
|
|
|
|
Provides `RegCloseKey()` to satisfy the disposal of `SafeHandle` objects on shutdown.
|
|
|
|
|
|
|
|
```sh
|
|
|
|
cd src/registry-stub
|
|
|
|
make
|
|
|
|
cp api-ms-win-core-registry-l1-1-0.dll $BIN
|
2015-12-10 05:38:03 +08:00
|
|
|
```
|
|
|
|
|
|
|
|
### Managed
|
2015-11-07 03:55:01 +08:00
|
|
|
|
2015-12-17 05:57:13 +08:00
|
|
|
Builds with `dotnet-cli`. Publishes all dependencies into the `bin` directory.
|
2016-01-13 04:20:54 +08:00
|
|
|
Emits its own native host as `bin/Microsoft.PowerShell.Linux.Host`.
|
2015-12-17 05:57:13 +08:00
|
|
|
|
2015-12-10 05:38:03 +08:00
|
|
|
```sh
|
|
|
|
cd src/Microsoft.PowerShell.Linux.Host
|
2015-12-17 05:57:13 +08:00
|
|
|
dotnet publish --framework dnxcore50 --runtime ubuntu.14.04-x64 --output $BIN
|
|
|
|
# Copy files that dotnet-publish doesn't currently deploy
|
|
|
|
cp *.ps1xml *_profile.ps1 $BIN
|
|
|
|
```
|
|
|
|
|
|
|
|
### PowerShell Remoting Protocol
|
|
|
|
|
2016-01-13 04:20:54 +08:00
|
|
|
PSRP communication is tunneled through OMI using the `monad-omi-provider`.
|
|
|
|
These build steps are not part of the `./build.sh` script.
|
2015-12-17 05:57:13 +08:00
|
|
|
|
|
|
|
#### OMI
|
|
|
|
|
|
|
|
```sh
|
|
|
|
cd src/omi/Unix
|
2016-01-13 04:20:54 +08:00
|
|
|
./configure --dev
|
2015-12-17 05:57:13 +08:00
|
|
|
make -j
|
2015-12-10 05:38:03 +08:00
|
|
|
```
|
|
|
|
|
2015-12-17 05:57:13 +08:00
|
|
|
#### Provider
|
|
|
|
|
2016-01-13 04:20:54 +08:00
|
|
|
The provider uses CMake to build, link, and register with OMI.
|
2015-12-17 05:57:13 +08:00
|
|
|
|
|
|
|
```sh
|
|
|
|
cd src/monad-omi-provider
|
2016-01-13 04:20:54 +08:00
|
|
|
cmake .
|
|
|
|
make -j
|
|
|
|
```
|
|
|
|
|
|
|
|
The provider also maintains its own native host library to initialize the CLR,
|
|
|
|
but there are plans to refactor .NET's packaged host as a shared library.
|
|
|
|
|
|
|
|
### DSC
|
|
|
|
|
|
|
|
DSC also uses OMI, so build it first, then build DSC against it. Unfortunately,
|
|
|
|
DSC cannot be configured to look for OMI elsewhere, so for now you need to
|
|
|
|
symlink it to the expected location.
|
|
|
|
|
|
|
|
```sh
|
|
|
|
ln -s ../omi/Unix/ omi-1.0.8
|
|
|
|
./configure --no-rpm --no-dpkg --local
|
|
|
|
make -j
|
2015-12-17 05:57:13 +08:00
|
|
|
```
|
|
|
|
|
|
|
|
## Running
|
|
|
|
|
2016-01-13 04:20:54 +08:00
|
|
|
- launch local shell with `./bin/Microsoft.PowerShell.Linux.Host`
|
2015-12-17 05:57:13 +08:00
|
|
|
- launch local shell in LLDB with `./debug.sh`
|
|
|
|
- launch `omiserver` for PSRP (and in LLDB) with `./prsp.sh`, and connect with `Enter-PSSession` from Windows
|
|
|
|
|
|
|
|
## Known Issues
|
|
|
|
|
|
|
|
### xUnit
|
|
|
|
|
2016-01-13 04:20:54 +08:00
|
|
|
Sadly, `dotnet-test` is not fully supported on Linux, so our xUnit tests do not
|
|
|
|
currently run. We may be able to work around this, or get the `dotnet-cli` team
|
|
|
|
to fix their xUnit runner. GitHub
|
|
|
|
[issue](https://github.com/dotnet/cli/issues/407).
|