123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737 |
- .. cmake-manual-description: CMake Server
- cmake-server(7)
- ***************
- .. only:: html
- .. contents::
- Introduction
- ============
- :manual:`cmake(1)` is capable of providing semantic information about
- CMake code it executes to generate a buildsystem. If executed with
- the ``-E server`` command line options, it starts in a long running mode
- and allows a client to request the available information via a JSON protocol.
- The protocol is designed to be useful to IDEs, refactoring tools, and
- other tools which have a need to understand the buildsystem in entirety.
- A single :manual:`cmake-buildsystem(7)` may describe buildsystem contents
- and build properties which differ based on
- :manual:`generation-time context <cmake-generator-expressions(7)>`
- including:
- * The Platform (eg, Windows, APPLE, Linux).
- * The build configuration (eg, Debug, Release, Coverage).
- * The Compiler (eg, MSVC, GCC, Clang) and compiler version.
- * The language of the source files compiled.
- * Available compile features (eg CXX variadic templates).
- * CMake policies.
- The protocol aims to provide information to tooling to satisfy several
- needs:
- #. Provide a complete and easily parsed source of all information relevant
- to the tooling as it relates to the source code. There should be no need
- for tooling to parse generated buildsystems to access include directories
- or compile definitions for example.
- #. Semantic information about the CMake buildsystem itself.
- #. Provide a stable interface for reading the information in the CMake cache.
- #. Information for determining when cmake needs to be re-run as a result of
- file changes.
- Operation
- =========
- Start :manual:`cmake(1)` in the server command mode, supplying the path to
- the build directory to process::
- cmake -E server (--debug|--pipe <NAMED_PIPE>)
- The server will communicate using stdin/stdout (with the ``--debug`` parameter)
- or using a named pipe (with the ``--pipe <NAMED_PIPE>`` parameter).
- When connecting to the server (via named pipe or by starting it in ``--debug``
- mode), the server will reply with a hello message::
- [== "CMake Server" ==[
- {"supportedProtocolVersions":[{"major":1,"minor":0}],"type":"hello"}
- ]== "CMake Server" ==]
- Messages sent to and from the process are wrapped in magic strings::
- [== "CMake Server" ==[
- {
- ... some JSON message ...
- }
- ]== "CMake Server" ==]
- The server is now ready to accept further requests via the named pipe
- or stdin.
- Debugging
- =========
- CMake server mode can be asked to provide statistics on execution times, etc.
- or to dump a copy of the response into a file. This is done passing a "debug"
- JSON object as a child of the request.
- The debug object supports the "showStats" key, which takes a boolean and makes
- the server mode return a "zzzDebug" object with stats as part of its response.
- "dumpToFile" takes a string value and will cause the cmake server to copy
- the response into the given filename.
- This is a response from the cmake server with "showStats" set to true::
- [== "CMake Server" ==[
- {
- "cookie":"",
- "errorMessage":"Waiting for type \"handshake\".",
- "inReplyTo":"unknown",
- "type":"error",
- "zzzDebug": {
- "dumpFile":"/tmp/error.txt",
- "jsonSerialization":0.011016,
- "size":111,
- "totalTime":0.025995
- }
- }
- ]== "CMake Server" ==]
- The server has made a copy of this response into the file /tmp/error.txt and
- took 0.011 seconds to turn the JSON response into a string, and it took 0.025
- seconds to process the request in total. The reply has a size of 111 bytes.
- Protocol API
- ============
- General Message Layout
- ----------------------
- All messages need to have a "type" value, which identifies the type of
- message that is passed back or forth. E.g. the initial message sent by the
- server is of type "hello". Messages without a type will generate an response
- of type "error".
- All requests sent to the server may contain a "cookie" value. This value
- will he handed back unchanged in all responses triggered by the request.
- All responses will contain a value "inReplyTo", which may be empty in
- case of parse errors, but will contain the type of the request message
- in all other cases.
- Type "reply"
- ^^^^^^^^^^^^
- This type is used by the server to reply to requests.
- The message may -- depending on the type of the original request --
- contain values.
- Example::
- [== "CMake Server" ==[
- {"cookie":"zimtstern","inReplyTo":"handshake","type":"reply"}
- ]== "CMake Server" ==]
- Type "error"
- ^^^^^^^^^^^^
- This type is used to return an error condition to the client. It will
- contain an "errorMessage".
- Example::
- [== "CMake Server" ==[
- {"cookie":"","errorMessage":"Protocol version not supported.","inReplyTo":"handshake","type":"error"}
- ]== "CMake Server" ==]
- Type "progress"
- ^^^^^^^^^^^^^^^
- When the server is busy for a long time, it is polite to send back replies of
- type "progress" to the client. These will contain a "progressMessage" with a
- string describing the action currently taking place as well as
- "progressMinimum", "progressMaximum" and "progressCurrent" with integer values
- describing the range of progress.
- Messages of type "progress" will be followed by more "progress" messages or with
- a message of type "reply" or "error" that complete the request.
- "progress" messages may not be emitted after the "reply" or "error" message for
- the request that triggered the responses was delivered.
- Type "message"
- ^^^^^^^^^^^^^^
- A message is triggered when the server processes a request and produces some
- form of output that should be displayed to the user. A Message has a "message"
- with the actual text to display as well as a "title" with a suggested dialog
- box title.
- Example::
- [== "CMake Server" ==[
- {"cookie":"","message":"Something happened.","title":"Title Text","inReplyTo":"handshake","type":"message"}
- ]== "CMake Server" ==]
- Type "signal"
- ^^^^^^^^^^^^^
- The server can send signals when it detects changes in the system state. Signals
- are of type "signal", have an empty "cookie" and "inReplyTo" field and always
- have a "name" set to show which signal was sent.
- Specific Signals
- ----------------
- The cmake server may sent signals with the following names:
- "dirty" Signal
- ^^^^^^^^^^^^^^
- The "dirty" signal is sent whenever the server determines that the configuration
- of the project is no longer up-to-date. This happens when any of the files that have
- an influence on the build system is changed.
- The "dirty" signal may look like this::
- [== "CMake Server" ==[
- {
- "cookie":"",
- "inReplyTo":"",
- "name":"dirty",
- "type":"signal"}
- ]== "CMake Server" ==]
- "fileChange" Signal
- ^^^^^^^^^^^^^^^^^^^
- The "fileChange" signal is sent whenever a watched file is changed. It contains
- the "path" that has changed and a list of "properties" with the kind of change
- that was detected. Possible changes are "change" and "rename".
- The "fileChange" signal looks like this::
- [== "CMake Server" ==[
- {
- "cookie":"",
- "inReplyTo":"",
- "name":"fileChange",
- "path":"/absolute/CMakeLists.txt",
- "properties":["change"],
- "type":"signal"}
- ]== "CMake Server" ==]
- Specific Message Types
- ----------------------
- Type "hello"
- ^^^^^^^^^^^^
- The initial message send by the cmake server on startup is of type "hello".
- This is the only message ever sent by the server that is not of type "reply",
- "progress" or "error".
- It will contain "supportedProtocolVersions" with an array of server protocol
- versions supported by the cmake server. These are JSON objects with "major" and
- "minor" keys containing non-negative integer values. Some versions may be marked
- as experimental. These will contain the "isExperimental" key set to true. Enabling
- these requires a special command line argument when starting the cmake server mode.
- Within a "major" version all "minor" versions are fully backwards compatible.
- New "minor" versions may introduce functionality in such a way that existing
- clients of the same "major" version will continue to work, provided they
- ignore keys in the output that they do not know about.
- Example::
- [== "CMake Server" ==[
- {"supportedProtocolVersions":[{"major":0,"minor":1}],"type":"hello"}
- ]== "CMake Server" ==]
- Type "handshake"
- ^^^^^^^^^^^^^^^^
- The first request that the client may send to the server is of type "handshake".
- This request needs to pass one of the "supportedProtocolVersions" of the "hello"
- type response received earlier back to the server in the "protocolVersion" field.
- Giving the "major" version of the requested protocol version will make the server
- use the latest minor version of that protocol. Use this if you do not explicitly
- need to depend on a specific minor version.
- Protocol version 1.0 requires the following attributes to be set:
- * "sourceDirectory" with a path to the sources
- * "buildDirectory" with a path to the build directory
- * "generator" with the generator name
- * "extraGenerator" (optional!) with the extra generator to be used
- * "platform" with the generator platform (if supported by the generator)
- * "toolset" with the generator toolset (if supported by the generator)
- Protocol version 1.2 makes all but the build directory optional, provided
- there is a valid cache in the build directory that contains all the other
- information already.
- Example::
- [== "CMake Server" ==[
- {"cookie":"zimtstern","type":"handshake","protocolVersion":{"major":0},
- "sourceDirectory":"/home/code/cmake", "buildDirectory":"/tmp/testbuild",
- "generator":"Ninja"}
- ]== "CMake Server" ==]
- which will result in a response type "reply"::
- [== "CMake Server" ==[
- {"cookie":"zimtstern","inReplyTo":"handshake","type":"reply"}
- ]== "CMake Server" ==]
- indicating that the server is ready for action.
- Type "globalSettings"
- ^^^^^^^^^^^^^^^^^^^^^
- This request can be sent after the initial handshake. It will return a
- JSON structure with information on cmake state.
- Example::
- [== "CMake Server" ==[
- {"type":"globalSettings"}
- ]== "CMake Server" ==]
- which will result in a response type "reply"::
- [== "CMake Server" ==[
- {
- "buildDirectory": "/tmp/test-build",
- "capabilities": {
- "generators": [
- {
- "extraGenerators": [],
- "name": "Watcom WMake",
- "platformSupport": false,
- "toolsetSupport": false
- },
- <...>
- ],
- "serverMode": false,
- "version": {
- "isDirty": false,
- "major": 3,
- "minor": 6,
- "patch": 20160830,
- "string": "3.6.20160830-gd6abad",
- "suffix": "gd6abad"
- }
- },
- "checkSystemVars": false,
- "cookie": "",
- "extraGenerator": "",
- "generator": "Ninja",
- "debugOutput": false,
- "inReplyTo": "globalSettings",
- "sourceDirectory": "/home/code/cmake",
- "trace": false,
- "traceExpand": false,
- "type": "reply",
- "warnUninitialized": false,
- "warnUnused": false,
- "warnUnusedCli": true
- }
- ]== "CMake Server" ==]
- Type "setGlobalSettings"
- ^^^^^^^^^^^^^^^^^^^^^^^^
- This request can be sent to change the global settings attributes. Unknown
- attributes are going to be ignored. Read-only attributes reported by
- "globalSettings" are all capabilities, buildDirectory, generator,
- extraGenerator and sourceDirectory. Any attempt to set these will be ignored,
- too.
- All other settings will be changed.
- The server will respond with an empty reply message or an error.
- Example::
- [== "CMake Server" ==[
- {"type":"setGlobalSettings","debugOutput":true}
- ]== "CMake Server" ==]
- CMake will reply to this with::
- [== "CMake Server" ==[
- {"inReplyTo":"setGlobalSettings","type":"reply"}
- ]== "CMake Server" ==]
- Type "configure"
- ^^^^^^^^^^^^^^^^
- This request will configure a project for build.
- To configure a build directory already containing cmake files, it is enough to
- set "buildDirectory" via "setGlobalSettings". To create a fresh build directory
- you also need to set "currentGenerator" and "sourceDirectory" via "setGlobalSettings"
- in addition to "buildDirectory".
- You may a list of strings to "configure" via the "cacheArguments" key. These
- strings will be interpreted similar to command line arguments related to
- cache handling that are passed to the cmake command line client.
- Example::
- [== "CMake Server" ==[
- {"type":"configure", "cacheArguments":["-Dsomething=else"]}
- ]== "CMake Server" ==]
- CMake will reply like this (after reporting progress for some time)::
- [== "CMake Server" ==[
- {"cookie":"","inReplyTo":"configure","type":"reply"}
- ]== "CMake Server" ==]
- Type "compute"
- ^^^^^^^^^^^^^^
- This request will generate build system files in the build directory and
- is only available after a project was successfully "configure"d.
- Example::
- [== "CMake Server" ==[
- {"type":"compute"}
- ]== "CMake Server" ==]
- CMake will reply (after reporting progress information)::
- [== "CMake Server" ==[
- {"cookie":"","inReplyTo":"compute","type":"reply"}
- ]== "CMake Server" ==]
- Type "codemodel"
- ^^^^^^^^^^^^^^^^
- The "codemodel" request can be used after a project was "compute"d successfully.
- It will list the complete project structure as it is known to cmake.
- The reply will contain a key "configurations", which will contain a list of
- configuration objects. Configuration objects are used to destinquish between
- different configurations the build directory might have enabled. While most
- generators only support one configuration, others might support several.
- Each configuration object can have the following keys:
- "name"
- contains the name of the configuration. The name may be empty.
- "projects"
- contains a list of project objects, one for each build project.
- Project objects define one (sub-)project defined in the cmake build system.
- Each project object can have the following keys:
- "name"
- contains the (sub-)projects name.
- "minimumCMakeVersion"
- contains the minimum cmake version allowed for this project, null if the
- project doesn't specify one.
- "hasInstallRule"
- true if the project contains any install rules, false otherwise.
- "sourceDirectory"
- contains the current source directory
- "buildDirectory"
- contains the current build directory.
- "targets"
- contains a list of build system target objects.
- Target objects define individual build targets for a certain configuration.
- Each target object can have the following keys:
- "name"
- contains the name of the target.
- "type"
- defines the type of build of the target. Possible values are
- "STATIC_LIBRARY", "MODULE_LIBRARY", "SHARED_LIBRARY", "OBJECT_LIBRARY",
- "EXECUTABLE", "UTILITY" and "INTERFACE_LIBRARY".
- "fullName"
- contains the full name of the build result (incl. extensions, etc.).
- "sourceDirectory"
- contains the current source directory.
- "buildDirectory"
- contains the current build directory.
- "isGeneratorProvided"
- true if the target is auto-created by a generator, false otherwise
- "hasInstallRule"
- true if the target contains any install rules, false otherwise.
- "installPaths"
- full path to the destination directories defined by target install rules.
- "artifacts"
- with a list of build artifacts. The list is sorted with the most
- important artifacts first (e.g. a .DLL file is listed before a
- .PDB file on windows).
- "linkerLanguage"
- contains the language of the linker used to produce the artifact.
- "linkLibraries"
- with a list of libraries to link to. This value is encoded in the
- system's native shell format.
- "linkFlags"
- with a list of flags to pass to the linker. This value is encoded in
- the system's native shell format.
- "linkLanguageFlags"
- with the flags for a compiler using the linkerLanguage. This value is
- encoded in the system's native shell format.
- "frameworkPath"
- with the framework path (on Apple computers). This value is encoded
- in the system's native shell format.
- "linkPath"
- with the link path. This value is encoded in the system's native shell
- format.
- "sysroot"
- with the sysroot path.
- "fileGroups"
- contains the source files making up the target.
- FileGroups are used to group sources using similar settings together.
- Each fileGroup object may contain the following keys:
- "language"
- contains the programming language used by all files in the group.
- "compileFlags"
- with a string containing all the flags passed to the compiler
- when building any of the files in this group. This value is encoded in
- the system's native shell format.
- "includePath"
- with a list of include paths. Each include path is an object
- containing a "path" with the actual include path and "isSystem" with a bool
- value informing whether this is a normal include or a system include. This
- value is encoded in the system's native shell format.
- "defines"
- with a list of defines in the form "SOMEVALUE" or "SOMEVALUE=42". This
- value is encoded in the system's native shell format.
- "sources"
- with a list of source files.
- All file paths in the fileGroup are either absolute or relative to the
- sourceDirectory of the target.
- Example::
- [== "CMake Server" ==[
- {"type":"codemodel"}
- ]== "CMake Server" ==]
- CMake will reply::
- [== "CMake Server" ==[
- {
- "configurations": [
- {
- "name": "",
- "projects": [
- {
- "buildDirectory": "/tmp/build/Source/CursesDialog/form",
- "name": "CMAKE_FORM",
- "sourceDirectory": "/home/code/src/cmake/Source/CursesDialog/form",
- "targets": [
- {
- "artifacts": [ "/tmp/build/Source/CursesDialog/form/libcmForm.a" ],
- "buildDirectory": "/tmp/build/Source/CursesDialog/form",
- "fileGroups": [
- {
- "compileFlags": " -std=gnu11",
- "defines": [ "CURL_STATICLIB", "LIBARCHIVE_STATIC" ],
- "includePath": [ { "path": "/tmp/build/Utilities" }, <...> ],
- "isGenerated": false,
- "language": "C",
- "sources": [ "fld_arg.c", <...> ]
- }
- ],
- "fullName": "libcmForm.a",
- "linkerLanguage": "C",
- "name": "cmForm",
- "sourceDirectory": "/home/code/src/cmake/Source/CursesDialog/form",
- "type": "STATIC_LIBRARY"
- }
- ]
- },
- <...>
- ]
- }
- ],
- "cookie": "",
- "inReplyTo": "codemodel",
- "type": "reply"
- }
- ]== "CMake Server" ==]
- Type "ctestInfo"
- ^^^^^^^^^^^^^^^^
- The "ctestInfo" request can be used after a project was "compute"d successfully.
- It will list the complete project test structure as it is known to cmake.
- The reply will contain a key "configurations", which will contain a list of
- configuration objects. Configuration objects are used to destinquish between
- different configurations the build directory might have enabled. While most
- generators only support one configuration, others might support several.
- Each configuration object can have the following keys:
- "name"
- contains the name of the configuration. The name may be empty.
- "projects"
- contains a list of project objects, one for each build project.
- Project objects define one (sub-)project defined in the cmake build system.
- Each project object can have the following keys:
- "name"
- contains the (sub-)projects name.
- "ctestInfo"
- contains a list of test objects.
- Each test object can have the following keys:
- "ctestName"
- contains the name of the test.
- "ctestCommand"
- contains the test command.
- "properties"
- contains a list of test property objects.
- Each test property object can have the following keys:
- "key"
- contains the test property key.
- "value"
- contains the test property value.
- Type "cmakeInputs"
- ^^^^^^^^^^^^^^^^^^
- The "cmakeInputs" requests will report files used by CMake as part
- of the build system itself.
- This request is only available after a project was successfully
- "configure"d.
- Example::
- [== "CMake Server" ==[
- {"type":"cmakeInputs"}
- ]== "CMake Server" ==]
- CMake will reply with the following information::
- [== "CMake Server" ==[
- {"buildFiles":
- [
- {"isCMake":true,"isTemporary":false,"sources":["/usr/lib/cmake/...", ... ]},
- {"isCMake":false,"isTemporary":false,"sources":["CMakeLists.txt", ...]},
- {"isCMake":false,"isTemporary":true,"sources":["/tmp/build/CMakeFiles/...", ...]}
- ],
- "cmakeRootDirectory":"/usr/lib/cmake",
- "sourceDirectory":"/home/code/src/cmake",
- "cookie":"",
- "inReplyTo":"cmakeInputs",
- "type":"reply"
- }
- ]== "CMake Server" ==]
- All file names are either relative to the top level source directory or
- absolute.
- The list of files which "isCMake" set to true are part of the cmake installation.
- The list of files witch "isTemporary" set to true are part of the build directory
- and will not survive the build directory getting cleaned out.
- Type "cache"
- ^^^^^^^^^^^^
- The "cache" request will list the cached configuration values.
- Example::
- [== "CMake Server" ==[
- {"type":"cache"}
- ]== "CMake Server" ==]
- CMake will respond with the following output::
- [== "CMake Server" ==[
- {
- "cookie":"","inReplyTo":"cache","type":"reply",
- "cache":
- [
- {
- "key":"SOMEVALUE",
- "properties":
- {
- "ADVANCED":"1",
- "HELPSTRING":"This is not helpful"
- }
- "type":"STRING",
- "value":"TEST"}
- ]
- }
- ]== "CMake Server" ==]
- The output can be limited to a list of keys by passing an array of key names
- to the "keys" optional field of the "cache" request.
- Type "fileSystemWatchers"
- ^^^^^^^^^^^^^^^^^^^^^^^^^
- The server can watch the filesystem for changes. The "fileSystemWatchers"
- command will report on the files and directories watched.
- Example::
- [== "CMake Server" ==[
- {"type":"fileSystemWatchers"}
- ]== "CMake Server" ==]
- CMake will respond with the following output::
- [== "CMake Server" ==[
- {
- "cookie":"","inReplyTo":"fileSystemWatchers","type":"reply",
- "watchedFiles": [ "/absolute/path" ],
- "watchedDirectories": [ "/absolute" ]
- }
- ]== "CMake Server" ==]
|