# This CMakeLists.txt doesn't do anything useful,
# but it shoudl demonstrate the cmake syntax highlighting
#
# Alex Turbov <i.zaufi@gmail.com>
#

#[[.rst:
Demo
----

This is an **RST** documentation.

::

    # Sample code block
    blah-blah

But we are about to test CMake here ;-)

#]]

cmake_policy(VERSION 3.11)

project(
    Demo VERSION 1.0
    DESCRIPTION "For unit testing purposes"
    # NOTE that particular languages is a separate style
    # to highlight "special" (well known values)
    LANGUAGES C CXX
  )

set(SOME_TRUE_OPTION TRUE)      # `true` value
# `false` value and "internal" variable
set(_ANOTHER_FALSE_OPTION OFF CACHE INTERNAL "Internal option")

#BEGIN Message block
message(FATAL_ERROR "Ordinal message do ${VARIABLE_EXPANSION}")
message(AUTHOR_WARNING "... standard variables have a dedicated style")
message(SEND_ERROR "e.g. ${PROJECT_DESCRIPTION} or ${CMAKE_COMMAND}")
message(
    STATUS [=[
        Raw messages do not do ${VARIABLES_EXPANSION} or \n
        escape symbols highlighting...
    ]=]
)
#END Message block

# ATTENTION Every command highlight only its own named keywords...
# Also, note aliased (most of the time imported) targets higlighted as well
add_library(Foo::foo IMPORTED GLOBAL)
set(KW_HL IMPORTED GLOBAL)      # `IMPORTED` and `GLOBAL` are not highlighted here!

# Properties are separate ("special value") style
set_target_properties(Foo::foo PROPERTIES LOCATION "${FOO_LIBRARY}")

# Generator expressions
target_compile_definitions(
    # NOTE Ok w/ CMake >= 3.11
    Foo::foo
    $<$<PLATFORM_ID:Windows>:WINDOWS_FOO>
    $<$<PLATFORM_ID:Linux>:
        LINUX_FOO
        $<$<BOOL:${_has_foo}>:SOME_FOO_PATH=${PROJECT_BINARY_DIR}/foo>
    >
  )

#[=======================================================================[.rst:
.. cmake:command:: my_fun

*RST* documentation ``can`` refer to :cmake:command:`any_commands` or
:cmake:variable:`variables`...

.. code-block:: cmake
   :caption: **Synopsys**

    my_fun([ANYTHING...])

#]=======================================================================]
function(my_fun)
    # TODO Add implementation
endfunction()

my_fun(
    # Custom functions do not highlight "standard" named args ...
    PUBLIC LOCATION PARENT_SCOPE
    # only some well-known values ...
    smth-NOTFOUND ON
    # and standard variables
    PROJECT_VERSION
    # or substitutions
    $ENV{HOME} OR ${_internal_var_is_grey}
  )

# I dont'recall exactly, but there was some bug with `if`...
if((A AND "${B}") OR C OR (var MATCHES "regex"))
    # Anyway... it is Ok nowadays ;-)

elseif(POLICY CMP066)
    add_executable(${PROJECT_NAME} ${PROJECT_NAME}.cc)
    target_link_libraries(
        ${PROJECT_NAME}
        PRIVATE
            Qt5::Core
            $<$<BOOL:${HAS_FOO}>:Foo::foo>
      )

endif()

# In each function call below, all 3 named parameter lines should apply the same highlighting.
add_custom_command(
    COMMAND true
    COMMAND (true)
    COMMAND true
)
add_custom_target(TargetName
    WORKING_DIRECTORY somedir
    COMMAND (true)
    BYPRODUCTS somefile
)
execute_process(
    COMMAND true
    COMMAND (true)
    COMMAND true
)
add_test(
    NAME sometest
    COMMAND (true)
    WORKING_DIRECTORY somedir
)

# nested parentheses
if( true AND ( false OR ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") ) )
endif()