From f1dfa65edfbc49ca8d8f4c6775ab43685fea456b Mon Sep 17 00:00:00 2001 From: Azat Khuzhin Date: Thu, 2 Jun 2022 16:44:10 +0300 Subject: [PATCH 1/5] Do not use FORCE for set() in PreLoad.cmake By using FORCE user will not be able to overwrite them. It is true for CMAKE_GENERATOR, but FORCE for CMAKE_TOOLCHAIN_FILE is no-op, since there is a check for CMAKE_TOOLCHAIN_FILE is not set before. Signed-off-by: Azat Khuzhin --- PreLoad.cmake | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/PreLoad.cmake b/PreLoad.cmake index 793207e1e31..fef3ba3a7d3 100644 --- a/PreLoad.cmake +++ b/PreLoad.cmake @@ -15,7 +15,7 @@ if (NOT DEFINED ENV{CLION_IDE} AND NOT DEFINED ENV{XCODE_IDE}) find_program(NINJA_PATH ninja) if (NINJA_PATH) - set(CMAKE_GENERATOR "Ninja" CACHE INTERNAL "" FORCE) + set(CMAKE_GENERATOR "Ninja" CACHE INTERNAL "") endif () endif() @@ -57,12 +57,12 @@ if (OS MATCHES "Linux" AND ($ENV{CC} MATCHES ".*clang.*" OR CMAKE_C_COMPILER MATCHES ".*clang.*")) if (ARCH MATCHES "amd64|x86_64") - set (CMAKE_TOOLCHAIN_FILE "cmake/linux/toolchain-x86_64.cmake" CACHE INTERNAL "" FORCE) + set (CMAKE_TOOLCHAIN_FILE "cmake/linux/toolchain-x86_64.cmake" CACHE INTERNAL "") elseif (ARCH MATCHES "^(aarch64.*|AARCH64.*|arm64.*|ARM64.*)") - set (CMAKE_TOOLCHAIN_FILE "cmake/linux/toolchain-aarch64.cmake" CACHE INTERNAL "" FORCE) + set (CMAKE_TOOLCHAIN_FILE "cmake/linux/toolchain-aarch64.cmake" CACHE INTERNAL "") elseif (ARCH MATCHES "^(ppc64le.*|PPC64LE.*)") - set (CMAKE_TOOLCHAIN_FILE "cmake/linux/toolchain-ppc64le.cmake" CACHE INTERNAL "" FORCE) - else () + set (CMAKE_TOOLCHAIN_FILE "cmake/linux/toolchain-ppc64le.cmake" CACHE INTERNAL "") +else () message (FATAL_ERROR "Unsupported architecture: ${ARCH}") endif () From 6adf10b45813fc0ffb42a7d7332138afe42e17fc Mon Sep 17 00:00:00 2001 From: Azat Khuzhin Date: Thu, 2 Jun 2022 16:40:56 +0300 Subject: [PATCH 2/5] Use clang compiler by default (via cmake preload) Signed-off-by: Azat Khuzhin --- PreLoad.cmake | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/PreLoad.cmake b/PreLoad.cmake index fef3ba3a7d3..9b4c0f00ebd 100644 --- a/PreLoad.cmake +++ b/PreLoad.cmake @@ -51,6 +51,20 @@ endif() execute_process(COMMAND uname -s OUTPUT_VARIABLE OS) execute_process(COMMAND uname -m OUTPUT_VARIABLE ARCH) +# By default, prefer clang on Linux +# But note, that you still may change the compiler with -DCMAKE_C_COMPILER/-DCMAKE_CXX_COMPILER. +if (OS MATCHES "Linux") + find_program(CLANG_PATH clang) + if (CLANG_PATH) + set(CMAKE_C_COMPILER "clang" CACHE INTERNAL "") + endif() + + find_program(CLANG_CXX_PATH clang++) + if (CLANG_CXX_PATH) + set(CMAKE_CXX_COMPILER "clang++" CACHE INTERNAL "") + endif() +endif() + if (OS MATCHES "Linux" AND NOT DEFINED CMAKE_TOOLCHAIN_FILE AND NOT DISABLE_HERMETIC_BUILD From 4bb3ad1b19adfc5d579141986be141981d9c8875 Mon Sep 17 00:00:00 2001 From: Azat Khuzhin Date: Fri, 3 Jun 2022 17:22:36 +0300 Subject: [PATCH 3/5] Print *_FLAGS_INIT in case of error in cmake preload Otherwise question may pops up, "what is wrong in my env?" Signed-off-by: Azat Khuzhin --- PreLoad.cmake | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/PreLoad.cmake b/PreLoad.cmake index 9b4c0f00ebd..a12f91eba5c 100644 --- a/PreLoad.cmake +++ b/PreLoad.cmake @@ -26,14 +26,22 @@ if (NOT $ENV{CFLAGS} STREQUAL "" OR CMAKE_C_FLAGS OR CMAKE_CXX_FLAGS OR CMAKE_EXE_LINKER_FLAGS OR CMAKE_SHARED_LINKER_FLAGS OR CMAKE_MODULE_LINKER_FLAGS OR CMAKE_C_FLAGS_INIT OR CMAKE_CXX_FLAGS_INIT OR CMAKE_EXE_LINKER_FLAGS_INIT OR CMAKE_SHARED_LINKER_FLAGS_INIT OR CMAKE_MODULE_LINKER_FLAGS_INIT) + # if $ENV message("CFLAGS: $ENV{CFLAGS}") message("CXXFLAGS: $ENV{CXXFLAGS}") message("LDFLAGS: $ENV{LDFLAGS}") + # if *_FLAGS message("CMAKE_C_FLAGS: ${CMAKE_C_FLAGS}") message("CMAKE_CXX_FLAGS: ${CMAKE_CXX_FLAGS}") message("CMAKE_EXE_LINKER_FLAGS: ${CMAKE_EXE_LINKER_FLAGS}") message("CMAKE_SHARED_LINKER_FLAGS: ${CMAKE_SHARED_LINKER_FLAGS}") message("CMAKE_MODULE_LINKER_FLAGS: ${CMAKE_MODULE_LINKER_FLAGS}") + # if *_FLAGS_INIT + message("CMAKE_C_FLAGS_INIT: ${CMAKE_C_FLAGS_INIT}") + message("CMAKE_CXX_FLAGS_INIT: ${CMAKE_CXX_FLAGS_INIT}") + message("CMAKE_EXE_LINKER_FLAGS_INIT: ${CMAKE_EXE_LINKER_FLAGS_INIT}") + message("CMAKE_SHARED_LINKER_FLAGS_INIT: ${CMAKE_SHARED_LINKER_FLAGS_INIT}") + message("CMAKE_MODULE_LINKER_FLAGS_INIT: ${CMAKE_MODULE_LINKER_FLAGS_INIT}") message(FATAL_ERROR " Some of the variables like CFLAGS, CXXFLAGS, LDFLAGS are not empty. From 6647333f5fb6af4ef92d9ba0bf9ffdb9ba5bbc17 Mon Sep 17 00:00:00 2001 From: Azat Khuzhin Date: Fri, 3 Jun 2022 17:26:13 +0300 Subject: [PATCH 4/5] Do not set clang as default if CC/CXX env is set Since some build systems may change the compiler via those env variables. Signed-off-by: Azat Khuzhin --- PreLoad.cmake | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/PreLoad.cmake b/PreLoad.cmake index a12f91eba5c..5076fcb1302 100644 --- a/PreLoad.cmake +++ b/PreLoad.cmake @@ -61,7 +61,10 @@ execute_process(COMMAND uname -m OUTPUT_VARIABLE ARCH) # By default, prefer clang on Linux # But note, that you still may change the compiler with -DCMAKE_C_COMPILER/-DCMAKE_CXX_COMPILER. -if (OS MATCHES "Linux") +if (OS MATCHES "Linux" + # some build systems may use CC/CXX env variables + AND "$ENV{CC}" STREQUAL "" + AND "$ENV{CXX}" STREQUAL "") find_program(CLANG_PATH clang) if (CLANG_PATH) set(CMAKE_C_COMPILER "clang" CACHE INTERNAL "") From 7220fd296f46905c84230202fb8d0ae72f7fdab3 Mon Sep 17 00:00:00 2001 From: Azat Khuzhin Date: Fri, 3 Jun 2022 17:30:43 +0300 Subject: [PATCH 5/5] Surround ENV{} in quotes in PreLoad.cmake Signed-off-by: Azat Khuzhin --- PreLoad.cmake | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/PreLoad.cmake b/PreLoad.cmake index 5076fcb1302..8ef93a7aa51 100644 --- a/PreLoad.cmake +++ b/PreLoad.cmake @@ -20,9 +20,9 @@ if (NOT DEFINED ENV{CLION_IDE} AND NOT DEFINED ENV{XCODE_IDE}) endif() # Check if environment is polluted. -if (NOT $ENV{CFLAGS} STREQUAL "" - OR NOT $ENV{CXXFLAGS} STREQUAL "" - OR NOT $ENV{LDFLAGS} STREQUAL "" +if (NOT "$ENV{CFLAGS}" STREQUAL "" + OR NOT "$ENV{CXXFLAGS}" STREQUAL "" + OR NOT "$ENV{LDFLAGS}" STREQUAL "" OR CMAKE_C_FLAGS OR CMAKE_CXX_FLAGS OR CMAKE_EXE_LINKER_FLAGS OR CMAKE_SHARED_LINKER_FLAGS OR CMAKE_MODULE_LINKER_FLAGS OR CMAKE_C_FLAGS_INIT OR CMAKE_CXX_FLAGS_INIT OR CMAKE_EXE_LINKER_FLAGS_INIT OR CMAKE_SHARED_LINKER_FLAGS_INIT OR CMAKE_MODULE_LINKER_FLAGS_INIT) @@ -79,7 +79,7 @@ endif() if (OS MATCHES "Linux" AND NOT DEFINED CMAKE_TOOLCHAIN_FILE AND NOT DISABLE_HERMETIC_BUILD - AND ($ENV{CC} MATCHES ".*clang.*" OR CMAKE_C_COMPILER MATCHES ".*clang.*")) + AND ("$ENV{CC}" MATCHES ".*clang.*" OR CMAKE_C_COMPILER MATCHES ".*clang.*")) if (ARCH MATCHES "amd64|x86_64") set (CMAKE_TOOLCHAIN_FILE "cmake/linux/toolchain-x86_64.cmake" CACHE INTERNAL "")