diff options
author | nickpdemarco <nickpdemarco@gmail.com> | 2023-10-11 14:43:05 -0400 |
---|---|---|
committer | nickpdemarco <nickpdemarco@gmail.com> | 2023-10-11 14:43:05 -0400 |
commit | 9cda199e40c920fcc9c53082b0dabb17d31a8b7f (patch) | |
tree | a4e9a03a9feea17376f5990e19c12818d32ec95e /lib/compilers/win32-mingw-clang.ts | |
parent | 55a2b1455f823026c78b9219f93799af00ef60ae (diff) | |
parent | 10796b3696cf1eef928de8c750b4d3350ee0c2db (diff) | |
download | compiler-explorer-9cda199e40c920fcc9c53082b0dabb17d31a8b7f.tar.gz compiler-explorer-9cda199e40c920fcc9c53082b0dabb17d31a8b7f.zip |
Merge main, resolve conflicts with vala
Diffstat (limited to 'lib/compilers/win32-mingw-clang.ts')
-rw-r--r-- | lib/compilers/win32-mingw-clang.ts | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/lib/compilers/win32-mingw-clang.ts b/lib/compilers/win32-mingw-clang.ts new file mode 100644 index 000000000..6a1990a12 --- /dev/null +++ b/lib/compilers/win32-mingw-clang.ts @@ -0,0 +1,114 @@ +// Copyright (c) 2023, Compiler Explorer Authors +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import path from 'path'; + +import { + BuildResult, + BypassCache, + CompilationResult, + ExecutionOptions, +} from '../../types/compilation/compilation.interfaces.js'; +import {ParseFiltersAndOutputOptions} from '../../types/features/filters.interfaces.js'; + +import {copyNeededDlls} from '../win-utils.js'; + +import {ClangCompiler} from './clang.js'; + +export class Win32MingWClang extends ClangCompiler { + static override get key() { + return 'win32-mingw-clang'; + } + + getExtraPaths(): string[] { + return [path.normalize(path.dirname(this.compiler.exe))]; + } + + override optionsForFilter( + filters: ParseFiltersAndOutputOptions, + outputFilename: string, + userOptions?: string[], + ): string[] { + if (filters.binary) { + filters.dontMaskFilenames = true; + } + + return super.optionsForFilter(filters, outputFilename, userOptions); + } + + override orderArguments( + options: string[], + inputFilename: string, + libIncludes: string[], + libOptions: string[], + libPaths: string[], + libLinks: string[], + userOptions: string[], + staticLibLinks: string[], + ) { + const newUserOptions = userOptions.filter(opt => !opt.startsWith('-l')); + const newLinkOptions = userOptions.filter(opt => opt.startsWith('-l')); + + return options.concat( + newUserOptions, + [this.filename(inputFilename)], + libIncludes, + libOptions, + libPaths, + newLinkOptions, + libLinks, + staticLibLinks, + ); + } + + override getDefaultExecOptions(): ExecutionOptions & {env: Record<string, string>} { + const options = super.getDefaultExecOptions(); + if (!options.env) options.env = {}; + if (!options.env.PATH) options.env.PATH = ''; + options.env.PATH = this.getExtraPaths().join(path.delimiter); + + return options; + } + + override async buildExecutableInFolder(key, dirPath: string): Promise<BuildResult> { + const result = await super.buildExecutableInFolder(key, dirPath); + + if (result.code === 0) { + await copyNeededDlls( + dirPath, + result.executableFilename, + this.exec, + this.compiler.objdumper, + this.getDefaultExecOptions(), + ); + } + + return result; + } + + override async handleExecution(key, executeParameters, bypassCache: BypassCache): Promise<CompilationResult> { + const execOptions = this.getDefaultExecOptions(); + return super.handleExecution(key, {...executeParameters, env: execOptions.env}, bypassCache); + } +} |