blob: 08d743e88a44fb4db99ca42eb819c8ab08e1fdff (
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
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
|
#-------------------------------------------------------------------------------
# Copyright (c) 2017, Arm Limited. All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause
#
#-------------------------------------------------------------------------------
#Find the location of the ARMClang C/C++ compiler.
#
# Find armclang on the specified location or on the PATH and optionally validate its version.
#
#Inputs:
# ARMCLANG_PATH - (optional)- install path of armclang compiler to use. If not set the
# compiler on the PATH is used.
# ARMCLANG_VER - (optional)- version number. If set the module will validate the compiler version.
#
#outputs:
# ARMCLANG_PATH - will be set to the root directory of the compiler. Only set if undefined.
# ARMCLANG_VER - will be set to the version number found. Only set if undefined.
# ARMCLANG_MODULE - set to the name of the cmake module to be included for this ARMClang version.
#
#Include some dependencies
Include(Common/Utils)
#Get the version of armasm.
#
# Execute armasm and extract its version number for its output.
#
#Exmaples:
# Get the version reported by armasm at location c:/foo/bin/armasm to variable VER
# get_armasm_version(ARMASM "c:/foo/bin/armasm" RES VER)
#
#INPUTS:
# ARMASM - (mandatory) - armasm executable
# RES - (mandatory) - variable name to put result to
#
#OUTPUTS
# The variable named after "RES" will be set to the version number matches
#
function(get_armasm_version)
#Parse our arguments
set( _OPTIONS_ARGS ) #No option (on/off) arguments (e.g. IGNORE_CASE)
set( _ONE_VALUE_ARGS ARMASM RES) #Single option arguments (e.g. PATH "./foo/bar")
set( _MULTI_VALUE_ARGS ) #One list argument (e.g. LANGUAGES C ASM CXX)
cmake_parse_arguments(_MY_PARAMS "${_OPTIONS_ARGS}" "${_ONE_VALUE_ARGS}" "${_MULTI_VALUE_ARGS}" ${ARGN} )
#Check mandatory parameters
if(NOT _MY_PARAMS_RES)
message (FATAL_ERROR "get_armasm_version(): Missing result parameter!")
endif()
set (_RES ${_MY_PARAMS_RES})
if(NOT _MY_PARAMS_ARMASM)
message (FATAL_ERROR "get_armasm_version(): Missing ARMASM parameter!")
endif()
set (_ARMASM ${_MY_PARAMS_ARMASM})
#Call specified executable
execute_process(COMMAND "${_ARMASM}"
OUTPUT_VARIABLE _OUTPUT
ERROR_VARIABLE _OUTPUT
)
#Cut off version number. Just the numbers ignore anything after.
STRING(REGEX REPLACE ".*ARM Compiler (([0-9]+\.)+[0-9]+).*" "\\1" _VER "${_OUTPUT}")
if (NOT _VER)
message (FATAL_ERROR "get_armasm_version(): Failed to extract version number from armasm output.")
endif()
set(${_RES} ${_VER} PARENT_SCOPE)
endfunction()
#If the install location needs to be found.
if(NOT DEFINED ARMCLANG_PATH)
#Set ARMCLANG_PATH to default value.
set (ARMCLANG_PATH "ARMCLANG_PATH-NOTFOUND")
#First check if armclang is on the PATH
#find_program puts() its output to the cmake cache. We don't want that, so we use a local variable, which
#is unset later.
find_program (
_ARMCLANG_PATH
armclang
PATHS env PATH
DOC "ARMCLANG compiler location."
)
#Yes, check the version number if it is specified.
if(_ARMCLANG_PATH STREQUAL "_ARMCLANG_PATH-NOTFOUND")
message (FATAL_ERROR "armclang install location is unset. Either put armclang on the PATH or set ARMCLANG_PATH.")
endif()
#Cut off executable name directory name to get install location.
STRING(REGEX REPLACE "(.*)/bin/armclang.*" "\\1" ARMCLANG_PATH "${_ARMCLANG_PATH}")
#Remove unwanted junk from CMake cache.
unset(_ARMCLANG_PATH CACHE)
endif()
get_armasm_version(ARMASM "${ARMCLANG_PATH}/bin/armasm" RES _VER)
#Check the version if needed
if(NOT DEFINED ARMCLANG_VER)
set(ARMCLANG_VER ${_VER})
endif()
if(NOT "${ARMCLANG_VER}" VERSION_EQUAL "${_VER}")
message (FATAL_ERROR "FindArmClang.cmake: armclang compiler version ${_VER} does not match ${ARMCLANG_VER}.")
endif()
STRING(REGEX REPLACE "([0-9]+)\.([0-9]+)(\.[0-9]+)*.*" "CompilerArmClang\\1\\2" ARMCLANG_MODULE "${ARMCLANG_VER}")
if(NOT EXISTS "${CMAKE_CURRENT_LIST_DIR}/${ARMCLANG_MODULE}.cmake")
message(FATAL_ERROR "ERROR: Unsupported ARMCLANG compiler version found on PATH.")
endif()
|