Add compile options to a target.

target_compile_options(<target> [BEFORE]
  [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])

Adds options to the COMPILE_OPTIONS or INTERFACE_COMPILE_OPTIONS target properties. These options are used when compiling the given <target>, which must have been created by a command such as add_executable() or add_library() and must not be an ALIAS target.


These options are not used when linking the target. See the target_link_options() command for that.


If BEFORE is specified, the content will be prepended to the property instead of being appended. See policy CMP0101 which affects whether BEFORE will be ignored in certain cases.

The INTERFACE, PUBLIC and PRIVATE keywords are required to specify the scope of the following arguments. PRIVATE and PUBLIC items will populate the COMPILE_OPTIONS property of <target>. PUBLIC and INTERFACE items will populate the INTERFACE_COMPILE_OPTIONS property of <target>. The following arguments specify compile options. Repeated calls for the same <target> append items in the order called.

New in version 3.11: Allow setting INTERFACE items on IMPORTED targets.

Arguments to target_compile_options may use generator expressions with the syntax $<...>. See the cmake-generator-expressions(7) manual for available expressions. See the cmake-buildsystem(7) manual for more on defining buildsystem properties.

Option De-duplication

The final set of options used for a target is constructed by accumulating options from the current target and the usage requirements of its dependencies. The set of options is de-duplicated to avoid repetition.

New in version 3.12: While beneficial for individual options, the de-duplication step can break up option groups. For example, -option A -option B becomes -option A B. One may specify a group of options using shell-like quoting along with a SHELL: prefix. The SHELL: prefix is dropped, and the rest of the option string is parsed using the separate_arguments() UNIX_COMMAND mode. For example, "SHELL:-option A" "SHELL:-option B" becomes -option A -option B.

See Also