1*4882a593SmuzhiyunFrom fa5ec96a94646492a3f908e12905b3e48a8e800b Mon Sep 17 00:00:00 2001 2*4882a593SmuzhiyunFrom: Romain Naour <romain.naour@gmail.com> 3*4882a593SmuzhiyunDate: Wed, 18 Apr 2018 20:24:13 +0200 4*4882a593SmuzhiyunSubject: [PATCH] src/cpp: fix cmake >= 3.11 build 5*4882a593Smuzhiyun 6*4882a593SmuzhiyunCMake < 3.11 doesn't support add_library() without any source file 7*4882a593Smuzhiyun(i.e add_library(foo SHARED)). But flann CMake use a trick that use 8*4882a593Smuzhiyunan empty string "" as source list (i.e add_library(foo SHARED "")). 9*4882a593SmuzhiyunThis look like a bug in CMake < 3.11. 10*4882a593Smuzhiyun 11*4882a593SmuzhiyunWith CMake >= 3.11, the new behaviour of add_library() break the 12*4882a593Smuzhiyunexisting flann CMake code. 13*4882a593Smuzhiyun 14*4882a593SmuzhiyunFrom CMake Changelog [1]: 15*4882a593Smuzhiyun"add_library() and add_executable() commands can now be called without 16*4882a593Smuzhiyun any sources and will not complain as long as sources are added later 17*4882a593Smuzhiyun via the target_sources() command." 18*4882a593Smuzhiyun 19*4882a593SmuzhiyunNote: flann CMake code doesn't use target_sources() since no source file 20*4882a593Smuzhiyunare provided intentionally since the flann shared library is created by 21*4882a593Smuzhiyunlinking with the flann_cpp_s static library with this line: 22*4882a593Smuzhiyun 23*4882a593Smuzhiyuntarget_link_libraries(flann_cpp -Wl,-whole-archive flann_cpp_s -Wl,-no-whole-archive) 24*4882a593Smuzhiyun 25*4882a593SmuzhiyunIf you try to use "add_library(flann_cpp SHARED ${CPP_SOURCES})" (as it should 26*4882a593Smuzhiyunbe normally done), the link fail due to already defined symbol. 27*4882a593Smuzhiyun 28*4882a593SmuzhiyunThey are building the shared version using the static library "to speedup the 29*4882a593Smuzhiyunbuild time" [3] 30*4882a593Smuzhiyun 31*4882a593SmuzhiyunThis issue is already reported upstream [2] with a proposed solution. 32*4882a593Smuzhiyun 33*4882a593SmuzhiyunUpstream status: Pending 34*4882a593Smuzhiyun 35*4882a593SmuzhiyunFixes: 36*4882a593Smuzhiyunhttp://autobuild.buildroot.net/results/b2f/b2febfaf8c44ce477b3e4a5b9b976fd25e8d7454 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun[1] https://cmake.org/cmake/help/v3.11/release/3.11.html 39*4882a593Smuzhiyun[2] https://github.com/mariusmuja/flann/issues/369 40*4882a593Smuzhiyun[3] https://github.com/mariusmuja/flann/commit/0fd62b43be2fbb0b8d791ee36290791224dc030c 41*4882a593Smuzhiyun 42*4882a593SmuzhiyunSigned-off-by: Romain Naour <romain.naour@gmail.com> 43*4882a593Smuzhiyun--- 44*4882a593Smuzhiyun src/cpp/CMakeLists.txt | 4 ++-- 45*4882a593Smuzhiyun src/cpp/empty.cpp | 1 + 46*4882a593Smuzhiyun 2 files changed, 3 insertions(+), 2 deletions(-) 47*4882a593Smuzhiyun create mode 100644 src/cpp/empty.cpp 48*4882a593Smuzhiyun 49*4882a593Smuzhiyundiff --git a/src/cpp/CMakeLists.txt b/src/cpp/CMakeLists.txt 50*4882a593Smuzhiyunindex b44a735..a816863 100644 51*4882a593Smuzhiyun--- a/src/cpp/CMakeLists.txt 52*4882a593Smuzhiyun+++ b/src/cpp/CMakeLists.txt 53*4882a593Smuzhiyun@@ -29,7 +29,7 @@ if (BUILD_CUDA_LIB) 54*4882a593Smuzhiyun endif() 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun if(CMAKE_SYSTEM_NAME STREQUAL "Linux" AND CMAKE_COMPILER_IS_GNUCC) 57*4882a593Smuzhiyun- add_library(flann_cpp SHARED "") 58*4882a593Smuzhiyun+ add_library(flann_cpp SHARED "empty.cpp") 59*4882a593Smuzhiyun set_target_properties(flann_cpp PROPERTIES LINKER_LANGUAGE CXX) 60*4882a593Smuzhiyun target_link_libraries(flann_cpp -Wl,-whole-archive flann_cpp_s -Wl,-no-whole-archive) 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun@@ -85,7 +85,7 @@ if (BUILD_C_BINDINGS) 63*4882a593Smuzhiyun set_property(TARGET flann_s PROPERTY COMPILE_DEFINITIONS FLANN_STATIC) 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun if(CMAKE_SYSTEM_NAME STREQUAL "Linux" AND CMAKE_COMPILER_IS_GNUCC) 66*4882a593Smuzhiyun- add_library(flann SHARED "") 67*4882a593Smuzhiyun+ add_library(flann SHARED "empty.cpp") 68*4882a593Smuzhiyun set_target_properties(flann PROPERTIES LINKER_LANGUAGE CXX) 69*4882a593Smuzhiyun target_link_libraries(flann -Wl,-whole-archive flann_s -Wl,-no-whole-archive) 70*4882a593Smuzhiyun else() 71*4882a593Smuzhiyundiff --git a/src/cpp/empty.cpp b/src/cpp/empty.cpp 72*4882a593Smuzhiyunnew file mode 100644 73*4882a593Smuzhiyunindex 0000000..40a8c17 74*4882a593Smuzhiyun--- /dev/null 75*4882a593Smuzhiyun+++ b/src/cpp/empty.cpp 76*4882a593Smuzhiyun@@ -0,0 +1 @@ 77*4882a593Smuzhiyun+/* empty */ 78*4882a593Smuzhiyun-- 79*4882a593Smuzhiyun2.14.3 80*4882a593Smuzhiyun 81