mirror of
https://github.com/pytorch/pytorch.git
synced 2025-10-20 21:14:14 +08:00
remove abi uncertainty and potential abi conflict (#94306)
Currently there is a potential conflict for `GLIBCXX_USE_CXX11_ABI` configuration if users don't explicitly set this variable. In `caffe2/CMakeLists.txt`, if the variable is not set, an `abi checker` will be used to retrieve the ABI configuration from compiler. https://github.com/pytorch/pytorch/blob/master/caffe2/CMakeLists.txt#L1165-L1183 However, in 'torch/csrc/Module.cpp`, if the variable is not set, it will be set to `0`. The conflict happens when the default ABI of the compiler is `1`. https://github.com/pytorch/pytorch/blob/master/torch/csrc/Module.cpp#L1612 This PR eliminate this uncertainty and potential conflict. The ABI will be checked and set in `CMakeLists.txt`, and pass the value to `caffe2/CMakeLists.txt`. Meanwhile, in case the `caffe2/CMakeLists.txt` is directly invoked from a `cmake` command, The original GLIBC check logic is kept in this file. If users doesn't explicitly assign a value to `GLIBCXX_USE_CXX11_ABI`, the `abi checker` will be executed and set the value accordingly. If the `abi checker` failed to compile or execute, the value will be set to `0`. If users explicitly assigned a value, then the provided value will be used. Moreover, if `GLIBCXX_USE_CXX11_ABI` is set to `0`, the '-DGLIBCXX_USE_CXX11_ABI=0' flag won't be appended to `CMAKE_CXX_FLAGS`. Thus, whether to use ABI=0 or ABI=1 fully depends on compiler's default configuration. It could cause an issue that even users explicitly set `GLIBCXX_USE_CXX11_ABI` to `0`, the compiler still builds the binaries with ABI=1. https://github.com/pytorch/pytorch/blob/master/CMakeLists.txt#L44-L51 Pull Request resolved: https://github.com/pytorch/pytorch/pull/94306 Approved by: https://github.com/malfet
This commit is contained in:
committed by
PyTorch MergeBot
parent
02ca2253cc
commit
8b37eff69f
@ -40,14 +40,19 @@ endif()
|
||||
set(CMAKE_CXX_STANDARD 17 CACHE STRING "The C++ standard whose features are requested to build this target.")
|
||||
set(CMAKE_C_STANDARD 11 CACHE STRING "The C standard whose features are requested to build this target.")
|
||||
|
||||
if(DEFINED GLIBCXX_USE_CXX11_ABI)
|
||||
# ---[ Utils
|
||||
include(cmake/public/utils.cmake)
|
||||
|
||||
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
||||
include(cmake/CheckAbi.cmake)
|
||||
string(APPEND CMAKE_CXX_FLAGS " -D_GLIBCXX_USE_CXX11_ABI=${GLIBCXX_USE_CXX11_ABI}")
|
||||
if(${GLIBCXX_USE_CXX11_ABI} EQUAL 1)
|
||||
set(CXX_STANDARD_REQUIRED ON)
|
||||
string(APPEND CMAKE_CXX_FLAGS " -D_GLIBCXX_USE_CXX11_ABI=1")
|
||||
else()
|
||||
# Please note this is required in order to ensure compatibility between gcc 9 and gcc 7
|
||||
# This could be removed when all Linux PyTorch binary builds are compiled by the same toolchain again
|
||||
string(APPEND CMAKE_CXX_FLAGS " -fabi-version=11")
|
||||
include(CheckCXXCompilerFlag)
|
||||
append_cxx_flag_if_supported("-fabi-version=11" CMAKE_CXX_FLAGS)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
@ -631,9 +636,6 @@ if(INTERN_BUILD_MOBILE)
|
||||
set(INTERN_DISABLE_MOBILE_INTERP ON)
|
||||
endif()
|
||||
|
||||
# ---[ Utils
|
||||
include(cmake/public/utils.cmake)
|
||||
|
||||
# ---[ Version numbers for generated libraries
|
||||
file(READ version.txt TORCH_DEFAULT_VERSION)
|
||||
# Strip trailing newline
|
||||
|
@ -1157,31 +1157,8 @@ if(BUILD_TEST)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# XXX This ABI check cannot be run with arm-linux-androideabi-g++
|
||||
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
||||
if(DEFINED GLIBCXX_USE_CXX11_ABI)
|
||||
message(STATUS "_GLIBCXX_USE_CXX11_ABI is already defined as a cmake variable")
|
||||
else()
|
||||
message(STATUS "${CMAKE_CXX_COMPILER} ${TORCH_SRC_DIR}/abi-check.cpp -o ${CMAKE_BINARY_DIR}/abi-check")
|
||||
execute_process(
|
||||
COMMAND
|
||||
"${CMAKE_CXX_COMPILER}"
|
||||
"${TORCH_SRC_DIR}/abi-check.cpp"
|
||||
"-o"
|
||||
"${CMAKE_BINARY_DIR}/abi-check"
|
||||
RESULT_VARIABLE ABI_CHECK_COMPILE_RESULT)
|
||||
if(ABI_CHECK_COMPILE_RESULT)
|
||||
message(FATAL_ERROR "Could not compile ABI Check: ${ABI_CHECK_COMPILE_RESULT}")
|
||||
endif()
|
||||
execute_process(
|
||||
COMMAND "${CMAKE_BINARY_DIR}/abi-check"
|
||||
RESULT_VARIABLE ABI_CHECK_RESULT
|
||||
OUTPUT_VARIABLE GLIBCXX_USE_CXX11_ABI)
|
||||
if(ABI_CHECK_RESULT)
|
||||
message(WARNING "Could not run ABI Check: ${ABI_CHECK_RESULT}")
|
||||
endif()
|
||||
endif()
|
||||
message(STATUS "Determined _GLIBCXX_USE_CXX11_ABI=${GLIBCXX_USE_CXX11_ABI}")
|
||||
include(../cmake/CheckAbi.cmake)
|
||||
endif()
|
||||
|
||||
# CMake config for external projects.
|
||||
|
27
cmake/CheckAbi.cmake
Normal file
27
cmake/CheckAbi.cmake
Normal file
@ -0,0 +1,27 @@
|
||||
if(DEFINED GLIBCXX_USE_CXX11_ABI)
|
||||
message(STATUS "_GLIBCXX_USE_CXX11_ABI=${GLIBCXX_USE_CXX11_ABI} is already defined as a cmake variable")
|
||||
return()
|
||||
endif()
|
||||
|
||||
# XXX This ABI check cannot be run with arm-linux-androideabi-g++
|
||||
message(STATUS "${CMAKE_CXX_COMPILER} ${PROJECT_SOURCE_DIR}/torch/abi-check.cpp -o ${CMAKE_BINARY_DIR}/abi-check")
|
||||
execute_process(
|
||||
COMMAND
|
||||
"${CMAKE_CXX_COMPILER}"
|
||||
"${PROJECT_SOURCE_DIR}/torch/abi-check.cpp"
|
||||
"-o"
|
||||
"${CMAKE_BINARY_DIR}/abi-check"
|
||||
RESULT_VARIABLE ABI_CHECK_COMPILE_RESULT)
|
||||
if(ABI_CHECK_COMPILE_RESULT)
|
||||
message(FATAL_ERROR "Could not compile ABI Check: ${ABI_CHECK_COMPILE_RESULT}")
|
||||
set(GLIBCXX_USE_CXX11_ABI 0)
|
||||
endif()
|
||||
execute_process(
|
||||
COMMAND "${CMAKE_BINARY_DIR}/abi-check"
|
||||
RESULT_VARIABLE ABI_CHECK_RESULT
|
||||
OUTPUT_VARIABLE GLIBCXX_USE_CXX11_ABI)
|
||||
if(ABI_CHECK_RESULT)
|
||||
message(WARNING "Could not run ABI Check: ${ABI_CHECK_RESULT}")
|
||||
set(GLIBCXX_USE_CXX11_ABI 0)
|
||||
endif()
|
||||
message(STATUS "Determined _GLIBCXX_USE_CXX11_ABI=${GLIBCXX_USE_CXX11_ABI}")
|
Reference in New Issue
Block a user