forked from teawater/libhermit
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathHermitCore-Utils.cmake
More file actions
144 lines (113 loc) · 3.75 KB
/
HermitCore-Utils.cmake
File metadata and controls
144 lines (113 loc) · 3.75 KB
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
macro(include_guard)
if(DEFINED "_INCLUDE_GUARD_${CMAKE_CURRENT_LIST_FILE}")
return()
endif()
set("_INCLUDE_GUARD_${CMAKE_CURRENT_LIST_FILE}" INCLUDED)
endmacro(include_guard)
macro(add_kernel_module_sources MODULE SOURCE_GLOB)
file(GLOB SOURCES "${SOURCE_GLOB}")
if("${SOURCES}" STREQUAL "")
message(FATAL_ERROR "Module '${MODULE}' has no sources")
endif()
# make sure modules are unique, this is needed of multiple sources
# are added to the same module
list(APPEND _KERNEL_MODULES "${MODULE}")
list(REMOVE_DUPLICATES _KERNEL_MODULES)
# append sources for module
list(APPEND "_KERNEL_SOURCES_${MODULE}" "${SOURCES}")
endmacro(add_kernel_module_sources)
macro(get_kernel_module_sources VAR MODULE)
set(${VAR} ${_KERNEL_SOURCES_${MODULE}})
endmacro(get_kernel_module_sources)
macro(get_kernel_modules VAR)
set(${VAR} ${_KERNEL_MODULES})
endmacro(get_kernel_modules)
# find program in /toolchain/dir/prefix-NAME, only supply NAME
function(find_toolchain_program NAME)
string(TOUPPER "${NAME}" NAME_UPPER)
string(TOLOWER "${NAME}" NAME_LOWER)
set(VARNAME "CMAKE_${NAME_UPPER}")
find_program(${VARNAME}
NAMES ${_CMAKE_TOOLCHAIN_PREFIX}${NAME_LOWER}
HINTS ${TOOLCHAIN_BIN_DIR})
if(NOT ${VARNAME})
message(FATAL_ERROR
"Cannot find ${_CMAKE_TOOLCHAIN_PREFIX}${NAME_LOWER}")
endif()
endfunction(find_toolchain_program)
macro(set_parent VAR VALUE)
set(${VAR} ${VALUE} PARENT_SCOPE)
set(${VAR} ${VALUE})
endmacro(set_parent)
function(get_cmd_variables VAR)
set(_OUTPUT "")
get_cmake_property(vs VARIABLES)
foreach(v ${vs})
get_property(_HELPSTRING
CACHE ${v}
PROPERTY HELPSTRING)
if("${_HELPSTRING}" STREQUAL "No help, variable specified on the command line.")
list(APPEND _OUTPUT "${v}")
endif()
endforeach()
set(${VAR} ${_OUTPUT} PARENT_SCOPE)
endfunction(get_cmd_variables)
# any additional parameters will be handed over to the cmake command that the
# external project is invoked with
function(build_external NAME PATH DEPENDS)
if("${NAME}" IN_LIST PROFILE_APPS)
set(DO_PROFILING "-DPROFILING=true")
endif()
# pass through all command line variables
get_cmd_variables(CMD_VAR_NAMES)
foreach(var ${CMD_VAR_NAMES})
set(CMD_VARS ${CMD_VARS} -D${var}=${${var}})
endforeach()
ExternalProject_Add(${NAME}
SOURCE_DIR ${PATH}
BUILD_ALWAYS 1
DEPENDS ${DEPENDS}
INSTALL_COMMAND
${CMAKE_COMMAND} --build <BINARY_DIR>
--target install --
DESTDIR=${LOCAL_PREFIX_BASE_DIR}
CMAKE_ARGS
-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}
-DLOCAL_PREFIX_BASE_DIR=${LOCAL_PREFIX_BASE_DIR}
-DCMAKE_INSTALL_MESSAGE=NEVER
-DCMAKE_EXPORT_COMPILE_COMMANDS=true
-DMAX_ARGC_ENVC=${MAX_ARGC_ENVC}
--no-warn-unused-cli
${DO_PROFILING}
${CMD_VARS}
${ARGN})
ExternalProject_Add_Step(${NAME} relink
COMMAND find . -maxdepth 1 -type f -executable -exec rm {} "\\\;"
DEPENDEES configure
DEPENDERS build
WORKING_DIRECTORY <BINARY_DIR>)
ExternalProject_Add_StepDependencies(${NAME} relink ${DEPENDS})
endfunction(build_external)
# additional arguments are be treated as targets that will be excluded
function(install_local_targets PATH)
get_property(_TARGETS
DIRECTORY .
PROPERTY BUILDSYSTEM_TARGETS)
if(NOT "${ARGN}" STREQUAL "")
list(REMOVE_ITEM _TARGETS ${ARGN})
endif()
install(TARGETS ${_TARGETS}
DESTINATION ${TARGET_ARCH}/${PATH})
# if there are any .map files for profiling, install them too
foreach(TARGET ${_TARGETS})
install(FILES $<TARGET_FILE:${TARGET}>.map
DESTINATION ${TARGET_ARCH}/${PATH}
OPTIONAL)
endforeach()
endfunction(install_local_targets)
# set variable if not yet set
macro(set_default VARNAME)
if(NOT ${VARNAME})
set(${VARNAME} ${ARGN})
endif()
endmacro(set_default)