Make deps: Fix compilation error on CentOS
There were two issues. First is related on ISPC's CMake configuration forcing C and C++ compilers to be clang and clang++. This goes against of desired behavior when we use our own compiled clang compilers. The second issue was related on linker failure: CLang libraries are linked statically, and they need some of C++ 11 STL symbols which are coming from libstdc++. Differential Revision: https://developer.blender.org/D8258
This commit is contained in:
parent
2be0ae7c99
commit
78d48343ae
|
@ -28,6 +28,11 @@ elseif(APPLE)
|
||||||
set(ISPC_EXTRA_ARGS_APPLE
|
set(ISPC_EXTRA_ARGS_APPLE
|
||||||
-DBISON_EXECUTABLE=/usr/local/opt/bison/bin/bison
|
-DBISON_EXECUTABLE=/usr/local/opt/bison/bin/bison
|
||||||
)
|
)
|
||||||
|
elseif(UNIX)
|
||||||
|
set(ISPC_EXTRA_ARGS_UNIX
|
||||||
|
-DCMAKE_C_COMPILER=${LIBDIR}/clang/bin/clang
|
||||||
|
-DCMAKE_CXX_COMPILER=${LIBDIR}/clang/bin/clang++
|
||||||
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(ISPC_EXTRA_ARGS
|
set(ISPC_EXTRA_ARGS
|
||||||
|
@ -43,6 +48,7 @@ set(ISPC_EXTRA_ARGS
|
||||||
-DCLANG_INCLUDE_DIRS=${LIBDIR}/clang/include
|
-DCLANG_INCLUDE_DIRS=${LIBDIR}/clang/include
|
||||||
${ISPC_EXTRA_ARGS_WIN}
|
${ISPC_EXTRA_ARGS_WIN}
|
||||||
${ISPC_EXTRA_ARGS_APPLE}
|
${ISPC_EXTRA_ARGS_APPLE}
|
||||||
|
${ISPC_EXTRA_ARGS_UNIX}
|
||||||
)
|
)
|
||||||
|
|
||||||
ExternalProject_Add(external_ispc
|
ExternalProject_Add(external_ispc
|
||||||
|
|
|
@ -34,3 +34,52 @@ diff -Naur orig/cmake/GenerateBuiltins.cmake.txt external_ispc/cmake/GenerateBui
|
||||||
elseif ("${bit}" STREQUAL "64" AND ${arch} STREQUAL "x86")
|
elseif ("${bit}" STREQUAL "64" AND ${arch} STREQUAL "x86")
|
||||||
set(target_arch "x86_64")
|
set(target_arch "x86_64")
|
||||||
elseif ("${bit}" STREQUAL "32" AND ${arch} STREQUAL "arm")
|
elseif ("${bit}" STREQUAL "32" AND ${arch} STREQUAL "arm")
|
||||||
|
diff --git a/CMakeLists.txt b/CMakeLists.txt
|
||||||
|
index 46a8db8..f53beef 100644
|
||||||
|
--- a/CMakeLists.txt
|
||||||
|
+++ b/CMakeLists.txt
|
||||||
|
@@ -36,8 +36,12 @@
|
||||||
|
cmake_minimum_required(VERSION 3.13)
|
||||||
|
|
||||||
|
if (UNIX)
|
||||||
|
- set(CMAKE_C_COMPILER "clang")
|
||||||
|
- set(CMAKE_CXX_COMPILER "clang++")
|
||||||
|
+ if (NOT CMAKE_C_COMPILER)
|
||||||
|
+ set(CMAKE_C_COMPILER "clang")
|
||||||
|
+ endif()
|
||||||
|
+ if (NOT CMAKE_CXX_COMPILER)
|
||||||
|
+ set(CMAKE_CXX_COMPILER "clang++")
|
||||||
|
+ endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(PROJECT_NAME ispc)
|
||||||
|
@@ -412,6 +416,29 @@ else()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
+# Link against libstdc++.a which must be provided to the linker after
|
||||||
|
+# LLVM and CLang libraries.
|
||||||
|
+# This is needed because some of LLVM/CLang dependencies are using
|
||||||
|
+# std::make_shared, which is defined in one of those:
|
||||||
|
+# - libclang-cpp.so
|
||||||
|
+# - libstdc++.a
|
||||||
|
+# Using the former one is tricky because then generated binary depends
|
||||||
|
+# on a library which is outside of the LD_LIBRARY_PATH.
|
||||||
|
+#
|
||||||
|
+# Hence, using C++ implementation from G++ which seems to work just fine.
|
||||||
|
+# In fact, from investigation seems that libclang-cpp.so itself is pulling
|
||||||
|
+# std::_Sp_make_shared_tag from G++'s libstdc++.a.
|
||||||
|
+if(UNIX AND NOT APPLE)
|
||||||
|
+ execute_process(
|
||||||
|
+ COMMAND g++ --print-file-name libstdc++.a
|
||||||
|
+ OUTPUT_VARIABLE GCC_LIBSTDCXX_A
|
||||||
|
+ OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||||
|
+ )
|
||||||
|
+ if(GCC_LIBSTDCXX_A AND EXISTS ${GCC_LIBSTDCXX_A})
|
||||||
|
+ target_link_libraries(${PROJECT_NAME} ${GCC_LIBSTDCXX_A})
|
||||||
|
+ endif()
|
||||||
|
+endif()
|
||||||
|
+
|
||||||
|
# Build target for utility checking host ISA
|
||||||
|
if (ISPC_INCLUDE_UTILS)
|
||||||
|
add_executable(check_isa "")
|
||||||
|
|
Loading…
Reference in New Issue