aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoranon <anon [at] nowhere>2021-04-27 12:06:42 +0000
committerselsta <selsta@sent.at>2021-07-13 08:01:09 +0200
commit72af8a5fce77136ba4428432c1d66f25450abd7d (patch)
treeaf931e1f15b382629d055c1896c8f5f2d60da3a2
parentMerge pull request #7734 (diff)
downloadmonero-72af8a5fce77136ba4428432c1d66f25450abd7d.tar.xz
cmake: forbid undefined symbols
-rw-r--r--CMakeLists.txt46
1 files changed, 46 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 442d6770f..9346808c3 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -111,6 +111,52 @@ function (add_definition_if_library_exists library function header var)
endif()
endfunction()
+# Function to forbid undefined symbols and also verify
+# 1) Test project with all types of libraries and without undefined symbols can compile successfully
+# 2) Test project with all types of libraries and undefined symbols can not compile successfully
+function(forbid_undefined_symbols)
+ unset(TMP)
+ # https://www.unix.com/man-page/linux/1/ld, --no-undefined, Report unresolved symbol references from regular object files.
+ add_linker_flag_if_supported(-Wl,--no-undefined TMP)
+ # https://www.unix.com/man-page/osx/1/ld/, -undefined, Specifies how undefined symbols are to be treated.
+ add_linker_flag_if_supported(-Wl,-undefined,error TMP)
+ string(APPEND CMAKE_SHARED_LINKER_FLAGS ${TMP})
+ string(APPEND CMAKE_MODULE_LINKER_FLAGS ${TMP})
+ set(CMAKE_SHARED_LINKER_FLAGS ${CMAKE_SHARED_LINKER_FLAGS} PARENT_SCOPE)
+ set(CMAKE_MODULE_LINKER_FLAGS ${CMAKE_MODULE_LINKER_FLAGS} PARENT_SCOPE)
+ set(TEST_PROJECT "${CMAKE_BINARY_DIR}/${CMAKE_FILES_DIRECTORY}/CMakeTmp/test_project")
+ foreach(EXPECT IN ITEMS TRUE FALSE)
+ file(REMOVE_RECURSE "${TEST_PROJECT}")
+ file(MAKE_DIRECTORY "${TEST_PROJECT}")
+ file(WRITE "${TEST_PROJECT}/CMakeLists.txt"
+ [=[
+cmake_minimum_required(VERSION 3.1)
+project(test)
+option(EXPECT_SUCCESS "" ON)
+file(WRITE "${CMAKE_SOURCE_DIR}/incorrect_source.cpp" "void undefined_symbol(); void symbol() { undefined_symbol(); }")
+if (EXPECT_SUCCESS)
+ file(APPEND "${CMAKE_SOURCE_DIR}/incorrect_source.cpp" " void undefined_symbol() {}; ")
+endif()
+add_library(l0 SHARED incorrect_source.cpp)
+add_library(l1 MODULE incorrect_source.cpp)
+add_library(l2 STATIC incorrect_source.cpp)
+add_library(l3 OBJECT incorrect_source.cpp)
+]=]
+ )
+ try_compile(SUCCESS "${TEST_PROJECT}/build" "${TEST_PROJECT}" test
+ CMAKE_FLAGS
+ "-DCMAKE_SHARED_LINKER_FLAGS=${CMAKE_SHARED_LINKER_FLAGS}"
+ "-DCMAKE_MODULE_LINKER_FLAGS=${CMAKE_MODULE_LINKER_FLAGS}"
+ "-DEXPECT_SUCCESS=${EXPECT}"
+ )
+ if (NOT ${SUCCESS} STREQUAL ${EXPECT})
+ message(FATAL_ERROR "Undefined symbols test failure: expect(${EXPECT}), success(${SUCCESS})")
+ endif()
+ file(REMOVE_RECURSE "${TEST_PROJECT}")
+ endforeach()
+endfunction()
+forbid_undefined_symbols()
+
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE)
message(STATUS "Setting default build type: ${CMAKE_BUILD_TYPE}")