diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index 2f6a0b2c3a..7c634ec6ca 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -94,60 +94,9 @@ endif(USE_TF_PYTHON_LIBS) # find tensorflow, I need tf abi info find_package(tensorflow REQUIRED) -if (TENSORFLOW_VERSION VERSION_GREATER_EQUAL 2.10) - set (CMAKE_CXX_STANDARD 17) -elseif (TENSORFLOW_VERSION VERSION_GREATER_EQUAL 2.7) - set (CMAKE_CXX_STANDARD 14) -else() - set (CMAKE_CXX_STANDARD 11) -endif() - -if (MSVC) - # see TF .bazelrc - add_compile_options(/W0 /Zc:__cplusplus /D_USE_MATH_DEFINES /d2ReducedOptimizeHugeFunctions) - set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS TRUE) -endif() -if (TENSORFLOW_VERSION VERSION_GREATER_EQUAL 2.4 AND MSVC) - # see TF 2.4 release notes - add_compile_options(/Zc:preprocessor) -endif() - # find threads find_package(Threads) -# auto op_cxx_abi -if (NOT DEFINED OP_CXX_ABI) - try_run( - CPP_CXX_ABI_RUN_RESULT_VAR CPP_CXX_ABI_COMPILE_RESULT_VAR - ${CMAKE_CURRENT_BINARY_DIR}/tf_cxx_abi - "${CMAKE_CURRENT_SOURCE_DIR}/cmake/tf_cxx_abi.cpp" - LINK_LIBRARIES ${TensorFlowFramework_LIBRARY} - CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:STRING=${TensorFlow_INCLUDE_DIRS}" - RUN_OUTPUT_VARIABLE CPP_CXX_ABI - COMPILE_OUTPUT_VARIABLE CPP_CXX_ABI_COMPILE_OUTPUT_VAR - ) - if (NOT ${CPP_CXX_ABI_COMPILE_RESULT_VAR}) - message(FATAL_ERROR "Failed to compile: \n ${CPP_CXX_ABI_COMPILE_OUTPUT_VAR}" ) - endif() - if (NOT ${CPP_CXX_ABI_RUN_RESULT_VAR} EQUAL "0") - message(FATAL_ERROR "Failed to run, return code: ${CPP_CXX_ABI}" ) - endif() - set(OP_CXX_ABI ${CPP_CXX_ABI}) - message (STATUS "Automatically determined OP_CXX_ABI=${OP_CXX_ABI} ") -else() - message (STATUS "User set OP_CXX_ABI=${OP_CXX_ABI} ") -endif() -# message the cxx_abi used during compiling -if (${OP_CXX_ABI} EQUAL 0) - message (STATUS "Set GLIBCXX_USE_CXX_ABI=0 when compiling ops") -else () - set (OP_CXX_ABI 1) - message (STATUS "Set GLIBCXX_USE_CXX_ABI=1 when compiling ops") -endif () - -# set _GLIBCXX_USE_CXX11_ABI flag globally -add_definitions(-D_GLIBCXX_USE_CXX11_ABI=${OP_CXX_ABI}) - # define USE_TTM if (NOT DEFINED USE_TTM) set(USE_TTM FALSE) diff --git a/source/api_cc/tests/CMakeLists.txt b/source/api_cc/tests/CMakeLists.txt index 4fd214052a..abd55d0be4 100644 --- a/source/api_cc/tests/CMakeLists.txt +++ b/source/api_cc/tests/CMakeLists.txt @@ -22,32 +22,6 @@ list (APPEND CMAKE_MODULE_PATH ${DEEPMD_SOURCE_DIR}/source/cmake/) if (USE_TF_PYTHON_LIBS) set(DEEPMD_SOURCE_DIR ${PROJECT_SOURCE_DIR}/../../..) find_package (Python COMPONENTS Interpreter Development REQUIRED) - # find tensorflow, I need tf abi info - find_package(tensorflow REQUIRED) - # auto op_cxx_abi - try_run( - CPP_CXX_ABI_RUN_RESULT_VAR CPP_CXX_ABI_COMPILE_RESULT_VAR - ${CMAKE_CURRENT_BINARY_DIR}/tf_cxx_abi - "${DEEPMD_SOURCE_DIR}/source/cmake/tf_cxx_abi.cpp" - LINK_LIBRARIES ${TensorFlowFramework_LIBRARY} - CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:STRING=${TensorFlow_INCLUDE_DIRS}" - RUN_OUTPUT_VARIABLE CPP_CXX_ABI - COMPILE_OUTPUT_VARIABLE CPP_CXX_ABI_COMPILE_OUTPUT_VAR - ) - if (NOT ${CPP_CXX_ABI_COMPILE_RESULT_VAR}) - message(FATAL_ERROR "Failed to compile: \n ${CPP_CXX_ABI_COMPILE_OUTPUT_VAR}" ) - endif() - if (NOT ${CPP_CXX_ABI_RUN_RESULT_VAR} EQUAL "0") - message(FATAL_ERROR "Failed to run, return code: ${CPP_CXX_ABI}" ) - endif() - if (DEFINED PY_CXX_ABI) - if (NOT (${CPP_CXX_ABI} EQUAL ${PY_CXX_ABI})) - message (WARNNING "NOT consistent CXX_ABIs: python interface of tf uses ${PY_CXX_ABI}, while c++ interface of tf uses ${CPP_CXX_ABI}, we follow c++ interface ") - endif() - endif() - set(OP_CXX_ABI ${CPP_CXX_ABI}) - message (STATUS "Automatically determined OP_CXX_ABI=${OP_CXX_ABI} ") - add_definitions(-D_GLIBCXX_USE_CXX11_ABI=${OP_CXX_ABI}) endif(USE_TF_PYTHON_LIBS) # model version @@ -61,13 +35,6 @@ set(apiname "deepmd_api") set(opname "deepmd_op") find_package(tensorflow REQUIRED) -if (TENSORFLOW_VERSION VERSION_GREATER_EQUAL 2.10) - set (CMAKE_CXX_STANDARD 17) -elseif (TENSORFLOW_VERSION VERSION_GREATER_EQUAL 2.7) - set (CMAKE_CXX_STANDARD 14) -else() - set (CMAKE_CXX_STANDARD 11) -endif() find_package(Threads) # find openmp diff --git a/source/cmake/Findtensorflow.cmake b/source/cmake/Findtensorflow.cmake index 0ec28fcc59..6b969a8992 100644 --- a/source/cmake/Findtensorflow.cmake +++ b/source/cmake/Findtensorflow.cmake @@ -221,3 +221,82 @@ if (NOT TensorFlow_FIND_QUIETLY) endif () unset(TensorFlow_search_PATHS) + +if (TENSORFLOW_VERSION VERSION_GREATER_EQUAL 2.10) + set (CMAKE_CXX_STANDARD 17) +elseif (TENSORFLOW_VERSION VERSION_GREATER_EQUAL 2.7) + set (CMAKE_CXX_STANDARD 14) +else() + set (CMAKE_CXX_STANDARD 11) +endif() + +if (MSVC) + # see TF .bazelrc + add_compile_options(/W0 /Zc:__cplusplus /D_USE_MATH_DEFINES /d2ReducedOptimizeHugeFunctions) + set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS TRUE) +endif() +if (TENSORFLOW_VERSION VERSION_GREATER_EQUAL 2.4 AND MSVC) + # see TF 2.4 release notes + add_compile_options(/Zc:preprocessor) +endif() + +# auto op_cxx_abi +if (NOT DEFINED OP_CXX_ABI) + if (TENSORFLOW_VERSION VERSION_GREATER_EQUAL 2.9) + # TF 2.9 removes the tf_cxx11_abi_flag function, which is really bad... + # try compiling with both 0 and 1, and see which one works + try_compile( + CPP_CXX_ABI_COMPILE_RESULT_VAR0 + ${CMAKE_CURRENT_BINARY_DIR}/tf_cxx_abi0 + "${CMAKE_CURRENT_LIST_DIR}/test_cxx_abi.cpp" + LINK_LIBRARIES ${TensorFlowFramework_LIBRARY} + CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:STRING=${TensorFlow_INCLUDE_DIRS}" + COMPILE_DEFINITIONS -D_GLIBCXX_USE_CXX11_ABI=0 + ) + try_compile( + CPP_CXX_ABI_COMPILE_RESULT_VAR1 + ${CMAKE_CURRENT_BINARY_DIR}/tf_cxx_abi1 + "${CMAKE_CURRENT_LIST_DIR}/test_cxx_abi.cpp" + LINK_LIBRARIES ${TensorFlowFramework_LIBRARY} + CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:STRING=${TensorFlow_INCLUDE_DIRS}" + COMPILE_DEFINITIONS -D_GLIBCXX_USE_CXX11_ABI=1 + ) + if (NOT ${CPP_CXX_ABI_COMPILE_RESULT_VAR0} AND ${CPP_CXX_ABI_COMPILE_RESULT_VAR1}) + set(OP_CXX_ABI 1) + elseif(${CPP_CXX_ABI_COMPILE_RESULT_VAR0} AND NOT ${CPP_CXX_ABI_COMPILE_RESULT_VAR1}) + set(OP_CXX_ABI 0) + else() + message(FATAL_ERROR "Failed to detect OP_CXX_ABI, please set it manually") + endif() + else() + try_run( + CPP_CXX_ABI_RUN_RESULT_VAR CPP_CXX_ABI_COMPILE_RESULT_VAR + ${CMAKE_CURRENT_BINARY_DIR}/tf_cxx_abi + "${CMAKE_CURRENT_LIST_DIR}/tf_cxx_abi.cpp" + LINK_LIBRARIES ${TensorFlowFramework_LIBRARY} + CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:STRING=${TensorFlow_INCLUDE_DIRS}" + RUN_OUTPUT_VARIABLE CPP_CXX_ABI + COMPILE_OUTPUT_VARIABLE CPP_CXX_ABI_COMPILE_OUTPUT_VAR + ) + if (NOT ${CPP_CXX_ABI_COMPILE_RESULT_VAR}) + message(FATAL_ERROR "Failed to compile: \n ${CPP_CXX_ABI_COMPILE_OUTPUT_VAR}" ) + endif() + if (NOT ${CPP_CXX_ABI_RUN_RESULT_VAR} EQUAL "0") + message(FATAL_ERROR "Failed to run, return code: ${CPP_CXX_ABI}" ) + endif() + set(OP_CXX_ABI ${CPP_CXX_ABI}) + endif() + message (STATUS "Automatically determined OP_CXX_ABI=${OP_CXX_ABI} ") +else() + message (STATUS "User set OP_CXX_ABI=${OP_CXX_ABI} ") +endif() +# message the cxx_abi used during compiling +if (${OP_CXX_ABI} EQUAL 0) + message (STATUS "Set GLIBCXX_USE_CXX_ABI=0") +else () + set (OP_CXX_ABI 1) + message (STATUS "Set GLIBCXX_USE_CXX_ABI=1") +endif () + +# set _GLIBCXX_USE_CXX11_ABI flag globally +add_definitions(-D_GLIBCXX_USE_CXX11_ABI=${OP_CXX_ABI}) diff --git a/source/cmake/test_cxx_abi.cpp b/source/cmake/test_cxx_abi.cpp new file mode 100644 index 0000000000..0e70533aa0 --- /dev/null +++ b/source/cmake/test_cxx_abi.cpp @@ -0,0 +1,6 @@ +#include +#include "tensorflow/core/framework/shape_inference.h" +int main() { + auto ignore = tensorflow::strings::StrCat("a", "b"); + return 0; +} diff --git a/source/cmake/tf_cxx_abi.cpp b/source/cmake/tf_cxx_abi.cpp index ed3fd848e0..c25565c568 100644 --- a/source/cmake/tf_cxx_abi.cpp +++ b/source/cmake/tf_cxx_abi.cpp @@ -3,11 +3,7 @@ int main(int argc, char * argv[]) { #if (TF_MAJOR_VERSION == 2 && TF_MINOR_VERSION>=9) || TF_MAJOR_VERSION > 2 -#ifdef _GLIBCXX_USE_CXX11_ABI - std::cout << _GLIBCXX_USE_CXX11_ABI; -#else - std::cout << 0; -#endif +#error "TF>=2.9 should not execute this file..." #else std::cout << tf_cxx11_abi_flag(); #endif