Skip to content

Commit 6e0508c

Browse files
committed
[CMake] Find suitable Clang binaries
We don't need the header files, so don't depend on them. Additionally, allow earlier Clang versions, but warn on version mismatch. Also, let users override Clang path via -DCLANG=/path/to/clang
1 parent c72d928 commit 6e0508c

File tree

2 files changed

+32
-7
lines changed

2 files changed

+32
-7
lines changed

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
#
33
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
44

5-
cmake_minimum_required(VERSION 3.23)
5+
cmake_minimum_required(VERSION 3.25)
66

77
project(tpde2)
88

tpde-llvm/CMakeLists.txt

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -65,15 +65,40 @@ if (DEFINED LLVM_DIR)
6565
set(CLANG_HINTS "${LLVM_DIR}/../clang")
6666
endif ()
6767

68-
find_package(Clang ${LLVM_VERSION} REQUIRED CONFIG HINTS ${CLANG_HINTS})
69-
70-
get_property(clang_path TARGET clang PROPERTY LOCATION)
71-
message("Using clang " ${Clang_VERSION} " at: " ${clang_path})
68+
function(check_clang_version validator_result_var CANDIDATE)
69+
execute_process(COMMAND ${CANDIDATE} --version
70+
RESULT_VARIABLE CANDIDATE_VERSION_RC
71+
OUTPUT_VARIABLE CANDIDATE_VERSION_OUT)
72+
if (CANDIDATE_VERSION_RC EQUAL 0)
73+
string(REGEX MATCH "clang version [0-9]+.[0-9]+" CANDIDATE_VERSION_STR ${CANDIDATE_VERSION_OUT})
74+
endif ()
75+
if (NOT CANDIDATE_VERSION_STR)
76+
message(VERBOSE "Unable to determine version for Clang at ${CANDIDATE}")
77+
set(${validator_result_var} FALSE PARENT_SCOPE)
78+
else ()
79+
string(SUBSTRING ${CANDIDATE_VERSION_STR} 14 -1 CANDIDATE_VERSION)
80+
message(VERBOSE "Found Clang ${CANDIDATE_VERSION} at ${CANDIDATE}")
81+
if (${CANDIDATE_VERSION} VERSION_GREATER "${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}")
82+
message(VERBOSE "Cannot use Clang newer than used LLVM version")
83+
set(${validator_result_var} FALSE PARENT_SCOPE)
84+
elseif (NOT ${CANDIDATE_VERSION} VERSION_EQUAL "${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}")
85+
# TODO: run optimization in tpde-encodegen to avoid this.
86+
message(WARNING "Different Clang (${CANDIDATE_VERSION}) and LLVM "
87+
"(${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}) versions "
88+
"might cause broken tests.")
89+
endif ()
90+
endif ()
91+
endfunction()
92+
find_program(CLANG NO_CACHE REQUIRED
93+
NAMES clang-${LLVM_VERSION_MAJOR} clang-20 clang-19 clang-18 clang
94+
HINTS ${LLVM_TOOLS_BINARY_DIR}
95+
VALIDATOR check_clang_version)
96+
message(STATUS "Found Clang: " ${CLANG})
7297

7398
if (TPDE_X64)
7499
add_custom_command(
75100
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/encode_template_x64.bc
76-
COMMAND ${clang_path} -c -emit-llvm -ffreestanding -fcf-protection=none
101+
COMMAND ${CLANG} -c -emit-llvm -ffreestanding -fcf-protection=none
77102
-O3 -fomit-frame-pointer -fno-math-errno
78103
--target=x86_64-linux -march=x86-64-v4
79104
-o ${CMAKE_CURRENT_BINARY_DIR}/encode_template_x64.bc
@@ -111,7 +136,7 @@ endif ()
111136
if (TPDE_A64)
112137
add_custom_command(
113138
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/encode_template_arm64.bc
114-
COMMAND ${clang_path} -c -emit-llvm -ffreestanding -fcf-protection=none
139+
COMMAND ${CLANG} -c -emit-llvm -ffreestanding -fcf-protection=none
115140
-O3 -fomit-frame-pointer -fno-math-errno
116141
--target=aarch64 -march=armv8.1-a
117142
-o ${CMAKE_CURRENT_BINARY_DIR}/encode_template_arm64.bc

0 commit comments

Comments
 (0)