From fae5915d766ede7e14645e22911f958cc090f2bf Mon Sep 17 00:00:00 2001 From: Scott McKay Date: Fri, 11 Sep 2020 06:50:28 +1000 Subject: [PATCH] CMake fixes/tweaks for minimal builds and MinSizeRel builds (#5112) * Fix places where MinSizeRel wasn't having relevant flags added in the same way as Release and RelWithDebInfo Enable LTO for minimal build. Cleanups onnx_minimal.cmake to remove some things handled when LTO is enabled in CMakeLists.txt * Only enable LTO for MSVC in a minimal build --- cmake/CMakeLists.txt | 46 ++++++++++++++++++++----------- cmake/external/onnx_minimal.cmake | 5 ---- cmake/onnxruntime.cmake | 9 ++++-- cmake/onnxruntime_python.cmake | 1 + 4 files changed, 38 insertions(+), 23 deletions(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 119e013016..0a57f0e488 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -39,7 +39,7 @@ enable_testing() if(NOT CMAKE_BUILD_TYPE) message(STATUS "Build type not set - using RelWithDebInfo") - set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "Choose build type: Debug Release RelWithDebInfo." FORCE) + set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "Choose build type: Debug Release RelWithDebInfo MinSizeRel." FORCE) endif() # Options @@ -198,17 +198,6 @@ if(onnxruntime_USE_OPENMP) endif() endif() -if(onnxruntime_ENABLE_LTO) - include(CheckIPOSupported) - check_ipo_supported(RESULT ipo_enabled OUTPUT ipo_output) - if(NOT ipo_enabled) - message(WARNING "IPO is not supported by this compiler") - set(onnxruntime_ENABLE_LTO OFF) - else() - set (CMAKE_INTERPROCEDURAL_OPTIMIZATION ON) - endif() -endif() - # ORT build with as much excluded as possible. Supports ORT flatbuffers models only. # Will expose option in build.py when all pieces are available if(onnxruntime_MINIMAL_BUILD) @@ -221,8 +210,11 @@ if(onnxruntime_MINIMAL_BUILD) endif() if (MSVC) - # add MSVC specific flags to reduce build size here if needed - + # turn on LTO (which adds some compiler flags and turns on LTCG) unless it's a Debug build to minimize binary size + if (NOT CMAKE_BUILD_TYPE STREQUAL "Debug") + set (onnxruntime_ENABLE_LTO ON) + endif() + # undocumented internal flag to allow analysis of a minimal build binary size if (ADD_DEBUG_INFO_TO_MINIMAL_BUILD) string(APPEND CMAKE_CXX_FLAGS " /Zi") @@ -236,9 +228,25 @@ if(onnxruntime_MINIMAL_BUILD) else() add_link_options(-Wl,--gc-sections) endif() + + if (ADD_DEBUG_INFO_TO_MINIMAL_BUILD) + string(APPEND CMAKE_CXX_FLAGS " -g") + string(APPEND CMAKE_C_FLAGS " -g") + endif() endif() endif() +if(onnxruntime_ENABLE_LTO) + include(CheckIPOSupported) + check_ipo_supported(RESULT ipo_enabled OUTPUT ipo_output) + if(NOT ipo_enabled) + message(WARNING "IPO is not supported by this compiler") + set(onnxruntime_ENABLE_LTO OFF) + else() + set (CMAKE_INTERPROCEDURAL_OPTIMIZATION ON) + endif() +endif() + if (onnxruntime_REDUCED_OPS_BUILD) add_compile_definitions(REDUCED_OPS_BUILD) endif() @@ -352,6 +360,7 @@ if (MSVC) if (onnxruntime_ENABLE_LTO AND NOT onnxruntime_USE_CUDA) SET (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Gw /GL") SET (CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /Gw /GL") + SET (CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} /Gw /GL") endif() # The WinML build tool chain builds ARM/ARM64, and the internal tool chain does not have folders for spectre mitigation libs. @@ -370,6 +379,8 @@ if (MSVC) SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /guard:cf") SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} /guard:cf") SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /guard:cf") + SET(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} /guard:cf") + SET(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} /guard:cf") SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /guard:cf") endif() else() @@ -563,7 +574,6 @@ get_filename_component(ORTTRAINING_ROOT "${ORTTRAINING_ROOT}" ABSOLUTE) get_filename_component(REPO_ROOT "${REPO_ROOT}" ABSOLUTE) set(ONNXRUNTIME_INCLUDE_DIR ${REPO_ROOT}/include/onnxruntime) - add_subdirectory(external/date EXCLUDE_FROM_ALL) if(onnxruntime_PREFER_SYSTEM_LIB) @@ -819,13 +829,17 @@ if (WIN32) if (MSVC) foreach(type EXE STATIC SHARED) if (NOT type MATCHES STATIC) + set(CMAKE_${type}_LINKER_FLAGS_RELEASE "${CMAKE_${type}_LINKER_FLAGS_RELEASE} /OPT:REF,ICF,LBR") + set(CMAKE_${type}_LINKER_FLAGS_RELEASE "${CMAKE_${type}_LINKER_FLAGS_RELEASE} /INCREMENTAL:NO") set(CMAKE_${type}_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_${type}_LINKER_FLAGS_RELWITHDEBINFO} /OPT:REF,ICF,LBR") set(CMAKE_${type}_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_${type}_LINKER_FLAGS_RELWITHDEBINFO} /INCREMENTAL:NO") - #TODO: the "/LTCG" switch should be controlled by onnxruntime_ENABLE_LTO + set(CMAKE_${type}_LINKER_FLAGS_MINSIZEREL "${CMAKE_${type}_LINKER_FLAGS_MINSIZEREL} /OPT:REF,ICF,LBR") + set(CMAKE_${type}_LINKER_FLAGS_MINSIZEREL "${CMAKE_${type}_LINKER_FLAGS_MINSIZEREL} /INCREMENTAL:NO") endif() if (onnxruntime_ENABLE_LTO AND NOT onnxruntime_USE_CUDA) set(CMAKE_${type}_LINKER_FLAGS_RELEASE "${CMAKE_${type}_LINKER_FLAGS_RELEASE} /LTCG") set(CMAKE_${type}_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_${type}_LINKER_FLAGS_RELWITHDEBINFO} /LTCG") + set(CMAKE_${type}_LINKER_FLAGS_MINSIZEREL "${CMAKE_${type}_LINKER_FLAGS_MINSIZEREL} /LTCG") endif() endforeach() endif() diff --git a/cmake/external/onnx_minimal.cmake b/cmake/external/onnx_minimal.cmake index d99ec9a884..b69885a280 100644 --- a/cmake/external/onnx_minimal.cmake +++ b/cmake/external/onnx_minimal.cmake @@ -51,11 +51,6 @@ file(GLOB onnx_src CONFIGURE_DEPENDS "${ONNX_SOURCE_ROOT}/onnx/defs/data_type_utils.*" ) -if (MSVC) - SET (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Gw /GL") - SET (CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /Gw /GL") -endif() - add_library(onnx ${onnx_src}) add_dependencies(onnx onnx_proto) target_include_directories(onnx PUBLIC "${ONNX_SOURCE_ROOT}") diff --git a/cmake/onnxruntime.cmake b/cmake/onnxruntime.cmake index f05c56f3e5..8d1c5211c0 100644 --- a/cmake/onnxruntime.cmake +++ b/cmake/onnxruntime.cmake @@ -71,8 +71,12 @@ endif() # strip binary on Android, or for a minimal build on Unix if(CMAKE_SYSTEM_NAME STREQUAL "Android" OR (onnxruntime_MINIMAL_BUILD AND UNIX)) - set_target_properties(onnxruntime PROPERTIES LINK_FLAGS_RELEASE -s) - set_target_properties(onnxruntime PROPERTIES LINK_FLAGS_MINSIZEREL -s) + if (onnxruntime_MINIMAL_BUILD AND ADD_DEBUG_INFO_TO_MINIMAL_BUILD) + # don't strip + else() + set_target_properties(onnxruntime PROPERTIES LINK_FLAGS_RELEASE -s) + set_target_properties(onnxruntime PROPERTIES LINK_FLAGS_MINSIZEREL -s) + endif() endif() target_link_libraries(onnxruntime PRIVATE @@ -109,6 +113,7 @@ set_target_properties(onnxruntime PROPERTIES LINK_DEPENDS ${SYMBOL_FILE}) if(onnxruntime_ENABLE_LTO) set_target_properties(onnxruntime PROPERTIES INTERPROCEDURAL_OPTIMIZATION_RELEASE TRUE) set_target_properties(onnxruntime PROPERTIES INTERPROCEDURAL_OPTIMIZATION_RELWITHDEBINFO TRUE) + set_target_properties(onnxruntime PROPERTIES INTERPROCEDURAL_OPTIMIZATION_MINSIZEREL TRUE) endif() install(TARGETS onnxruntime ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} diff --git a/cmake/onnxruntime_python.cmake b/cmake/onnxruntime_python.cmake index f7ad0f7ba1..d4d1769fd7 100644 --- a/cmake/onnxruntime_python.cmake +++ b/cmake/onnxruntime_python.cmake @@ -147,6 +147,7 @@ set_target_properties(onnxruntime_pybind11_state PROPERTIES FOLDER "ONNXRuntime" if(onnxruntime_ENABLE_LTO) set_target_properties(onnxruntime_pybind11_state PROPERTIES INTERPROCEDURAL_OPTIMIZATION_RELEASE TRUE) set_target_properties(onnxruntime_pybind11_state PROPERTIES INTERPROCEDURAL_OPTIMIZATION_RELWITHDEBINFO TRUE) + set_target_properties(onnxruntime_pybind11_state PROPERTIES INTERPROCEDURAL_OPTIMIZATION_MINSIZEREL TRUE) endif() if (MSVC) set_target_properties(onnxruntime_pybind11_state PROPERTIES SUFFIX ".pyd")