From 3f5807f1fd53796f58c92d6483a499c238b1fbea Mon Sep 17 00:00:00 2001 From: Blixibon Date: Fri, 21 Oct 2022 12:49:33 -0500 Subject: [PATCH] GitHub build workflows (#204) --- .github/CONTRIBUTING.md | 24 +- .github/labeler.yml | 27 ++ .../workflows/mapbase_build-base-dispatch.yml | 68 +++++ .github/workflows/mapbase_build-base.yml | 265 ++++++++++++++++++ .github/workflows/mapbase_build-sp-games.yml | 37 +++ .../workflows/mapbase_build-sp-maptools.yml | 38 +++ .../workflows/mapbase_build-sp-shaders.yml | 33 +++ .github/workflows/mapbase_pr.yml | 23 ++ sp/src/createmaptoolsprojects | 5 + sp/src/createmaptoolsprojects.bat | 1 + sp/src/createshadersprojects | 5 + sp/src/createshadersprojects.bat | 1 + sp/src/vpc_scripts/groups.vgc | 6 + .../vpc_scripts/source_exe_win_win32_base.vpc | 3 +- 14 files changed, 526 insertions(+), 10 deletions(-) create mode 100644 .github/labeler.yml create mode 100644 .github/workflows/mapbase_build-base-dispatch.yml create mode 100644 .github/workflows/mapbase_build-base.yml create mode 100644 .github/workflows/mapbase_build-sp-games.yml create mode 100644 .github/workflows/mapbase_build-sp-maptools.yml create mode 100644 .github/workflows/mapbase_build-sp-shaders.yml create mode 100644 .github/workflows/mapbase_pr.yml create mode 100755 sp/src/createmaptoolsprojects create mode 100644 sp/src/createmaptoolsprojects.bat create mode 100755 sp/src/createshadersprojects create mode 100644 sp/src/createshadersprojects.bat diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index c51715cf..07391b88 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -23,12 +23,12 @@ All contributions must follow the following rules: is usually not fit for Mapbase. * All content in a contribution must be either already legally open-source or done with the - full permission of the content's original creator(s). If licensing is involved, the contribution - must ensure Mapbase follows said licensing. + full permission of the content's original creator(s). If a license is involved, the contributor + should ensure Mapbase conforms to its terms. * **NOTE:** Due to concerns with mods which do not wish to be open-source, content using GPL licenses (or any license with similar open-source requirements) are currently not allowed to be distributed with Mapbase. - Contributions which can draw from them without actually distributing the licensed content may theoretically - be excepted from this rule. + Contributions which can draw from them without actually distributing the licensed content may be excepted + from this rule. * Contributions must not break existing maps/content or interfere with them in a negative or non-objective way. @@ -41,13 +41,19 @@ All contributions must follow the following rules: * Do not modify the README to add attribution for your contribution. That is handled by Mapbase's maintainers. -Contributions which do not follow these guidelines cannot be accepted into Mapbase. - -Attempting to contribute content which seriously violates the rules above can lead to being blocked from contributing, -especially if done repeatedly. +Contributions which do not follow these guidelines cannot be accepted into Mapbase. Attempting to contribute content +which seriously violates the rules above can lead to being blocked from contributing, especially if done repeatedly. --- - + +Mapbase uses GitHub Actions to help manage issues and pull requests. Some of these workflows build the code of incoming +contributions to make sure they compile properly. The code is compiled separately for Visual Studio 2022 and GCC/G++ 9 (Linux) +and on both Debug and Release configurations. + +If these workflows fail, don't freak out! Accidents can happen frequently due to compiler syntax differences and conflicts +from other contributions. You can look at a failed workflow's log by clicking "Details", which will include the build's output. +Any errors must be resolved by you and/or by code reviewers before a pull request can be merged. + If your contribution is accepted, you may be listed in Mapbase's credits and the README's external content list: https://github.com/mapbase-source/source-sdk-2013/wiki/Mapbase-Credits#Contributors https://github.com/mapbase-source/source-sdk-2013/blob/master/README diff --git a/.github/labeler.yml b/.github/labeler.yml new file mode 100644 index 00000000..cee65e07 --- /dev/null +++ b/.github/labeler.yml @@ -0,0 +1,27 @@ +# +# MAPBASE REPO AUTOMATION +# +# Automatically labels pull requests according to changed file paths. +# See mapbase_pr.yml for more information. +# +Repo: + - '*' + - '.github/**' + +Project Generation: + - '**/src/vpc_scripts/**' + - '**/src/devtools/**' + - '**/src/create*' + +Entities: + - '**/src/game/**/**logic**' + - '**/src/game/**/**point**' + +Shaders: + - '**/src/materialsystem/**' + +VScript: + - '**vscript**' + +Tools: + - '**utils**' \ No newline at end of file diff --git a/.github/workflows/mapbase_build-base-dispatch.yml b/.github/workflows/mapbase_build-base-dispatch.yml new file mode 100644 index 00000000..bd461597 --- /dev/null +++ b/.github/workflows/mapbase_build-base-dispatch.yml @@ -0,0 +1,68 @@ +# +# MAPBASE SOURCE 2013 CI +# +# This can be used to manually build the codebase. +# +# See mapbase_build-base.yml for more information on how this works. + +name: Build Projects (Manual) + +on: + workflow_dispatch: + inputs: + configuration: + description: 'Which configuration to build with' + default: 'Release' + required: true + type: choice + options: + - Release + - Debug + branch: + description: 'Which Source 2013 engine branch to compile for' + default: 'sp' + required: true + type: choice + options: + - sp + - mp + game: + description: 'Name of the game to build (if relevant)' + default: 'episodic' + required: false + type: choice + options: + - episodic + - hl2 + project-group: + description: 'Which group of projects to compile' + required: true + type: choice + options: + - all + - game + - shaders + - maptools + solution-name: + description: 'Name of the solution/makefile' + required: true + type: choice + options: + - everything + - games + - shaders + - maptools + build-on-linux: + description: 'Build on Ubuntu/Linux?' + default: true + required: false + type: boolean + +jobs: + build_manual: + uses: mapbase-source/source-sdk-2013/.github/workflows/mapbase_build-base.yml@feature/github-workflows + with: + configuration: '${{ github.event.inputs.configuration }}' + branch: '${{ github.event.inputs.branch }}' + project-group: '${{ github.event.inputs.project-group }}' + solution-name: '${{ github.event.inputs.solution-name }}' diff --git a/.github/workflows/mapbase_build-base.yml b/.github/workflows/mapbase_build-base.yml new file mode 100644 index 00000000..b5542f6e --- /dev/null +++ b/.github/workflows/mapbase_build-base.yml @@ -0,0 +1,265 @@ +# +# MAPBASE SOURCE 2013 CI +# +# This workflow script automatically builds the Source SDK 2013 codebase on Windows and Linux using GitHub Actions. +# +# This is useful in a number of ways: +# +# 1. It ensures pull requests compile correctly on multiple platforms and provides binaries that can be used to test them. +# 2. It can be used to compile code for releases without having to pull and prepare a local development environment. +# 3. It opens potential for scripts that can employ more principles of CI/CD. (e.g. automatically publishing a release) +# +# This is based on a workflow originally created by z33ky. + +name: Build Projects + +on: + workflow_call: + inputs: + configuration: + description: 'Which configuration to build with' + default: 'Release' + required: true + type: string + branch: + description: 'Which Source 2013 engine branch to compile for' + default: 'sp' + required: true + type: string + game: + description: 'The name of the game to build (if relevant)' + default: 'episodic' + required: false + type: string + project-group: + description: 'Which group of projects to compile' + required: true + type: string + solution-name: + description: 'The name of the solution/makefile' + required: true + type: string + build-on-linux: + description: 'Build on Ubuntu/Linux?' + default: true + required: false + type: boolean + +jobs: + build_windows: + name: Windows (VS2022) + runs-on: windows-latest + + steps: + - uses: actions/checkout@v3 + + - name: Add MSBuild to PATH + uses: microsoft/setup-msbuild@v1.1 + + - name: Enable VS2022 + working-directory: '${{inputs.branch}}/src/vpc_scripts' + shell: bash + run: sed -i 's/^\($Conditional[ ]\+VS2022[ ]\+\).*/\1"1"/' newer_vs_toolsets.vpc + + - name: Pick game + if: inputs.project-group == 'game' || inputs.project-group == 'shaders' + working-directory: '${{inputs.branch}}/src' + shell: bash + run: sed -i 's/\/hl2 \/episodic/\/${{inputs.game}}/' create${{inputs.project-group}}projects.bat + + - name: Create project files + working-directory: '${{inputs.branch}}/src' + shell: cmd + # https://github.com/ValveSoftware/source-sdk-2013/issues/72 + run: | + reg add "HKLM\SOFTWARE\WOW6432Node\Microsoft\VisualStudio\10.0\Projects\{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}" /v DefaultProjectExtension /t REG_SZ /d vcproj /f + create${{inputs.project-group}}projects.bat + + # -------------------------------------------------------------------- + + # "I'm invoking msbuild for each project individually, which looks a bit odd considering there is a solution file which should be able to invoke the builds in their proper order automatically, but passing the solution to msbuild doesn't seem to work." + # https://github.com/mapbase-source/source-sdk-2013/pull/162 + + - name: Build mathlib + #if: steps.filter.outputs.game == 'true' + working-directory: '${{inputs.branch}}/src' + shell: cmd + run: | + msbuild -m -p:Configuration=${{inputs.configuration}} mathlib\mathlib.vcxproj + + - name: Build Base Libraries + if: inputs.project-group == 'all' || inputs.project-group == 'game' || inputs.project-group == 'maptools' + working-directory: '${{inputs.branch}}/src' + shell: cmd + run: | + msbuild -m -p:Configuration=${{inputs.configuration}} raytrace\raytrace.vcxproj + msbuild -m -p:Configuration=${{inputs.configuration}} tier1\tier1.vcxproj + msbuild -m -p:Configuration=${{inputs.configuration}} vgui2\vgui_controls\vgui_controls.vcxproj + msbuild -m -p:Configuration=${{inputs.configuration}} vscript\vscript.vcxproj + + - name: Build Map Tools + if: inputs.project-group == 'all' || inputs.project-group == 'maptools' + working-directory: '${{inputs.branch}}/src' + shell: cmd + run: | + msbuild -m -p:Configuration=${{inputs.configuration}} fgdlib\fgdlib.vcxproj + msbuild -m -p:Configuration=${{inputs.configuration}} utils\vbsp\vbsp.vcxproj + msbuild -m -p:Configuration=${{inputs.configuration}} utils\vvis\vvis_dll.vcxproj + msbuild -m -p:Configuration=${{inputs.configuration}} utils\vvis_launcher\vvis_launcher.vcxproj + msbuild -m -p:Configuration=${{inputs.configuration}} utils\vrad\vrad_dll.vcxproj + msbuild -m -p:Configuration=${{inputs.configuration}} utils\vrad_launcher\vrad_launcher.vcxproj + + - name: Build Shaders + if: inputs.project-group == 'shaders' + working-directory: '${{inputs.branch}}/src' + shell: cmd + run: | + msbuild -m -p:Configuration=${{inputs.configuration}} materialsystem\stdshaders\game_shader_dx9_${{inputs.game}}.vcxproj + + - name: Build Game + if: inputs.project-group == 'game' + working-directory: '${{inputs.branch}}/src' + shell: cmd + run: | + msbuild -m -p:Configuration=${{inputs.configuration}} responserules\runtime\responserules.vcxproj + msbuild -m -p:Configuration=${{inputs.configuration}} game\client\client_${{inputs.game}}.vcxproj + msbuild -m -p:Configuration=${{inputs.configuration}} game\server\server_${{inputs.game}}.vcxproj + + # TODO: Hook to game naming? + - name: Build everything + if: inputs.project-group == 'all' + working-directory: '${{inputs.branch}}/src' + shell: cmd + run: | + msbuild -m -p:Configuration=${{inputs.configuration}} responserules\runtime\responserules.vcxproj + msbuild -m -p:Configuration=${{inputs.configuration}} materialsystem\stdshaders\game_shader_dx9_episodic.vcxproj + msbuild -m -p:Configuration=${{inputs.configuration}} materialsystem\stdshaders\game_shader_dx9_hl2.vcxproj + msbuild -m -p:Configuration=${{inputs.configuration}} game\client\client_episodic.vcxproj + msbuild -m -p:Configuration=${{inputs.configuration}} game\client\client_hl2.vcxproj + msbuild -m -p:Configuration=${{inputs.configuration}} game\server\server_episodic.vcxproj + msbuild -m -p:Configuration=${{inputs.configuration}} game\server\server_hl2.vcxproj + + # -------------------------------------------------------------------- + + - name: Publish Windows game DLLs + if: inputs.project-group == 'all' || inputs.project-group == 'game' + uses: actions/upload-artifact@v3 + with: + name: 'Windows Game DLLs (server & client.dll) [${{ inputs.configuration }}]' + path: | + ${{inputs.branch}}/game/mod_${{inputs.game}}/bin/client.dll + ${{inputs.branch}}/game/mod_${{inputs.game}}/bin/server.dll + if-no-files-found: error + + - name: Publish Windows shader DLL + if: inputs.project-group == 'shaders' + uses: actions/upload-artifact@v3 + with: + name: 'Windows Shader DLL (game_shader_dx9.dll) [${{ inputs.configuration }}]' + path: | + ${{inputs.branch}}/game/mod_${{inputs.game}}/bin/game_shader_dx9.dll + if-no-files-found: error + + - name: Publish Windows map tools + if: inputs.project-group == 'maptools' + uses: actions/upload-artifact@v3 + with: + name: 'Windows Map Tools [${{ inputs.configuration }}]' + path: | + ${{inputs.branch}}/game/bin/vbsp.exe + ${{inputs.branch}}/game/bin/vvis.exe + ${{inputs.branch}}/game/bin/vvis_dll.dll + ${{inputs.branch}}/game/bin/vrad.exe + ${{inputs.branch}}/game/bin/vrad_dll.dll + if-no-files-found: error + + - name: Publish everything (Windows) + if: inputs.project-group == 'all' + uses: actions/upload-artifact@v3 + with: + name: 'Everything (Windows) [${{ inputs.configuration }}]' + path: | + ${{inputs.branch}}/game/bin + ${{inputs.branch}}/game/mod_*/bin + if-no-files-found: error + + build_ubuntu: + if: inputs.build-on-linux == true && inputs.project-group != 'maptools' # No Linux map tools for now + name: Ubuntu (GCC/G++) + runs-on: ubuntu-latest + env: + config: ${{ inputs.configuration }} + + steps: + - uses: actions/checkout@v3 + + - name: Install GCC/G++ multilib + run: sudo apt-get install gcc-multilib g++-multilib + + - name: Pick game + if: inputs.project-group == 'game' || inputs.project-group == 'shaders' + working-directory: '${{inputs.branch}}/src' + shell: bash + run: sed -i 's/\/hl2 \/episodic/\/${{inputs.game}}/' create${{inputs.project-group}}projects + + - name: Set configuration + working-directory: '${{inputs.branch}}/src' + shell: bash + run: | + config=${{inputs.configuration}} + export CFG=${config,,} + echo "config=${CFG}" >> $GITHUB_ENV + + - name: Create project files + working-directory: '${{inputs.branch}}/src' + run: sudo ./create${{inputs.project-group}}projects + + # -------------------------------------------------------------------- + + - name: Build + working-directory: '${{inputs.branch}}/src' + run: make CFG=${{env.config}} -f ${{inputs.solution-name}}.mak + + # -------------------------------------------------------------------- + + - name: Publish Linux game SOs + if: inputs.project-group == 'game' + uses: actions/upload-artifact@v3 + with: + name: 'Linux Game SOs (server & client.so) [${{ inputs.configuration }}]' + path: | + ${{inputs.branch}}/game/mod_${{inputs.game}}/bin/client.so + ${{inputs.branch}}/game/mod_${{inputs.game}}/bin/server.so + if-no-files-found: error + + - name: Publish Linux shader SO + if: inputs.project-group == 'shaders' + uses: actions/upload-artifact@v3 + with: + name: 'Linux Shader SO (game_shader_dx9.so) [${{ inputs.configuration }}]' + path: | + ${{inputs.branch}}/game/mod_${{inputs.game}}/bin/game_shader_dx9.so + if-no-files-found: error + + #- name: Publish Linux map tools + # if: inputs.project-group == 'maptools' + # uses: actions/upload-artifact@v3 + # with: + # name: 'Linux Map Tools [${{ inputs.configuration }}]' + # path: | + # ${{inputs.branch}}/game/bin/vbsp + # ${{inputs.branch}}/game/bin/vvis + # ${{inputs.branch}}/game/bin/vvis_dll.so + # ${{inputs.branch}}/game/bin/vrad + # ${{inputs.branch}}/game/bin/vrad_dll.so + # if-no-files-found: error + + - name: Publish everything (Linux) + if: inputs.project-group == 'all' + uses: actions/upload-artifact@v3 + with: + name: 'Everything (Linux) [${{ inputs.configuration }}]' + path: | + ${{inputs.branch}}/game/bin + ${{inputs.branch}}/game/mod_*/bin + if-no-files-found: error diff --git a/.github/workflows/mapbase_build-sp-games.yml b/.github/workflows/mapbase_build-sp-games.yml new file mode 100644 index 00000000..3e81ca72 --- /dev/null +++ b/.github/workflows/mapbase_build-sp-games.yml @@ -0,0 +1,37 @@ +# +# MAPBASE SOURCE 2013 CI +# +# Builds game projects every time a pull request which modifies the game code is opened. +# If you're using a fork of Mapbase, feel free to configure this to meet your repository's needs. +# +# See mapbase_build-base.yml for more information on how this works. + +name: Build Game Projects #(SP Release) + +on: + pull_request: + branches: + - develop + paths: + - '.github/workflows/mapbase_build-sp-rel-games.yml' + - 'sp/src/vpc_scripts/**' + - 'sp/src/game/**' + - 'sp/src/mathlib/**' + - 'sp/src/responserules/runtime/**' + - 'sp/src/tier1/**' + - 'sp/src/vgui2/vgui_controls/**' + - 'sp/src/vscript/**' + +jobs: + games: + strategy: + matrix: + configuration: [Release, Debug] + uses: ./.github/workflows/mapbase_build-base.yml + with: + configuration: ${{ matrix.configuration }} + branch: 'sp' + game: 'episodic' # Change this if your mod is not using HL2/Episodic game projects + project-group: 'game' + solution-name: 'games' + build-on-linux: true # Disable this if you don't want to compile for Linux diff --git a/.github/workflows/mapbase_build-sp-maptools.yml b/.github/workflows/mapbase_build-sp-maptools.yml new file mode 100644 index 00000000..0ae631b3 --- /dev/null +++ b/.github/workflows/mapbase_build-sp-maptools.yml @@ -0,0 +1,38 @@ +# +# MAPBASE SOURCE 2013 CI +# +# Builds map tool projects every time a pull request which modifies the map tool code is opened. +# If you're using a fork of Mapbase, feel free to configure this to meet your repository's needs. +# +# See mapbase_build-base.yml for more information on how this works. + +name: Build Map Tool Projects #(SP Release) + +on: + pull_request: + branches: + - develop + paths: + - '.github/workflows/mapbase_build-sp-rel-maptools.yml' + - 'sp/src/vpc_scripts/**' + - 'sp/src/utils/vbsp/**' + - 'sp/src/utils/vvis/**' + - 'sp/src/utils/vvis_launcher/**' + - 'sp/src/utils/vrad/**' + - 'sp/src/utils/vrad_launcher/**' + - 'sp/src/mathlib/**' + - 'sp/src/tier1/**' + - 'sp/src/vgui2/vgui_controls/**' + - 'sp/src/vscript/**' + +jobs: + maptools: + strategy: + matrix: + configuration: [Release, Debug] + uses: ./.github/workflows/mapbase_build-base.yml + with: + configuration: ${{ matrix.configuration }} + branch: 'sp' + project-group: 'maptools' + solution-name: 'maptools' diff --git a/.github/workflows/mapbase_build-sp-shaders.yml b/.github/workflows/mapbase_build-sp-shaders.yml new file mode 100644 index 00000000..73036e10 --- /dev/null +++ b/.github/workflows/mapbase_build-sp-shaders.yml @@ -0,0 +1,33 @@ +# +# MAPBASE SOURCE 2013 CI +# +# Builds shader projects every time a pull request which modifies the shader code is opened. +# If you're using a fork of Mapbase, feel free to configure this to meet your repository's needs. +# +# See mapbase_build-base.yml for more information on how this works. + +name: Build Shader Projects #(SP Release) + +on: + pull_request: + branches: + - develop + paths: + - '.github/workflows/mapbase_build-sp-rel-shaders.yml' + - 'sp/src/vpc_scripts/**' + - 'sp/src/materialsystem/**' + - 'sp/src/mathlib/**' + +jobs: + shaders: + strategy: + matrix: + configuration: [Release, Debug] + uses: ./.github/workflows/mapbase_build-base.yml + with: + configuration: ${{ matrix.configuration }} + branch: 'sp' + game: 'episodic' # Change this if your mod is not using HL2/Episodic game projects + project-group: 'shaders' + solution-name: 'shaders' + build-on-linux: true # Disable this if you don't want to compile for Linux diff --git a/.github/workflows/mapbase_pr.yml b/.github/workflows/mapbase_pr.yml new file mode 100644 index 00000000..f06982e4 --- /dev/null +++ b/.github/workflows/mapbase_pr.yml @@ -0,0 +1,23 @@ +# +# MAPBASE REPO AUTOMATION +# +# Automatically labels pull requests according to changed file paths. +# See mapbase_triage-pr.yml for more information. +# +# https://github.com/actions/labeler + +name: Pull Request Automation +on: [pull_request] + +jobs: + label: + + runs-on: ubuntu-latest + permissions: + contents: read + pull-requests: write + + steps: + - uses: actions/labeler@v4 + with: + repo-token: "${{ secrets.GITHUB_TOKEN }}" diff --git a/sp/src/createmaptoolsprojects b/sp/src/createmaptoolsprojects new file mode 100755 index 00000000..9cc950cb --- /dev/null +++ b/sp/src/createmaptoolsprojects @@ -0,0 +1,5 @@ +#!/bin/bash + +pushd `dirname $0` +devtools/bin/vpc /hl2 /episodic +maptools /mksln maptools +popd diff --git a/sp/src/createmaptoolsprojects.bat b/sp/src/createmaptoolsprojects.bat new file mode 100644 index 00000000..e21a53ff --- /dev/null +++ b/sp/src/createmaptoolsprojects.bat @@ -0,0 +1 @@ +devtools\bin\vpc.exe +maptools /mksln maptools.sln diff --git a/sp/src/createshadersprojects b/sp/src/createshadersprojects new file mode 100755 index 00000000..ff4823e0 --- /dev/null +++ b/sp/src/createshadersprojects @@ -0,0 +1,5 @@ +#!/bin/bash + +pushd `dirname $0` +devtools/bin/vpc /hl2 /episodic +shaders /mksln shaders +popd diff --git a/sp/src/createshadersprojects.bat b/sp/src/createshadersprojects.bat new file mode 100644 index 00000000..43569ae5 --- /dev/null +++ b/sp/src/createshadersprojects.bat @@ -0,0 +1 @@ +devtools\bin\vpc.exe /hl2 /episodic +shaders /mksln shaders.sln diff --git a/sp/src/vpc_scripts/groups.vgc b/sp/src/vpc_scripts/groups.vgc index 2ab187fa..b58dc416 100644 --- a/sp/src/vpc_scripts/groups.vgc +++ b/sp/src/vpc_scripts/groups.vgc @@ -26,9 +26,15 @@ $Group "game" "responserules" } +$Group "shaderdlls" +{ + "game_shader_dx9" +} + $Group "shaders" { "game_shader_dx9" + "mathlib" } $Group "everything" diff --git a/sp/src/vpc_scripts/source_exe_win_win32_base.vpc b/sp/src/vpc_scripts/source_exe_win_win32_base.vpc index a6d812ba..4d61b306 100644 --- a/sp/src/vpc_scripts/source_exe_win_win32_base.vpc +++ b/sp/src/vpc_scripts/source_exe_win_win32_base.vpc @@ -67,8 +67,9 @@ $Configuration $PostBuildEvent [!$ANALYZE] { + $CommandLine "if not exist $QUOTE$OUTBINDIR$QUOTE mkdir $QUOTE$OUTBINDIR$QUOTE" "\n" [($VS2015||$VS2017||$VS2019||$VS2022)] + $CommandLine "$BASE" "call $SRCDIR\vpc_scripts\valve_p4_edit.cmd $OUTBINDIR\$(TargetFileName) $SRCDIR" "\n" [!$SOURCESDK && ($VS2015||$VS2017||$VS2019||$VS2022)] $CommandLine "call $SRCDIR\vpc_scripts\valve_p4_edit.cmd $OUTBINDIR\$(TargetFileName) $SRCDIR" "\n" [!$SOURCESDK && !($VS2015||$VS2017||$VS2019||$VS2022)] - $CommandLine "if not exist $QUOTE$OUTBINDIR$QUOTE mkdir $QUOTE$OUTBINDIR$QUOTE" "\n" [!$SOURCESDK && ($VS2015||$VS2017||$VS2019||$VS2022)] $CommandLine "$BASE" "copy $QUOTE$(TargetDir)$QUOTE$(TargetFileName) $OUTBINDIR\$(TargetFileName) >nul" "\n" \ "if ERRORLEVEL 1 goto BuildEventFailed" "\n" \ "if exist $QUOTE$(TargetDir)$QUOTE$(TargetName).map copy $QUOTE$(TargetDir)$QUOTE$(TargetName).map $OUTBINDIR\$(TargetName).map >nul" "\n"