-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathCMDEF_ADD_EXECUTABLE.cmake
162 lines (143 loc) · 3.72 KB
/
CMDEF_ADD_EXECUTABLE.cmake
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
## Main
#
# Add executable
#
INCLUDE_GUARD(GLOBAL)
SET(_CMDEF_ADD_EXECUTABLE_CURRENT_LIST_DIR "${CMAKE_CURRENT_LIST_DIR}")
FIND_PACKAGE(CMLIB COMPONENTS CMUTIL REQUIRED)
INCLUDE(${CMAKE_CURRENT_LIST_DIR}/CMDEF_RESOURCE.cmake)
##
# Add executable.
#
# SOURCES - all c/cpp/h/hpp files will be added as source to given target.
#
# WIN32 - create WIN32 application.
# Ignored if the CMDEF_OS_WINDOWS is false
#
# MACOS_BUNDLE - create macosx bundle.
# Ignored if CMDEF_OS_MACOS is false.
#
# OUTPUT_NAME - output base name. Name of the target
# file after compile and link.
#
# [Custom properties]
# CMDEF_EXECUTABLE - property which mark library as "created by CMDEF_ADD_EXECUTABLE"
#
# <function>(
# TARGET <target>
# SOURCES <sources> M
# VERSION <version>
# [OUTPUT_NAME <output_name>]
# [WIN32 {ON|OFF}]
# [MACOS_BUNDLE {ON|OFF}]
# [INCLUDE_DIRECTORIES <include_directories> M]
# )
#
FUNCTION(CMDEF_ADD_EXECUTABLE)
CMLIB_PARSE_ARGUMENTS(
MULTI_VALUE
INCLUDE_DIRECTORIES
SOURCES
ONE_VALUE
VERSION
TARGET
OUTPUT_NAME
OPTIONS
WIN32 MACOS_BUNDLE
REQUIRED
VERSION
SOURCES
TARGET
P_ARGN ${ARGN}
)
CMDEF_HELPER_IS_TARGET_NAME_VALID(${__TARGET})
CMUTIL_VERSION_CHECK("${__VERSION}")
SET(exec_flag)
IF(CMDEF_OS_WINDOWS AND __WIN32)
SET(exec_flag WIN32)
ELSEIF(CMDEF_OS_MACOS AND __MACOS_BUNDLE)
SET(exec_flag MACOS_BUNDLE)
ENDIF()
SET(output_name ${__TARGET})
IF(DEFINED __OUTPUT_NAME)
SET(output_name "${__OUTPUT_NAME}")
ENDIF()
SET(package_name_suffix)
IF(DEFINED CMAKE_BUILD_TYPE)
IF(CMAKE_BUILD_TYPE STREQUAL "Debug")
SET(package_name_suffix "${CMDEF_EXECUTABLE_NAME_DEBUG_SUFFIX}")
ENDIF()
ELSE()
SET(package_name_suffix "$<$<CONFIG:DEBUG>:${CMDEF_EXECUTABLE_NAME_DEBUG_SUFFIX}>")
ENDIF()
ADD_EXECUTABLE(${__TARGET} ${exec_flag} ${__SOURCES})
SET_TARGET_PROPERTIES(${__TARGET}
PROPERTIES
OUTPUT_NAME "${output_name}${package_name_suffix}"
CMDEF_EXECUTABLE TRUE
)
IF(DEFINED __INCLUDE_DIRECTORIES)
TARGET_INCLUDE_DIRECTORIES(${__TARGET} PRIVATE ${__INCLUDE_DIRECTORIES})
ENDIF()
IF(CMDEF_OS_WINDOWS)
_CMDEF_ADD_EXECUTABLE_WINDOWS_SETTING(${__TARGET} ${__VERSION})
ENDIF()
ENDFUNCTION()
##
# Check if the target is created by CMDEF_ADD_EXECUTABLE
# function.
#
# Set <output_var> to TRUE if created by CMDEF_ADD_EXECUTABLE.
#
# Usage:
# <function>(target output_var_name)
# IF(DEFINED output_var_name)
# MESSAGE(STATUS "Target name: ${output_var_name}")
# ELSE()
# MESSAGE(STATUS "Not a CMDEF target")
# ENDIF()
#
# <function>(
# <target>
# <output_var> # UNSET if not created by CMDEF_ADD_EXECUTABLE, else set to target name
# )
#
FUNCTION(CMDEF_ADD_EXECUTABLE_CHECK target output_var)
GET_PROPERTY(is_cmdef TARGET ${target} PROPERTY CMDEF_EXECUTABLE)
IF(is_cmdef)
SET(${output_var} "${target}" PARENT_SCOPE)
RETURN()
ENDIF()
UNSET(${output_var} PARENT_SCOPE)
ENDFUNCTION()
## Helper
#
# Setting specific only for Windows
#
# <function> (
# <target_lib>
# <version>
# )
#
FUNCTION(_CMDEF_ADD_EXECUTABLE_WINDOWS_SETTING target_lib version)
SET(msvc_runtime_type)
IF(NOT CMDEF_WINDOWS_STATIC_RUNTIME)
SET(msvc_runtime_type DLL)
ENDIF()
SET_PROPERTY(TARGET ${target_lib}
PROPERTY
MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:DEBUG>:Debug>${msvc_runtime_type}"
)
CMUTIL_VERSION_SPLIT(version ${version})
CMDEF_RESOURCE_WINDOWS(
RESOURCE_TARGET ${target_lib}
RESOURCE_FILE "${_CMDEF_ADD_EXECUTABLE_CURRENT_LIST_DIR}/resources/windows_version.rc"
DEFINITIONS
VERSION_MAJOR ${version_MAJOR}
VERSION_MINOR ${version_MINOR}
VERSION_PATCH ${version_PATCH}
PRODUCT_BUNDLE "$<TARGET_NAME:${target_lib}>"
PRODUCT_COMPANY_COPYRIGHT "${CMDEF_ENV_DESCRIPTION_COPYRIGHT}"
PRODUCT_COMPANY_NAME "${CMDEF_ENV_DESCRIPTION_COMPANY_NAME}"
)
ENDFUNCTION()