summaryrefslogtreecommitdiffstats
path: root/Help/variable/BUILD_SHARED_LIBS.rst
blob: 0e80f4200324d84a397cea6e4a4935430b5d4cf4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
BUILD_SHARED_LIBS
-----------------

Tell :command:`add_library` to default to ``SHARED`` libraries,
instead of ``STATIC`` libraries, when called with no explicit library type.

Calls to :command:`add_library` without any explicit library type check
the current ``BUILD_SHARED_LIBS`` variable value.  If it is true, then the
default library type is ``SHARED``.  Otherwise, the default is ``STATIC``.

For example, the code:

.. code-block:: cmake

  add_library(example ${sources})

behaves as if written

.. code-block:: cmake

  if(BUILD_SHARED_LIBS)
    add_library(example SHARED ${sources})
  else()
    add_library(example STATIC ${sources})
  endif()

CMake does not define ``BUILD_SHARED_LIBS`` by default, but projects
often create a cache entry for it using the :command:`option` command:

.. code-block:: cmake

  option(BUILD_SHARED_LIBS "Build using shared libraries" ON)

This provides a switch that users can control, e.g., with :option:`cmake -D`.
If adding such an option to the project, do so in the top level
``CMakeLists.txt`` file, before any :command:`add_library` calls.
Note that if bringing external dependencies directly into the build, such as
with :module:`FetchContent` or a direct call to :command:`add_subdirectory`,
and one of those dependencies has such a call to
:command:`option(BUILD_SHARED_LIBS ...) <option>`, the top level project must
also call :command:`option(BUILD_SHARED_LIBS ...) <option>` before bringing in
its dependencies.  Failure to do so can lead to different behavior between the
first and subsequent CMake runs.