This PR adds a detailed Configuration.md document that comprehensively explains the Compiler Explorer configuration system. It covers: - Configuration file structure and hierarchical loading - Property types and automatic conversions - List separators and specialized formats - Group inheritance and compiler configuration - Variable substitution mechanisms - Advanced features like remote compilers and property debugging Additionally, it updates all related documentation to reference this central document for configuration details, reducing duplication and ensuring consistency. This document will serve as the foundation for future configuration system improvements by providing clear documentation of the current implementation.
4.4 KiB
Adding a new language
If you want to add a new language to the site, you should follow this steps:
-
Add the new language to the exported
languagesvariable inlib/languages.ts:- The syntax is as follows:
'language-key': { name: YOUR_LANGUAGE_DISPLAY_NAME, monaco: MONACO_MODE_ID, extensions: ARRAY_OF_FILE_EXTENSIONS_OF_YOUR_LANGUAGE, alias: [], // Leave empty unless needed, logoUrl: PATH_TO_LOGO, logoUrlDark: PATH_TO_DARK_LOGO, // Optional if not needed }- If the language is supported by Monaco Editor (You can find the list
here), you should add it to the list of
languages inside the
MonacoEditorWebpackPluginconfig inwebpack.config.esm.ts - If not, you should implement your own language mode; see
static/modes/asm-mode.tsas an example. Don't forget to require your mode file instatic/modes/_all.ts, in alphabetical order language-keyis how your language will be referred internally by the code. In the rest of this document, replace{language-key}by the corresponding value in the real files.- Add a logo file to the
views/resources/logos/folder and add its path to thelogoUrl{Dark}key(s) in the language object
-
Add
{language-key}to type list intypes/languages.interfaces.ts -
Add a
lib/compilers/{language-key}.tsfile using the template below:import {BaseCompiler} from '../base-compiler.js'; export class LanguageCompiler extends BaseCompiler { static get key() { return 'language'; } }- The value returned by
keyabove corresponds to thecompilerTypevalue inetc/config/{language-key}.defaults.properties(Explained below). This is usually{language-key}, but you can use whatever fits best - Override the
OptionsForFiltermethod from the base class - Comment out the line saying
fs.remove(buildResult.dirPath);inbase-compiler.ts, so the latest CE compile attempt remains on disk for you to review- Remember to undo this change before opening a PR!
- For reference, the basic behaviour of BaseCompiler is:
- make a random temporary folder
- save example.extension to the new folder, the full path to this is the
inputFilename - the
outputFilenameis determined by thegetOutputFilename()method - execute the compiler.exe with the arguments from
OptionsForFilter()and addinginputFilename - be aware that the language class is only instanced once, so storing state is not possible
- If the compiler has problems with the defaults, you will have to override the
runCompiler()method too. When overriding it, here are some ideas- set
execOptions.customCwdparameter if the working directory needs to be somewhere else - set
execOptions.envparameter if the compiler requires special environment variables - manipulate
options, but make sure the user can still add their own arguments in CE
- set
- The value returned by
-
Add your
LanguageCompilertolib/compilers/_all.ts, in alphabetical order -
Add a
etc/config/{language-key}.local.propertiesfile:- For the general configuration system details, refer to Configuration.md
- The specific configuration syntax for compilers is documented in AddingACompiler.md
- This file is ignored by Git, so that you can test the config locally
- You should add 1 compiler for the language you want to test
- Test the command line options of the language compilers outside CE
-
Add a new file
etc/config/{language-key}.defaults.properties. This is where a default configuration will live.- Usually, this loads default compilers from their usual paths on a normal installation (Check
etc/config/c++.defaults.propertiesfor an example)
- Usually, this loads default compilers from their usual paths on a normal installation (Check
-
Of important note, for both files, is to properly define
compilerTypeproperty in the newly added compilers. This should equal the value returned by yourLanguageCompiler.keyfunction -
Running
make dev EXTRA_ARGS="--debug --language {language-key}"to tell CE to only load your new language -
You can check http://127.0.0.1:10240/api/compilers to be sure your language and compilers are there
-
Make an installer in the infra repository
-
Add your language files (
{language-key}.*.propertiesandlib/compilers/{language-key}.ts) to the list in.github/labeler.yml