From e3ae2a52d2232e3b41caa9cf1197c24130249ddd Mon Sep 17 00:00:00 2001 From: Eric Kilmer Date: Wed, 18 Oct 2023 12:03:04 -0400 Subject: [PATCH] [llvm][CMake] Check dependency cxx source compiles (#68549) If a CMake project doesn't enable the C language, then the CMake FFI and Terminfo find modules will fail their checks for compilation and linking. This commit allows projects to enable only C++ by first checking if a C compiler is set before testing C source compilation; if not, it checks whether C++ compilation succeeds. Fixes #53950 --- llvm/cmake/modules/FindFFI.cmake | 20 ++++++++++++++++---- llvm/cmake/modules/FindTerminfo.cmake | 20 ++++++++++++++++---- 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/llvm/cmake/modules/FindFFI.cmake b/llvm/cmake/modules/FindFFI.cmake index a493a89d630171f..c9ba104601872eb 100644 --- a/llvm/cmake/modules/FindFFI.cmake +++ b/llvm/cmake/modules/FindFFI.cmake @@ -38,15 +38,27 @@ find_library(FFI_LIBRARIES ffi PATHS ${FFI_LIBRARY_DIR}) if(FFI_LIBRARIES) include(CMakePushCheckState) - include(CheckCSourceCompiles) cmake_push_check_state() list(APPEND CMAKE_REQUIRED_LIBRARIES ${FFI_LIBRARIES}) - check_c_source_compiles(" + set(HAVE_FFI_CALL_SRC [=[ + #ifdef __cplusplus + extern "C" { + #endif struct ffi_cif; typedef struct ffi_cif ffi_cif; void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue); - int main(void) { ffi_call(0, 0, 0, 0); }" - HAVE_FFI_CALL) + #ifdef __cplusplus + } + #endif + int main(void) { ffi_call(0, 0, 0, 0); } + ]=]) + if(DEFINED CMAKE_C_COMPILER) + include(CheckCSourceCompiles) + check_c_source_compiles("${HAVE_FFI_CALL_SRC}" HAVE_FFI_CALL) + else() + include(CheckCXXSourceCompiles) + check_cxx_source_compiles("${HAVE_FFI_CALL_SRC}" HAVE_FFI_CALL) + endif() cmake_pop_check_state() endif() diff --git a/llvm/cmake/modules/FindTerminfo.cmake b/llvm/cmake/modules/FindTerminfo.cmake index eef1f95853eb27c..163af6697067710 100644 --- a/llvm/cmake/modules/FindTerminfo.cmake +++ b/llvm/cmake/modules/FindTerminfo.cmake @@ -15,13 +15,25 @@ find_library(Terminfo_LIBRARIES NAMES terminfo tinfo curses ncurses ncursesw) if(Terminfo_LIBRARIES) include(CMakePushCheckState) - include(CheckCSourceCompiles) cmake_push_check_state() list(APPEND CMAKE_REQUIRED_LIBRARIES ${Terminfo_LIBRARIES}) - check_c_source_compiles(" + set(Terminfo_LINKABLE_SRC [=[ + #ifdef __cplusplus + extern "C" { + #endif int setupterm(char *term, int filedes, int *errret); - int main(void) { return setupterm(0, 0, 0); }" - Terminfo_LINKABLE) + #ifdef __cplusplus + } + #endif + int main(void) { return setupterm(0, 0, 0); } + ]=]) + if(DEFINED CMAKE_C_COMPILER) + include(CheckCSourceCompiles) + check_c_source_compiles("${Terminfo_LINKABLE_SRC}" Terminfo_LINKABLE) + else() + include(CheckCXXSourceCompiles) + check_cxx_source_compiles("${Terminfo_LINKABLE_SRC}" Terminfo_LINKABLE) + endif() cmake_pop_check_state() endif()