# WSL Build A [Sublime Text](https://www.sublimetext.com) package to create build systems running in WSL2. It adds a `wsl_exec` target that: - executes Linux commands within **W**indows **S**ubsystem for **L**inux 2 - provides Linux paths in variables such as `$unix_file` - properly sets environment variables for Linux commands Execution and printing output is performed by Sublime Text's default `exec` build target. ## Installation ### Package Control The easiest way to install is using [Package Control](https://packagecontrol.io). It's listed as `WslBuild`. 1. Open `Command Palette` using ctrl+shift+P or menu item `Tools → Command Palette...` 2. Choose `Package Control: Install Package` 3. Find `WslBuild` and hit Enter ### Manual Install 1. Download appropriate [WslBuild.sublime-package](https://github.com/SublimeText/WslBuild/releases) for your Sublime Text build. 2. Copy it into _Installed Packages_ directory > To find _Installed Packages_... > > 1. call _Menu > Preferences > Browse Packages.._ > 2. Navigate to parent folder ### Clone repository You can clone this repository into your _Sublime Text/Packages_ > **Note** > > To find _Packages_ folder call _Menu > Preferences > Browse Packages..._ ##### Mac OS ```shell cd ~/Library/Application\ Support/Sublime\ Text/Packages/ git clone https://github.com/SublimeText/WslBuild.git ``` ##### Linux ```shell cd ~/.config/sublime-text/Packages git clone https://github.com/SublimeText/WslBuild.git ``` ##### Windows ```shell cd "%APPDATA%\Sublime Text\Packages" git clone https://github.com/SublimeText/WslBuild.git ``` ## Usage ### Defining a Build Set `"target": "wsl_exec"` and `"cancel": {"kill": true}` to be able to cancel a command. > **Note** > > For more information about defining Sublime Text builds see [the official documentation](https://www.sublimetext.com/docs/build_systems.html) #### Required Keys ##### wsl_cmd Set `"wsl_cmd"` instead of `"cmd"`. The command array will be executed through WSL. Can be a `string` or `list` of strings. > **Note** > > Build variables such as $file have a $unix_file counter part with unix style paths. #### Optional Keys ##### wsl_working_dir Set `"wsl_working_dir"` instead of `"working_dir"`. > **Note** > > Build variables such as $file have a $unix_file counter part with unix style paths. ##### wsl_env Set `"wsl_env"` instead of `"env"` to set environment variables that are available to the Linux command. > **Note** > > Build variables such as $file have a $unix_file counter part with unix style paths. Environment variables can be suffixed by conversion flags to specify how their values are treated by WSL. "MY_PATH/p": "C:\\Path\\to\\File" is converted to: 1. `MY_PATH=/mnt/c/Path/to/File` when running unix commands 2. `MY_PATH=C:\\Path\\to\\File` when running windows commands | flag | description |:----:| --- | `/p` | This flag indicates that a path should be translated between WSL paths and Win32 paths. Notice in the example below how we set the var in WSL, add it to WSLENV with the `/p` flag, and then read the variable from cmd.exe and the path translates accordingly. | `/l` | This flag indicates the value is a list of paths. In WSL, it is a colon-delimited list. In Win32, it is a semicolon-delimited list. | `/u` | This flag indicates the value should only be included when invoking WSL from Win32. | `/w` | Notice how it does not convert the path automatically—we need to specify the /p flag to do this. For more information about it, visit: https://devblogs.microsoft.com/commandline/share-environment-vars-between-wsl-and-windows ##### Example Build System to run file in WSL: ```json { "target": "wsl_exec", "cancel": {"kill": true}, "wsl_cmd": "./$unix_file", "wsl_working_dir": "$unix_file_path", } ``` ##### Example Builds for a Rails app in WSL: ```json "build_systems": [ { "name": "Run Current Spec", "target": "wsl_exec", "cancel": {"kill": true}, "wsl_cmd": "bundle exec rake spec" "wsl_env": { "SPEC/p": "$file" }, "wsl_working_dir": "$unix_folder" }, { "name": "Run All Specs", "target": "wsl_exec", "cancel": {"kill": true}, "wsl_cmd": [ "bundle", "exec", "rake", "spec" ], "wsl_working_dir": "$unix_folder", }, { "name": "Run Database Migrations", "target": "wsl_exec", "cancel": {"kill": true}, "wsl_cmd": [ "bundle", "exec", "rake", "db:migrate" ], "wsl_working_dir": "$unix_folder" } ] ``` ### Variables #### Default Variables All default variables are provided in unconverted form in case a windows command is being executed within WSL2. | variable | description | --- | --- | `$packages` | The path to the _Packages/_ folder. | `$platform` | The platform Sublime Text is running on: "windows", "osx" or "linux". | `$file` | The full path, including folder, to the file in the active view. | `$file_path` | The path to the folder that contains the file in the active view. | `$file_name` | The file name (sans folder path) of the file in the active view. | `$file_base_name` | The file name, excluding the extension, of the file in the active view. | `$file_extension` | The extension of the file name of the file in the active view. | `$folder` | The full path to the first folder open in the side bar. | `$project` | The full path to the current project file. | `$project_path` | The path to the folder containing the current project file. | `$project_name` | The file name (sans folder path) of the current project file. | `$project_base_name` | The file name, excluding the extension, of the current project file. | `$project_extension` | The extension of the current project file. see: https://www.sublimetext.com/docs/build_systems.html#variables #### Unix Variables Converted path variables are provided for unix commands being executed within WSL. | variable (unix style) | original variable (windows style) | --- | --- | `$unix_file` | `$file` | `$unix_file_path` | `$file_path` | `$unix_folder` | `$folder` | `$unix_packages` | `$packages` | `$unix_project` | `$project` | `$unix_project_path` | `$project_path` ### Acknowledgments Inspired by - https://github.com/existentialmutt/wsl_build - OdatNurd's technique here https://github.com/STealthy-and-haSTy/SublimeScraps/blob/master/build_enhancements/custom_build_variables.py