@@ -27,19 +27,20 @@ IF(POLICY CMP0167)
2727ENDIF ()
2828
2929# List configuration options 
30- SET (OpenMVS_BUILD_TOOLS ON  CACHE  BOOL  "Build example applications" )
31- SET (OpenMVS_BUILD_VIEWER ON  CACHE  BOOL  "Build viewer application" )
32- SET (OpenMVS_USE_OPENMP ON  CACHE  BOOL  "Enable OpenMP library" )
33- SET (OpenMVS_USE_BREAKPAD ON  CACHE  BOOL  "Enable BreakPad library" )
34- SET (OpenMVS_USE_PYTHON ON  CACHE  BOOL  "Enable Python library bindings" )
35- SET (OpenMVS_USE_CERES OFF  CACHE  BOOL  "Enable CERES optimization library" )
36- SET (OpenMVS_USE_CUDA ON  CACHE  BOOL  "Enable CUDA library" )
37- SET (OpenMVS_USE_FAST_FLOAT2INT OFF  CACHE  BOOL  "Use an optimized code to convert real numbers to int" )
38- SET (OpenMVS_USE_FAST_INVSQRT OFF  CACHE  BOOL  "Use an optimized code to compute the inverse square root (slower in fact on modern compilers)" )
39- SET (OpenMVS_USE_FAST_CBRT OFF  CACHE  BOOL  "Use an optimized code to compute the cubic root" )
40- SET (OpenMVS_USE_SSE ON  CACHE  BOOL  "Enable SSE optimizations" )
41- SET (OpenMVS_MAX_CUDA_COMPATIBILITY OFF  CACHE  BOOL  "Build for maximum CUDA device compatibility" )
42- SET (OpenMVS_ENABLE_TESTS ON  CACHE  BOOL  "Enable test code" )
30+ OPTION (OpenMVS_BUILD_TOOLS "Build example applications"  ON )
31+ OPTION (OpenMVS_BUILD_VIEWER "Build viewer application"  ON )
32+ OPTION (OpenMVS_USE_OPENMP "Enable OpenMP library"  ON )
33+ OPTION (OpenMVS_USE_BREAKPAD "Enable BreakPad library"  ON )
34+ OPTION (OpenMVS_USE_PYTHON "Enable Python library bindings"  ON )
35+ OPTION (OpenMVS_USE_CERES "Enable CERES optimization library"  OFF )
36+ OPTION (OpenMVS_USE_CUDA "Enable CUDA library"  ON )
37+ OPTION (OpenMVS_USE_FAST_FLOAT2INT "Use an optimized code to convert real numbers to int"  OFF )
38+ OPTION (OpenMVS_USE_FAST_INVSQRT "Use an optimized code to compute the inverse square root (slower in fact on modern compilers)"  OFF )
39+ OPTION (OpenMVS_USE_FAST_CBRT "Use an optimized code to compute the cubic root"  OFF )
40+ OPTION (OpenMVS_USE_SSE "Enable SSE optimizations"  ON )
41+ OPTION (OpenMVS_MAX_CUDA_COMPATIBILITY "Build for maximum CUDA device compatibility"  OFF )
42+ OPTION (OpenMVS_ENABLE_IPO "Whether to enable interprocedural optimization"  ON )
43+ OPTION (OpenMVS_ENABLE_TESTS "Enable test code"  ON )
4344
4445# Disable CUDA on MacOS 
4546IF (APPLE )
@@ -94,6 +95,11 @@ ELSE()
9495	MESSAGE (STATUS  "Build configuration: ${CMAKE_GENERATOR}  - ${CMAKE_BUILD_TYPE} " )
9596ENDIF ()
9697
98+ # Build position-independent code, so that shared libraries can link against OpenMVS static libraries. 
99+ SET (CMAKE_POSITION_INDEPENDENT_CODE  ON )
100+ # Set global property to avoid cyclic dependencies. 
101+ SET_PROPERTY (GLOBAL  PROPERTY GLOBAL_DEPENDS_NO_CYCLES  ON )
102+ 
97103# Define helper functions and macros. 
98104INCLUDE (build /Utils.cmake)
99105
@@ -110,20 +116,30 @@ SET(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/build/Modules)
110116SET (OpenMVS_EXTRA_INCLUDES "" )
111117SET (OpenMVS_EXTRA_LIBS "" )
112118
119+ if (OpenMVS_ENABLE_IPO)
120+ 	INCLUDE (CheckIPOSupported)
121+ 	check_ipo_supported(RESULT IPO_SUPPORTED OUTPUT  IPO_ERROR)
122+ 	if (IPO_SUPPORTED)
123+ 		SET_PROPERTY (GLOBAL  PROPERTY CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE )
124+ 		MESSAGE (STATUS  "Interprocedural optimization enabled" )
125+ 	else ()
126+ 		MESSAGE (WARNING "Interprocedural optimization is not supported: ${IPO_ERROR} " )
127+ 	endif ()
128+ endif ()
129+ 
113130if (OpenMVS_USE_OPENMP)
114- 	SET (OpenMP_LIBS "" )
115- 	FIND_PACKAGE (OpenMP)
131+ 	FIND_PACKAGE (OpenMP QUIET )
116132	if (OPENMP_FOUND)
117133		SET (CMAKE_CXX_FLAGS  "${CMAKE_CXX_FLAGS}  ${OpenMP_CXX_FLAGS} " )
118134		SET (_USE_OPENMP TRUE )
119135		# cmake only check for separate OpenMP library on AppleClang 7+ 
120136		# https://github.com/Kitware/CMake/blob/42212f7539040139ecec092547b7d58ef12a4d72/Modules/FindOpenMP.cmake#L252 
121137		if (CMAKE_CXX_COMPILER_ID MATCHES  "AppleClang"  AND  (NOT  CMAKE_CXX_COMPILER_VERSION VERSION_LESS  "7.0" ))
122- 			SET (OpenMP_LIBS ${OpenMP_libomp_LIBRARY} )
123- 			LIST (APPEND  OpenMVS_EXTRA_LIBS ${OpenMP_LIBS} )
138+ 			LIST (APPEND  OpenMVS_EXTRA_LIBS ${OpenMP_libomp_LIBRARY} )
124139		endif ()
140+ 		MESSAGE (STATUS  "Found OpenMP "  ${OpenMP_VERSION}  " "  ${OpenMP_LIBRARY} )
125141	else ()
126- 		MESSAGE ("--  Can't find OpenMP. Continuing without it." )
142+ 		MESSAGE (STATUS   " Can't find OpenMP. Continuing without it." )
127143	endif ()
128144endif ()
129145
@@ -134,97 +150,85 @@ if(OpenMVS_USE_CUDA)
134150		# Finding CUDA fails on some systems if paths to nvcc / cuda library are not set; ex. on linux: 
135151		# export PATH="/usr/local/cuda/bin:$PATH" 
136152		# export LD_LIBRARY_PATH="/usr/local/cuda/lib64:${LD_LIBRARY_PATH}" 
137- 		SET (CUDA_FOUND TRUE )
138153		if (NOT  DEFINED  CMAKE_CUDA_ARCHITECTURES)
139154			SET (CMAKE_CUDA_ARCHITECTURES "native" )
140155		endif ()
141156		ENABLE_LANGUAGE (CUDA)
142- 		# not required, but forced by OpenCV old support for CUDA 
143- 		FIND_PACKAGE (CUDA REQUIRED)
144- 		# CUDA-11.x can not be compiled using C++14 standard on Windows 
145- 		string (REGEX  MATCH "^[0-9]+"  CUDA_VERSION_MAJOR ${CMAKE_CUDA_COMPILER_VERSION} )
146- 		string (REGEX  REPLACE "([0-9]+)\\ .([0-9]+).*"  "\\ 2"  CUDA_VERSION_MINOR ${CMAKE_CUDA_COMPILER_VERSION} )
147- 		if (${CUDA_VERSION_MAJOR}  GREATER  10)
148- 			SET (CMAKE_CUDA_STANDARD 17)
149- 		endif ()
150- 		EXECUTE_PROCESS (COMMAND  "${CMAKE_CUDA_COMPILER} "  --list-gpu-arch 
151- 				OUTPUT_VARIABLE  LIST_GPU_ARCH 
157+ 		SET (CUDA_FOUND TRUE )
158+ 		SET (CMAKE_CUDA_STANDARD 17)
159+ 		SET (CMAKE_CUDA_STANDARD_REQUIRED ON )
160+ 		FIND_PACKAGE (CUDAToolkit REQUIRED)
161+ 		if (OpenMVS_MAX_CUDA_COMPATIBILITY)
162+ 			EXECUTE_PROCESS (COMMAND  "${CMAKE_CUDA_COMPILER} "  --list-gpu-arch
163+ 				OUTPUT_VARIABLE  LIST_GPU_ARCH
152164				ERROR_QUIET)
153- 		if (NOT  LIST_GPU_ARCH AND  OpenMVS_MAX_CUDA_COMPATIBILITY)
154- 			message (WARNING "Cannot compile for max CUDA compatibility, nvcc does not support --list-gpu-arch" )
155- 			SET (OpenMVS_MAX_CUDA_COMPATIBILITY OFF )
156- 		endif ()
157- 		if (NOT  OpenMVS_MAX_CUDA_COMPATIBILITY)
158- 			if (NOT  DEFINED  CMAKE_CUDA_ARCHITECTURES)
159- 				SET (CMAKE_CUDA_ARCHITECTURES 75)
165+ 			if (NOT  LIST_GPU_ARCH)
166+ 				MESSAGE (WARNING "Cannot compile for max CUDA compatibility, nvcc does not support --list-gpu-arch" )
167+ 				SET (OpenMVS_MAX_CUDA_COMPATIBILITY OFF )
160168			endif ()
161- 		else ()
169+ 		endif ()
170+ 		if (OpenMVS_MAX_CUDA_COMPATIBILITY)
162171			# Build for maximum compatibility 
163172			# https://arnon.dk/matching-sm-architectures-arch-and-gencode-for-various-nvidia-cards/ 
164- 
173+ 			UNSET (CMAKE_CUDA_ARCHITECTURES) 
165174			# Extract list of arch and gencodes 
166175			STRING (REPLACE "\r "  ""  LIST_GPU_ARCH ${LIST_GPU_ARCH} )
167176			STRING (REPLACE "\n "  ";"  LIST_GPU_ARCH ${LIST_GPU_ARCH} )
168- 
169- 			EXECUTE_PROCESS (COMMAND  "${CMAKE_CUDA_COMPILER} "  --list-gpu-code 
170- 				OUTPUT_VARIABLE  LIST_GPU_CODE 
177+ 			EXECUTE_PROCESS (COMMAND  "${CMAKE_CUDA_COMPILER} "  --list-gpu-code
178+ 				OUTPUT_VARIABLE  LIST_GPU_CODE
171179				ERROR_QUIET)
172180			STRING (REPLACE "\r "  ""  LIST_GPU_CODE ${LIST_GPU_CODE} )
173181			STRING (REPLACE "\n "  ";"  LIST_GPU_CODE ${LIST_GPU_CODE} )
174- 
175182			LIST (GET  LIST_GPU_CODE 0 TARGET_GPU_CODE)
176183			SET (CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS}  -arch=${TARGET_GPU_CODE} " )
177- 
178184			SET (IDX 0)
179185			foreach (GPU_ARCH ${LIST_GPU_ARCH} )
180186				LIST (GET  LIST_GPU_CODE ${IDX}  GPU_CODE)
181187				SET (CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS}  -gencode=arch=${GPU_ARCH} ,code=${GPU_CODE} " )
182188				MATH (EXPR  IDX "${IDX} +1" )
183189			endforeach ()
184- 			MESSAGE ("--  Set CUDA flags: "  ${CMAKE_CUDA_FLAGS} )
190+ 			MESSAGE (STATUS   " Set CUDA flags: "  ${CMAKE_CUDA_FLAGS} )
185191		endif ()
192+ 		SET (CMAKE_CUDA_SEPARABLE_COMPILATION ON )
193+ 		SET (CMAKE_CUDA_RESOLVE_DEVICE_SYMBOLS ON )
186194		SET (CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS}  --expt-relaxed-constexpr" )
187- 		INCLUDE_DIRECTORIES (${CUDA_INCLUDE_DIRS} )
195+ 		LIST (APPEND  OpenMVS_EXTRA_INCLUDES ${CUDAToolkit_INCLUDE_DIRS} )
196+ 		LIST (APPEND  OpenMVS_EXTRA_LIBS ${CUDAToolkit_LIBRARIES}  cuda cudart curand)
188197		SET (_USE_CUDA TRUE )
189- 		MESSAGE ("--  Found CUDA: "  ${CMAKE_CUDA_COMPILER_VERSION}  " with GPU arch: "  ${CMAKE_CUDA_ARCHITECTURES} )
198+ 		MESSAGE (STATUS   " Found CUDA: "  ${CMAKE_CUDA_COMPILER_VERSION}  " with GPU arch: "  ${CMAKE_CUDA_ARCHITECTURES} )
190199	else ()
191- 		SET (CUDA_CUDA_LIBRARY "" )
192- 		MESSAGE ("-- Can't find CUDA. Continuing without it." )
200+ 		MESSAGE (STATUS  "Can't find CUDA. Continuing without it." )
193201	endif ()
194- else ()
195- 	SET (CUDA_CUDA_LIBRARY "" )
196202endif ()
197203
198204if (OpenMVS_USE_BREAKPAD)
199- 	FIND_PACKAGE (BREAKPAD)
205+ 	FIND_PACKAGE (BREAKPAD  QUIET )
200206	if (BREAKPAD_FOUND)
201207		INCLUDE_DIRECTORIES (${BREAKPAD_INCLUDE_DIRS} )
202208		ADD_DEFINITIONS (${BREAKPAD_DEFINITIONS} )
203209		SET (_USE_BREAKPAD TRUE )
204210		LIST (APPEND  OpenMVS_EXTRA_LIBS ${BREAKPAD_LIBS} )
205211	else ()
206- 		MESSAGE ("--  Can't find BreakPad. Continuing without it." )
212+ 		MESSAGE (STATUS   " Can't find BreakPad. Continuing without it." )
207213	endif ()
208214endif ()
209215
210216SET (Boost_EXTRA_COMPONENTS "" )
211217if (OpenMVS_USE_PYTHON)
212218	FIND_PACKAGE (Python3 COMPONENTS Interpreter Development REQUIRED)
213219	if (Python3_FOUND)
214- 		INCLUDE_DIRECTORIES (${Python3_INCLUDE_DIRS} )
215220		LIST (APPEND  OpenMVS_EXTRA_INCLUDES ${Python3_INCLUDE_DIRS} )
216221		LIST (APPEND  OpenMVS_EXTRA_LIBS ${Python3_LIBRARIES} )
217222		LIST (APPEND  Boost_EXTRA_COMPONENTS python${Python3_VERSION_MAJOR}${Python3_VERSION_MINOR} )
218223		MESSAGE (STATUS  "Python ${Python3_VERSION_MAJOR} .${Python3_VERSION_MINOR}  found (include: ${Python3_INCLUDE_DIRS} )" )
219224	else ()
220- 		MESSAGE ("--  Can't find Python. Continuing without it." )
225+ 		MESSAGE (STATUS   " Can't find Python. Continuing without it." )
221226	endif ()
222227endif ()
223228
224229FIND_PACKAGE (Boost REQUIRED COMPONENTS iostreams program_options system  serialization OPTIONAL_COMPONENTS ${Boost_EXTRA_COMPONENTS} )
225230if (Boost_FOUND)
226231	LIST (APPEND  OpenMVS_EXTRA_INCLUDES ${Boost_INCLUDE_DIRS} )
227- 	INCLUDE_DIRECTORIES (${Boost_INCLUDE_DIRS} )
228232	ADD_DEFINITIONS (${Boost_DEFINITIONS} )
229233	LINK_DIRECTORIES (${Boost_LIBRARY_DIRS} )
230234	SET (_USE_BOOST TRUE )
@@ -236,7 +240,6 @@ endif()
236240FIND_PACKAGE (Eigen3 3.4 REQUIRED)
237241if (EIGEN3_FOUND)
238242	LIST (APPEND  OpenMVS_EXTRA_INCLUDES ${EIGEN3_INCLUDE_DIR} )
239- 	INCLUDE_DIRECTORIES (${EIGEN3_INCLUDE_DIR} )
240243	ADD_DEFINITIONS (${EIGEN3_DEFINITIONS} )
241244	SET (_USE_EIGEN TRUE )
242245	MESSAGE (STATUS  "Eigen ${EIGEN3_VERSION}  found (include: ${EIGEN3_INCLUDE_DIR} )" )
@@ -245,12 +248,11 @@ endif()
245248FIND_PACKAGE (OpenCV REQUIRED)
246249if (OpenCV_FOUND)
247250	LIST (APPEND  OpenMVS_EXTRA_INCLUDES ${OpenCV_INCLUDE_DIRS} )
248- 	INCLUDE_DIRECTORIES (${OpenCV_INCLUDE_DIRS} )
249251	ADD_DEFINITIONS (${OpenCV_DEFINITIONS} )
250252	SET (_USE_OPENCV TRUE )
251253	MESSAGE (STATUS  "OpenCV ${OpenCV_VERSION}  found (include: ${OpenCV_INCLUDE_DIRS} )" )
252254else ()
253- 	MESSAGE ("--  Can't find OpenCV. Please specify OpenCV directory using OpenCV_DIR variable" )
255+ 	MESSAGE (STATUS   " Can't find OpenCV. Please specify OpenCV directory using OpenCV_DIR variable" )
254256endif ()
255257
256258LIST (REMOVE_DUPLICATES  OpenMVS_EXTRA_INCLUDES)
@@ -273,8 +275,9 @@ if(OpenMVS_USE_CERES)
273275	SET (_USE_CERES TRUE )
274276endif ()
275277
276- INCLUDE_DIRECTORIES ("${OpenMVS_SOURCE_DIR} " )
277- INCLUDE_DIRECTORIES ("${CMAKE_BINARY_DIR} " )
278+ INCLUDE_DIRECTORIES (${OpenMVS_EXTRA_INCLUDES} )
279+ INCLUDE_DIRECTORIES (${OpenMVS_SOURCE_DIR} )
280+ INCLUDE_DIRECTORIES (${CMAKE_BINARY_DIR} )
278281
279282# Add modules 
280283ADD_SUBDIRECTORY (libs)
0 commit comments