Skip to content

Commit ec260c2

Browse files
authored
Feature/eigen free (#64)
* Change the place of option * Make the dependency of Eigen free * (minor) remove "" for consistency
1 parent 9c97f17 commit ec260c2

File tree

5 files changed

+162
-5
lines changed

5 files changed

+162
-5
lines changed

cpp/CMakeLists.txt

+23-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
cmake_minimum_required(VERSION 3.11)
22
project(patchworkpp VERSION 1.0.1)
33

4+
option(USE_SYSTEM_EIGEN3 "Use system pre-installed Eigen" OFF)
5+
option(INCLUDE_CPP_EXAMPLES "Include C++ example codes, which require Open3D for visualization" OFF)
6+
47
set(CMAKE_CXX_STANDARD 20)
58
set(PYTHON_EXECUTABLE python3)
69
set(CMAKE_BUILD_TYPE Release)
@@ -10,14 +13,32 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${Open3D_C_FLAGS}")
1013
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Open3D_CXX_FLAGS}")
1114
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${Open3D_EXE_LINKER_FLAGS}")
1215

13-
if(CMAKE_VERSION VERSION_LESS "3.15")
16+
if(CMAKE_VERSION VERSION_LESS 3.15)
1417
include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/ListPrepend.cmake")
1518
list_prepend(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
1619
else()
1720
list(PREPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
1821
endif()
1922

20-
option(INCLUDE_CPP_EXAMPLES "Include C++ example codes, which require Open3D for visualization" OFF)
23+
if(CMAKE_VERSION VERSION_GREATER 3.24)
24+
cmake_policy(SET CMP0135 OLD)
25+
endif()
26+
27+
# Originally, below code was from `find_dependencies.cmake`
28+
# The below code is to make dependency of Eigen free
29+
function(find_external_dependency PACKAGE_NAME TARGET_NAME INCLUDED_CMAKE_PATH)
30+
string(TOUPPER ${PACKAGE_NAME} PACKAGE_NAME_UP)
31+
set(USE_FROM_SYSTEM_OPTION "USE_SYSTEM_${PACKAGE_NAME_UP}")
32+
if(${${USE_FROM_SYSTEM_OPTION}})
33+
find_package(${PACKAGE_NAME} QUIET NO_MODULE)
34+
endif()
35+
if(NOT ${${USE_FROM_SYSTEM_OPTION}} OR NOT TARGET ${TARGET_NAME})
36+
set(${USE_FROM_SYSTEM_OPTION} OFF PARENT_SCOPE)
37+
include(${INCLUDED_CMAKE_PATH})
38+
endif()
39+
endfunction()
40+
41+
find_external_dependency("Eigen3" "Eigen3::Eigen" "${CMAKE_CURRENT_LIST_DIR}/cmake/eigen.cmake")
2142

2243
# Parameters in `patchworkpp` subdirectory.
2344
# Thus, link should be `patchworkpp::ground_seg_cores`

cpp/cmake/LICENSE

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
Eigen is primarily MPL2 licensed. See COPYING.MPL2 and these links:
2+
http://www.mozilla.org/MPL/2.0/
3+
http://www.mozilla.org/MPL/2.0/FAQ.html
4+
5+
Some files contain third-party code under BSD or LGPL licenses, whence the other
6+
COPYING.* files here.
7+
8+
All the LGPL code is either LGPL 2.1-only, or LGPL 2.1-or-later.
9+
For this reason, the COPYING.LGPL file contains the LGPL 2.1 text.
10+
11+
If you want to guarantee that the Eigen code that you are #including is licensed
12+
under the MPL2 and possibly more permissive licenses (like BSD), #define this
13+
preprocessor symbol:
14+
EIGEN_MPL2_ONLY
15+
For example, with most compilers, you could add this to your project CXXFLAGS:
16+
-DEIGEN_MPL2_ONLY
17+
This will cause a compilation error to be generated if you #include any code that is
18+
LGPL licensed.

cpp/cmake/eigen.cmake

+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
# MIT License
2+
#
3+
# Copyright (c) 2022 Ignacio Vizzo, Tiziano Guadagnino, Benedikt Mersch, Cyrill
4+
# Stachniss.
5+
#
6+
# Permission is hereby granted, free of charge, to any person obtaining a copy
7+
# of this software and associated documentation files (the "Software"), to deal
8+
# in the Software without restriction, including without limitation the rights
9+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10+
# copies of the Software, and to permit persons to whom the Software is
11+
# furnished to do so, subject to the following conditions:
12+
#
13+
# The above copyright notice and this permission notice shall be included in all
14+
# copies or substantial portions of the Software.
15+
#
16+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22+
# SOFTWARE.
23+
24+
set(EIGEN_BUILD_DOC OFF CACHE BOOL "Don't build Eigen docs")
25+
set(EIGEN_BUILD_TESTING OFF CACHE BOOL "Don't build Eigen tests")
26+
set(EIGEN_BUILD_PKGCONFIG OFF CACHE BOOL "Don't build Eigen pkg-config")
27+
set(EIGEN_BUILD_BLAS OFF CACHE BOOL "Don't build blas module")
28+
set(EIGEN_BUILD_LAPACK OFF CACHE BOOL "Don't build lapack module")
29+
30+
include(FetchContent)
31+
FetchContent_Declare(eigen URL https://gitlab.com/libeigen/eigen/-/archive/3.4.0/eigen-3.4.0.tar.gz
32+
PATCH_COMMAND patch -p1 < ${CMAKE_CURRENT_LIST_DIR}/eigen.patch UPDATE_DISCONNECTED 1)
33+
FetchContent_GetProperties(eigen)
34+
if(NOT eigen_POPULATED)
35+
FetchContent_Populate(eigen)
36+
if(${CMAKE_VERSION} GREATER_EQUAL 3.25)
37+
add_subdirectory(${eigen_SOURCE_DIR} ${eigen_BINARY_DIR} SYSTEM EXCLUDE_FROM_ALL)
38+
else()
39+
# Emulate the SYSTEM flag introduced in CMake 3.25. Withouth this flag the compiler will
40+
# consider this 3rdparty headers as source code and fail due the -Werror flag.
41+
add_subdirectory(${eigen_SOURCE_DIR} ${eigen_BINARY_DIR} EXCLUDE_FROM_ALL)
42+
get_target_property(eigen_include_dirs eigen INTERFACE_INCLUDE_DIRECTORIES)
43+
set_target_properties(eigen PROPERTIES INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${eigen_include_dirs}")
44+
endif()
45+
endif()
46+
47+

cpp/cmake/eigen.patch

+74
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
commit cf82186416d04ea5df2a397d8fe09dc78d40ca65
2+
Author: Antonio Sánchez <[email protected]>
3+
Date: Sat Mar 5 05:49:45 2022 +0000
4+
5+
Adds new CMake Options for controlling build components.
6+
7+
diff --git a/CMakeLists.txt b/CMakeLists.txt
8+
index de1c23e91..0af36a53a 100644
9+
--- a/CMakeLists.txt
10+
+++ b/CMakeLists.txt
11+
@@ -477,6 +477,9 @@ if(EIGEN_BUILD_TESTING)
12+
add_subdirectory(failtest)
13+
endif()
14+
15+
+include(CMakeDetermineFortranCompiler)
16+
+option(EIGEN_BUILD_BLAS "Toggles the building of the Eigen Blas library" ${CMAKE_Fortran_COMPILER})
17+
+option(EIGEN_BUILD_LAPACK "Toggles the building of the included Eigen LAPACK library" ${CMAKE_Fortran_COMPILER})
18+
if(EIGEN_LEAVE_TEST_IN_ALL_TARGET)
19+
add_subdirectory(blas)
20+
add_subdirectory(lapack)
21+
@@ -611,6 +614,8 @@ set_target_properties (eigen PROPERTIES EXPORT_NAME Eigen)
22+
23+
install (TARGETS eigen EXPORT Eigen3Targets)
24+
25+
+option(EIGEN_BUILD_CMAKE_PACKAGE "Enables the creation of EigenConfig.cmake and related files" ON)
26+
+if(EIGEN_BUILD_CMAKE_PACKAGE)
27+
configure_package_config_file (
28+
${CMAKE_CURRENT_SOURCE_DIR}/cmake/Eigen3Config.cmake.in
29+
${CMAKE_CURRENT_BINARY_DIR}/Eigen3Config.cmake
30+
@@ -655,6 +660,7 @@ install (FILES ${CMAKE_CURRENT_BINARY_DIR}/Eigen3Config.cmake
31+
# Add uninstall target
32+
add_custom_target ( uninstall
33+
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/EigenUninstall.cmake)
34+
+endif()
35+
36+
if (EIGEN_SPLIT_TESTSUITE)
37+
ei_split_testsuite("${EIGEN_SPLIT_TESTSUITE}")
38+
diff --git a/blas/CMakeLists.txt b/blas/CMakeLists.txt
39+
index 8d3cb86dc..c530957fb 100644
40+
--- a/blas/CMakeLists.txt
41+
+++ b/blas/CMakeLists.txt
42+
@@ -1,6 +1,7 @@
43+
44+
project(EigenBlas CXX)
45+
46+
+if(EIGEN_BUILD_BLAS)
47+
include(CheckLanguage)
48+
check_language(Fortran)
49+
if(CMAKE_Fortran_COMPILER)
50+
@@ -59,4 +60,4 @@ if(EIGEN_BUILD_TESTING)
51+
endif()
52+
53+
endif()
54+
-
55+
+endif()
56+
diff --git a/lapack/CMakeLists.txt b/lapack/CMakeLists.txt
57+
index c8ca64001..8d6d75401 100644
58+
--- a/lapack/CMakeLists.txt
59+
+++ b/lapack/CMakeLists.txt
60+
@@ -1,5 +1,7 @@
61+
project(EigenLapack CXX)
62+
63+
+if(EIGEN_BUILD_LAPACK AND EIGEN_BUILD_BLAS)
64+
+
65+
include(CheckLanguage)
66+
check_language(Fortran)
67+
if(CMAKE_Fortran_COMPILER)
68+
@@ -457,3 +459,6 @@ if(EXISTS ${eigen_full_path_to_testing_lapack})
69+
70+
endif()
71+
72+
+elseif(EIGEN_BUILD_LAPACK AND NOT EIGEN_BUILD_BLAS)
73+
+ message(FATAL_ERROR "EIGEN_BUILD_LAPACK requires EIGEN_BUILD_BLAS")
74+
+endif() #EIGEN_BUILD_LAPACK

cpp/patchworkpp/CMakeLists.txt

-3
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,6 @@ project(patchworkpp_src)
33
include(GNUInstallDirs)
44

55
message("Parent project name: " ${PARENT_PROJECT_NAME})
6-
7-
find_package(Eigen3 REQUIRED QUIET)
8-
96
add_library(${TARGET_NAME} STATIC src/patchworkpp.cpp)
107
set_target_properties(${TARGET_NAME} PROPERTIES POSITION_INDEPENDENT_CODE ON)
118

0 commit comments

Comments
 (0)