| # RESTful API |
| |
| There's a simple restful API that can be used to do compiles to asm and to list compilers. In general all handlers live |
| in `/api/*` endpoints, will accept JSON or text in POSTs, and will return text or JSON responses depending on the |
| request's `Accept` header. |
| |
| At a later date there may be some form of rate-limiting: currently, requests will be queued and dealt with in the same |
| way interactive requests are done for the main site. Authentication might be required at some point in the future (for |
| the main **Compiler Explorer** site anyway). |
| |
| ## Endpoints |
| |
| ### `GET /api/languages` - return a list of languages |
| |
| Returns a list of the currently supported languages, as pairs of languages IDs and their names. |
| |
| ### `GET /api/compilers` - return a list of compilers |
| |
| Returns a list of compilers. In text form, there's a simple formatting of the ID of the compiler, its description and |
| its language ID. In JSON, all the information is returned as an array of compilers, with the `id` key being the primary |
| identifier of each compiler. |
| |
| Due to the amount of compilers and information available through this api call, by default you will only get these |
| fields per compiler: `['id', 'name', 'lang', 'compilerType', 'semver', 'extensions', 'monaco']` |
| |
| If you require different fields, you can specify them by adding `?fields=field1,field2,field3` to your query. |
| |
| To see all the available fields, you can use `?fields=all`. It is not recommended using this by default. |
| |
| ### `GET /api/compilers/<language-id>` - return a list of compilers with matching language |
| |
| Returns a list of compilers for the provided language id. In text form, there's a simple formatting of the ID of the |
| compiler, its description and its language ID. In JSON, all the information is returned as an array of compilers, with |
| the `id` key being the primary identifier of each compiler. |
| |
| The same field restrictions apply as with `GET /api/compilers` |
| |
| ### `GET /api/libraries/<language-id>` - return a list of libraries available with for a language |
| |
| Returns a list of libraries and library versions available for the provided language id. This request only returns data |
| in JSON. |
| |
| You can use the given include paths to supply in the userArguments for compilation. _(deprecated)_ |
| |
| You will need the library id's, and the version id's to supply to **compile** if you want to include libraries during |
| compilation. |
| |
| ### `GET /api/shortlinkinfo/<linkid>` - return information about a given link |
| |
| Returns information like Sourcecode, Compiler settings and libraries for a given link id. This request only returns data |
| in JSON. |
| |
| ### `POST /api/compiler/<compiler-id>/compile` - perform a compilation |
| |
| To specify a compilation request as a JSON document, post it as the appropriate type and send an object of the form: |
| |
| ```JSON |
| { |
| "source": "<Source-to-compile>", |
| "options": { |
| "userArguments": "<Compiler-flags>", |
| "compilerOptions": { |
| "skipAsm": false, |
| "executorRequest": false |
| }, |
| "filters": { |
| "binary": false, |
| "commentOnly": true, |
| "demangle": true, |
| "directives": true, |
| "execute": false, |
| "intel": true, |
| "labels": true, |
| "libraryCode": false, |
| "trim": false |
| }, |
| "tools": [ |
| {"id":"clangtidytrunk", "args":"-checks=*"} |
| ], |
| "libraries": [ |
| {"id": "range-v3", "version": "trunk"}, |
| {"id": "fmt", "version": "400"} |
| ] |
| }, |
| "lang": "<lang-id (Optional)>", |
| "allowStoreCodeDebug": true |
| } |
| ``` |
| |
| Execution Only request example: |
| |
| ```JSON |
| { |
| "source": "int main () { return 1; }", |
| "compiler": "g82", |
| "options": { |
| "userArguments": "-O3", |
| "executeParameters": { |
| "args": ["arg1", "arg2"], |
| "stdin": "hello, world!" |
| }, |
| "compilerOptions": { |
| "executorRequest": true |
| }, |
| "filters": { |
| "execute": true |
| }, |
| "tools": [], |
| "libraries": [ |
| {"id": "openssl", "version": "111c"} |
| ] |
| }, |
| "lang": "c++", |
| "allowStoreCodeDebug": true |
| } |
| ``` |
| |
| The filters are a JSON object with `true`/`false` values. If not supplied, defaults are used. If supplied, the provided |
| filters override their default values. The `compilerOptions` is used to pass extra arguments to the back end, and is |
| probably not useful for most REST users. |
| |
| To force a cache bypass, set `bypassCache` in the root of the request to `true`. |
| |
| Filters include `binary`, `labels`, `intel`, `directives` and `demangle`, which correspond to the UI buttons on the HTML |
| version. |
| |
| With the tools array you can ask CE to execute certain tools available for the current compiler, and also supply |
| arguments for this tool. |
| |
| Libraries can be marked to have their directories available when including their header files. The can be listed by |
| supplying the library ids and versions in an array. The id's to supply can be found with the |
| `/api/libraries/<language-id>` |
| |
| ### `GET /api/formats` - return available code formatters |
| |
| Returns a list of code formatters. The API returns an array of formatter objects which have the following object |
| structure: |
| |
| ```JSON |
| { |
| "exe": "/opt/compiler-explorer/rustfmt-1.4.36/rustfmt", |
| "version": "rustfmt 1.4.36-nightly (7de6968 2021-02-07)", |
| "name": "rustfmt", |
| "styles": [], |
| "type": "rustfmt" |
| } |
| ``` |
| |
| The name property corresponds to the `<formatter>` when requesting `POST /api/format/<formatter>`. The `type` key in the |
| JSON request corresponds to one of the `formatters.<key>.type` found in |
| https://github.com/compiler-explorer/compiler-explorer/blob/main/etc/config/compiler-explorer.amazon.properties#L43 |
| |
| ### `POST /api/format/<formatter>` - perform a formatter run |
| |
| Formats a piece of code according to the given base style using the provided formatter |
| |
| Formatters available can be found with `GET /api/formats` |
| |
| ```JSON |
| { |
| "source": "int main( ) {}", |
| "base": "Google", |
| "useSpaces": false, |
| "tabWidth": 4 |
| } |
| ``` |
| |
| The returned JSON body has the following object structure: |
| |
| ```JSON |
| { |
| "answer": "int main() {}", |
| "exit": 0 |
| } |
| ``` |
| |
| In cases of internal code formatter failure an additional field named `throw` is also provided and set to true. |
| |
| # Non-REST API's |
| |
| ### `POST /api/compiler/<compiler-id>/compile` - perform a compilation |
| |
| This is same endpoint as for compilation using JSON. |
| |
| A text compilation request has the source as the body of the post, and uses query parameters to pass the options and |
| filters. Filters are supplied as a comma-separated string. Use the query parameter `filters=XX` to set the filters |
| directly, else `addFilters=XX` to add a filter to defaults, or `removeFilters` to remove from defaults. Compiler |
| parameters should be passed as `options=-O2` and default to empty. |
| |
| The text request is designed for simplicity for command-line clients like `curl` |
| |
| ```bash |
| $ curl 'https://godbolt.org/api/compiler/g63/compile?options=-Wall' --data-binary 'int foo() { return 1; }' |
| # Compilation provided by Compiler Explorer at godbolt.org |
| foo(): |
| push rbp |
| mov rbp, rsp |
| mov eax, 1 |
| pop rbp |
| ret |
| ``` |
| |
| If JSON is present in the request's `Accept` header, the compilation results are of the form: |
| |
| (_Optional values are marked with a `**`_) |
| |
| ```javascript |
| { |
| "code": 0 if successful, else compiler return code, |
| "stdout": [ |
| { |
| "text": Output, |
| ** "tag": { |
| "line": Source line, |
| "text": Parsed error for that line |
| } |
| }, |
| ... |
| ], |
| "stderr": (format is similar to that of stdout), |
| "asm": [ |
| { |
| "text": Assembly text, |
| "source": {file: null for user input, else path, line: number} or null if none |
| }, |
| ... |
| ], |
| "tools": [], |
| "okToCache": true if output could be locally cached else false, |
| ** "optOutput" : { |
| "displayString" : String displayed in output, |
| "Pass" : [ Missed | Passed | Analysis ] (Specifies the type of optimisation output), |
| "Name" : Name of the output (mostly represents the reason for the output), |
| "DebugLoc" : { |
| "File": Name of file, |
| "Line": Line number, |
| "Column": Column number in line |
| }, |
| "Function": Name of function for which optimisation output is provided, |
| "Args": Array of objects representing the arguments that the optimiser used when trying to optimise |
| } |
| } |
| ``` |
| |
| ### `POST /api/shortener` - saves given state _forever_ to a shortlink and returns the unique id for the link |
| |
| The body of this post should be in the format of a |
| [ClientState](https://github.com/compiler-explorer/compiler-explorer/blob/main/lib/clientstate.js) Be sure that the |
| Content-Type of your post is application/json |
| |
| An example of one the easiest forms of a clientstate: |
| |
| ```JSON |
| { |
| "sessions": [ |
| { |
| "id": 1, |
| "language": "c++", |
| "source": "int main() { return 42; }", |
| "compilers": [ |
| { |
| "id": "g82", |
| "options": "-O3" |
| } |
| ], |
| "executors": [ |
| { |
| "arguments": "arg1", |
| "compiler": { |
| "id": "g92", |
| "libs": [], |
| "options": "-O3" |
| }, |
| "stdin": "" |
| } |
| ] |
| } |
| ] |
| } |
| ``` |
| |
| Returns: |
| |
| ```JSON |
| { |
| "url": "https://godbolt.org/z/Km_340" |
| } |
| ``` |
| |
| The storedId can be used in the api call /api/shortlinkinfo/<id> and to open in the website with a /z/<id> shortlink. |
| |
| ### `GET /z/<id>` - Opens the website from a shortlink |
| |
| This call opens the website in a state that was previously saved using the built-in shortener. |
| |
| ### `GET /z/<id>/code/<sourceid>` - Returns just the sourcecode from a shortlink |
| |
| This call returns plain/text for the code that was previously saved using the built-in shortener. |
| |
| If there were multiple editors during the saved session, you can retrieve them by setting <sourceid> to 1, 2, 3, |
| etcetera, otherwise <sourceid> can be set to 1. |
| |
| ### `GET /clientstate/<base64>` - Opens the website in a given state |
| |
| This call is to open the website with a given state (without having to store the state first with /api/shortener) |
| Instead of sending the ClientState JSON in the post body, it will have to be encoded with base64 and attached directly |
| onto the URL. |
| |
| To avoid problems in reading base64 by the API, some characters must be kept in unicode. Therefore, before calling the API, it is necessary to replace these characters with their respective unicodes. A suggestion is to use the Regex expression `/[\u007F-\uFFFF]/g` that allows mapping these characters. |
| |
| # Implementations |
| |
| Here are some examples of projects using the Compiler Explorer API: |
| |
| - [Commandline CE by ethanhs](https://github.com/ethanhs/cce) (Rust) |
| - [VIM plugin by ldrumm](https://github.com/ldrumm/compiler-explorer.vim) |
| - [API in Delphi by partouf](https://github.com/partouf/compilerexplorer-api) (Delphi) |
| - [QTCreator Plugin by dobokirisame](https://github.com/dobokirisame/CompilerExplorer) (C++) |
| - [CLion plugin by ogrebenyuk](https://github.com/ogrebenyuk/compilerexplorer) (Java) |
| - [QCompilerExplorer - frontend in Qt](https://github.com/Waqar144/QCompilerExplorer) (C++) |
| - [Emacs client - compiler-explorer.el](https://github.com/mkcms/compiler-explorer.el) |
| - [compiler-explorer.nvim by krady21](https://github.com/krady21/compiler-explorer.nvim) (Lua) |