Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use Conan for all third-party dependencies, fix some build issues #73

Open
wants to merge 13 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
229 changes: 61 additions & 168 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
cmake_minimum_required(VERSION 3.6...3.14)
cmake_minimum_required(VERSION 3.18)
include(cmake/third_party.cmake)
project(libvis LANGUAGES C CXX)


# Enable C++14 globally
set(CMAKE_CXX_STANDARD 14)
# Enable C++17 globally
set(CMAKE_CXX_STANDARD 17)

# Support IDEs: https://cliutils.gitlab.io/modern-cmake/chapters/features/ides.html
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
Expand All @@ -18,9 +18,6 @@ if(MSVC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP")
endif()

# Make CMake find the Find<Package>.cmake files in the cmake subdirectory.
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake")

include(CheckLanguage)


Expand All @@ -33,13 +30,16 @@ include(CheckLanguage)
# Common settings are either the 'native' arch for which the binary will
# be known to run on exclusively, or a broader set of PTX architectures
# in case the binary is intended for distribution.
if(NOT DEFINED CMAKE_CUDA_ARCHITECTURES)
set(CMAKE_CUDA_ARCHITECTURES native)
endif()
check_language(CUDA)
if (CMAKE_CUDA_COMPILER)
enable_language(CUDA)

# Enable C++14 globally for CUDA code
if(NOT DEFINED CMAKE_CUDA_STANDARD)
set(CMAKE_CUDA_STANDARD 14)
set(CMAKE_CUDA_STANDARD 17)
set(CMAKE_CUDA_STANDARD_REQUIRED ON)
endif()

Expand All @@ -66,67 +66,21 @@ endif()
# Cross-platform threading. See:
# https://cmake.org/cmake/help/latest/module/FindThreads.html
find_package(Threads REQUIRED)

find_package(OpenGL REQUIRED)

# Eigen (external)
find_package(Eigen3 REQUIRED)
find_package(Boost REQUIRED COMPONENTS filesystem)
find_package(loguru REQUIRED)
find_package(GLEW REQUIRED)
find_package(PNG REQUIRED)
find_package(Sophus REQUIRED)
find_package(RapidJSON REQUIRED)

# Boost (external)
find_package(Boost COMPONENTS serialization filesystem system REQUIRED)

# Loguru (packaged)
add_library(loguru SHARED
libvis/third_party/loguru/loguru.cpp
)
set_property(TARGET loguru PROPERTY FOLDER "libvis/third_party")
target_include_directories(loguru PUBLIC
libvis/third_party/loguru/
)
set_target_properties(loguru PROPERTIES
POSITION_INDEPENDENT_CODE ON
)
target_compile_definitions(loguru PRIVATE
LOGURU_WITH_STREAMS
)
if(MSVC)
set(LOGURU_DLL_EXPORT "__declspec(dllexport)")
#set(LOGURU_DLL_IMPORT "__declspec(dllimport)")
endif()
target_compile_definitions(loguru PRIVATE
LOGURU_EXPORT=${LOGURU_DLL_EXPORT}
)
target_link_libraries(loguru
Threads::Threads
${CMAKE_DL_LIBS}
)

# GTest (packaged)
add_subdirectory(libvis/third_party/gtest)
set_target_properties(gtest gtest_main PROPERTIES FOLDER "libvis/third_party")

if(MSVC)
if (MSVC_VERSION GREATER_EQUAL 1900)
target_compile_definitions(gtest PUBLIC _SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING)
target_compile_definitions(gtest_main PUBLIC _SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING)
endif()
endif()
find_package(GTest REQUIRED)
enable_testing()

# libpng (packaged)
add_subdirectory(libvis/third_party/libpng)
set_target_properties(png png_static genfiles genprebuilt gensym genvers symbol-check PROPERTIES FOLDER "libvis/third_party/png")

# GLEW (external, required)
find_package(GLEW REQUIRED)

# Vulkan (external, optional)
set(VULKAN_PATH "" CACHE PATH "Set this to the path of the Vulkan SDK installation (the directory containing include and lib) if installed locally, otherwise leave this empty.")
if(NOT (VULKAN_PATH STREQUAL ""))
set(VULKAN_FOUND TRUE)
else()
set(VULKAN_FOUND FALSE)
endif()
find_package(VulkanLoader REQUIRED)
find_program(GLSLANG_VALIDATOR glslangValidator REQUIRED)
set(VULKAN_FOUND TRUE)

# Qt5 (external, required)
# TODO: Qt should be an optional dependency but is required currently.
Expand All @@ -139,46 +93,34 @@ set(CMAKE_AUTOMOC ON)
# Instruct CMake to run rcc (resource compiler) automatically when needed.
set(CMAKE_AUTORCC ON)

find_package(Qt5 5.8 REQUIRED COMPONENTS Core OpenGL Widgets)

if (UNIX AND NOT APPLE)
find_package(Qt5X11Extras REQUIRED)
endif()
if (TARGET Qt5::Core AND UNIX)
# HACK, see: https://gitlab.kitware.com/cmake/cmake/issues/16915
get_property( core_options TARGET Qt5::Core PROPERTY INTERFACE_COMPILE_OPTIONS )
string( REPLACE "-fPIC" "" new_core_options "${core_options}" )
set_property( TARGET Qt5::Core PROPERTY INTERFACE_COMPILE_OPTIONS ${new_core_options} )
set_property( TARGET Qt5::Core PROPERTY INTERFACE_POSITION_INDEPENDENT_CODE "ON" )
set( CMAKE_CXX_COMPILE_OPTIONS_PIE "-fPIC" )
endif()
find_package(Qt5 5.8 REQUIRED COMPONENTS Core OpenGL Widgets X11Extras)

# Settings.
if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUXX)
set(LIBVIS_WARNING_OPTIONS "$<$<COMPILE_LANGUAGE:CXX>:-Wall>")
set(LIBVIS_WARNING_OPTIONS "${LIBVIS_WARNING_OPTIONS};$<$<COMPILE_LANGUAGE:CXX>:-Wextra>")
set(LIBVIS_WARNING_OPTIONS "${LIBVIS_WARNING_OPTIONS};$<$<COMPILE_LANGUAGE:CXX>:-O2>")
set(LIBVIS_WARNING_OPTIONS "${LIBVIS_WARNING_OPTIONS};$<$<COMPILE_LANGUAGE:CXX>:-msse2>")
set(LIBVIS_WARNING_OPTIONS "${LIBVIS_WARNING_OPTIONS};$<$<COMPILE_LANGUAGE:CXX>:-msse3>")
list(APPEND LIBVIS_WARNING_OPTIONS "$<$<COMPILE_LANGUAGE:CXX>:-Wextra>")
list(APPEND LIBVIS_WARNING_OPTIONS "$<$<COMPILE_LANGUAGE:CXX>:-O2>")
list(APPEND LIBVIS_WARNING_OPTIONS "$<$<COMPILE_LANGUAGE:CXX>:-msse2>")
list(APPEND LIBVIS_WARNING_OPTIONS "$<$<COMPILE_LANGUAGE:CXX>:-msse3>")

# TODO: It seems gcc cannot disable this locally, therefore added it here as a
# workaround.
set(LIBVIS_WARNING_OPTIONS "${LIBVIS_WARNING_OPTIONS};$<$<COMPILE_LANGUAGE:CXX>:-Wno-unknown-pragmas>")
list(APPEND LIBVIS_WARNING_OPTIONS "$<$<COMPILE_LANGUAGE:CXX>:-Wno-unknown-pragmas>")

# NOTE: Disabled this since it triggered in a lot of places, including external headers, creating a lot of warning spam.
set(LIBVIS_WARNING_OPTIONS "${LIBVIS_WARNING_OPTIONS};$<$<COMPILE_LANGUAGE:CXX>:-Wno-sign-compare>")
set(LIBVIS_WARNING_OPTIONS "${LIBVIS_WARNING_OPTIONS};$<$<COMPILE_LANGUAGE:CXX>:-Wno-missing-field-initializers>")
list(APPEND LIBVIS_WARNING_OPTIONS "$<$<COMPILE_LANGUAGE:CXX>:-Wno-sign-compare>")
list(APPEND LIBVIS_WARNING_OPTIONS "$<$<COMPILE_LANGUAGE:CXX>:-Wno-missing-field-initializers>")
elseif(MSVC)
# set(LIBVIS_WARNING_OPTIONS "$<$<COMPILE_LANGUAGE:CXX>:/O2")
set(LIBVIS_WARNING_OPTIONS "${LIBVIS_WARNING_OPTIONS};$<$<COMPILE_LANGUAGE:CXX>:/MP >")
set(LIBVIS_WARNING_OPTIONS "${LIBVIS_WARNING_OPTIONS};$<$<COMPILE_LANGUAGE:CXX>:/W4>")
set(LIBVIS_WARNING_OPTIONS "${LIBVIS_WARNING_OPTIONS};$<$<COMPILE_LANGUAGE:CXX>:/wd4068 >")
set(LIBVIS_WARNING_OPTIONS "${LIBVIS_WARNING_OPTIONS};$<$<COMPILE_LANGUAGE:CXX>:/wd4127 >") # https://docs.microsoft.com/en-us/cpp/error-messages/compiler-warnings/compiler-warning-level-4-c4127?view=vs-2019
list(APPEND LIBVIS_WARNING_OPTIONS "$<$<COMPILE_LANGUAGE:CXX>:/MP >")
list(APPEND LIBVIS_WARNING_OPTIONS "$<$<COMPILE_LANGUAGE:CXX>:/W4>")
list(APPEND LIBVIS_WARNING_OPTIONS "$<$<COMPILE_LANGUAGE:CXX>:/wd4068 >")
list(APPEND LIBVIS_WARNING_OPTIONS "$<$<COMPILE_LANGUAGE:CXX>:/wd4127 >") # https://docs.microsoft.com/en-us/cpp/error-messages/compiler-warnings/compiler-warning-level-4-c4127?view=vs-2019

# NOTE: Disabled this since it triggered in a lot of places, including external headers, creating a lot of warning spam.
set(LIBVIS_WARNING_OPTIONS "${LIBVIS_WARNING_OPTIONS};$<$<COMPILE_LANGUAGE:CXX>:/wd4244 >")
set(LIBVIS_WARNING_OPTIONS "${LIBVIS_WARNING_OPTIONS};$<$<COMPILE_LANGUAGE:CXX>:/wd4267 >")
set(LIBVIS_WARNING_OPTIONS "${LIBVIS_WARNING_OPTIONS};$<$<COMPILE_LANGUAGE:CXX>:/wd4389 >")
list(APPEND LIBVIS_WARNING_OPTIONS "$<$<COMPILE_LANGUAGE:CXX>:/wd4244 >")
list(APPEND LIBVIS_WARNING_OPTIONS "$<$<COMPILE_LANGUAGE:CXX>:/wd4267 >")
list(APPEND LIBVIS_WARNING_OPTIONS "$<$<COMPILE_LANGUAGE:CXX>:/wd4389 >")
endif()


Expand All @@ -190,18 +132,14 @@ add_executable(bin2c
)
set_property(TARGET bin2c PROPERTY FOLDER "libvis")

target_include_directories(bin2c PRIVATE
${Boost_INCLUDE_DIR}
)

target_compile_options(bin2c PRIVATE
"${LIBVIS_WARNING_OPTIONS}"
)
target_link_libraries(bin2c
${Boost_LIBRARIES}
Boost::headers
Boost::filesystem
)


################################################################################
# Function for generating headers with SPIR-V bytecode from GLSL code.

Expand All @@ -217,15 +155,15 @@ function(add_vulkan_shader TARGETNAME INPUT_FILEPATH _GENERATED_HEADERS)
# Vertex shader.
add_custom_command (
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${INPUT_FILENAME}.vert.h
COMMAND glslangValidator -V -S vert -o ${CMAKE_CURRENT_BINARY_DIR}/${INPUT_FILENAME}.vert ${CMAKE_CURRENT_SOURCE_DIR}/${INPUT_FILEPATH}.vert
COMMAND ${GLSLANG_VALIDATOR} -V -S vert -o ${CMAKE_CURRENT_BINARY_DIR}/${INPUT_FILENAME}.vert ${CMAKE_CURRENT_SOURCE_DIR}/${INPUT_FILEPATH}.vert
COMMAND bin2c -n vis -H ${CMAKE_CURRENT_SOURCE_DIR}/libvis/src/libvis/shaders/license_header.h ${CMAKE_CURRENT_BINARY_DIR}/${INPUT_FILENAME}.vert
DEPENDS bin2c ${CMAKE_CURRENT_SOURCE_DIR}/${INPUT_FILEPATH}.vert
)

# Fragment shader.
add_custom_command (
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${INPUT_FILENAME}.frag.h
COMMAND glslangValidator -V -S frag -o ${CMAKE_CURRENT_BINARY_DIR}/${INPUT_FILENAME}.frag ${CMAKE_CURRENT_SOURCE_DIR}/${INPUT_FILEPATH}.frag
COMMAND ${GLSLANG_VALIDATOR} -V -S frag -o ${CMAKE_CURRENT_BINARY_DIR}/${INPUT_FILENAME}.frag ${CMAKE_CURRENT_SOURCE_DIR}/${INPUT_FILEPATH}.frag
COMMAND bin2c -n vis -H ${CMAKE_CURRENT_SOURCE_DIR}/libvis/src/libvis/shaders/license_header.h ${CMAKE_CURRENT_BINARY_DIR}/${INPUT_FILENAME}.frag
DEPENDS bin2c ${CMAKE_CURRENT_SOURCE_DIR}/${INPUT_FILEPATH}.frag
)
Expand Down Expand Up @@ -343,64 +281,40 @@ target_compile_options(libvis PRIVATE
"${LIBVIS_WARNING_OPTIONS}"
$<$<COMPILE_LANGUAGE:CXX>:-march=native>
)

if (VULKAN_FOUND)
target_compile_options(libvis PUBLIC -DLIBVIS_HAVE_VULKAN)
target_include_directories(libvis PRIVATE "${VULKAN_PATH}/include")
target_link_directories(libvis PRIVATE "${VULKAN_PATH}/lib")
endif()

if(Qt5Widgets_FOUND)
target_compile_options(libvis PUBLIC -DLIBVIS_HAVE_QT)
endif()

if (CMAKE_CUDA_COMPILER)
target_compile_options(libvis PUBLIC -DLIBVIS_HAVE_CUDA) # TODO: is this used anywhere?
endif()
target_compile_options(libvis PUBLIC -DLIBVIS_HAVE_QT)
target_compile_options(libvis PUBLIC -DLIBVIS_HAVE_CUDA)

target_include_directories(libvis
PUBLIC
${EIGEN3_INCLUDE_DIR}
${OpenCV_INCLUDE_DIRS}
libvis/third_party/sophus
./libvis/src
PRIVATE
${PCL_INCLUDE_DIRS}
${Boost_INCLUDE_DIR}
${gtest_SOURCE_DIR}/include
${gtest_SOURCE_DIR}
libvis/third_party
${GLEW_INCLUDE_DIRS}
${CMAKE_CURRENT_BINARY_DIR}
${Qt5Core_INCLUDE_DIRS}
${Qt5Opengl_INCLUDE_DIRS}
)
target_link_directories(libvis PRIVATE
${PCL_LIBRARY_DIRS}
)
# Using the static version of libpng hopefully ensures that we won't get a
# totally outdated version at runtime, resulting in an error like:
# libpng warning: Application was compiled with png.h from libpng-1.6.27
# libpng warning: Application is running with png.c from libpng-1.2.50
# libpng error: Incompatible libpng version in application and library
# TODO: However, it does not seem to work together with Qt
target_link_libraries(libvis
PUBLIC
loguru
${CUDA_cusolver_LIBRARY} # Only for GPU path in lm_optimizer
${Qt5Widgets_LIBRARIES}
${Qt5Opengl_LIBRARIES}
${Qt5Core_LIBRARIES}
CUDA::cusolver
Eigen3::Eigen
loguru::loguru
Qt5::Core
Qt5::OpenGL
Qt5::Widgets
rapidjson
Sophus::Sophus
PRIVATE
${Boost_LIBRARIES}
${GLEW_LIBRARIES}
${OPENGL_LIBRARY}
${Qt5X11Extras_LIBRARIES}
png #_static
Boost::headers
GLEW::GLEW
OpenGL::GL
PNG::PNG
Qt5::X11Extras
Threads::Threads
)
if(VULKAN_FOUND)
target_link_libraries(libvis PRIVATE
vulkan
Vulkan::Loader
)
endif()

Expand All @@ -413,23 +327,18 @@ add_library(libvis_external_io SHARED
libvis/src/libvis/external_io/colmap_model.h
libvis/src/libvis/external_io/meshlab_project.cc
libvis/src/libvis/external_io/meshlab_project.h

libvis/third_party/tinyxml2/tinyxml2.cpp
)
find_package(tinyxml2 REQUIRED CONFIG)
target_link_libraries(libvis_external_io PUBLIC tinyxml2::tinyxml2)
set_property(TARGET libvis_external_io PROPERTY FOLDER "libvis")
target_compile_options(libvis_external_io PRIVATE
"${LIBVIS_WARNING_OPTIONS}"
$<$<COMPILE_LANGUAGE:CXX>:-march=native>
)
target_link_libraries(libvis_external_io PUBLIC
${Boost_LIBRARIES}
Boost::headers
libvis
)
target_include_directories(libvis_external_io PUBLIC
${Boost_INCLUDE_DIR}
libvis/third_party/
)


# libvis optional library: libvis_cuda.
# Contains CUDA functionality, which is only useful with NVIDIA graphics cards.
Expand Down Expand Up @@ -463,10 +372,6 @@ if (CMAKE_CUDA_COMPILER)
libvis/src/libvis/cuda/pixel_corner_projector.h
)
set_property(TARGET libvis_cuda PROPERTY FOLDER "libvis")
target_include_directories(libvis_cuda PUBLIC
${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES}
${OpenCV_INCLUDE_DIRS}
)
target_compile_options(libvis_cuda PRIVATE
"${LIBVIS_WARNING_OPTIONS}"
$<$<COMPILE_LANGUAGE:CXX>:-march=native>
Expand All @@ -490,17 +395,11 @@ if (CMAKE_CUDA_COMPILER)
libvis/src/libvis/cuda/test/main.cc
)
target_link_libraries(libvis_cuda_test PRIVATE
gtest_main
GTest::gtest_main
Threads::Threads
libvis_cuda
CUDA::cublas # TODO: currently required because of lm_optimizer.h. That should not be necessary.
)
target_include_directories(libvis_cuda_test PRIVATE
${gtest_SOURCE_DIR}/include
#${gtest_SOURCE_DIR}
${OpenCV_INCLUDE_DIRS}
${GLEW_INCLUDE_DIRS}
${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES} # TODO: currently required because of lm_optimizer.h. That should not be necessary.
GLEW::GLEW
)
add_test(libvis_cuda_test
libvis_cuda_test
Expand Down Expand Up @@ -531,17 +430,11 @@ add_executable(libvis_test
)
set_property(TARGET libvis_test PROPERTY FOLDER "libvis")
target_link_libraries(libvis_test PRIVATE
gtest
GTest::gtest
Threads::Threads
libvis
CUDA::cublas # TODO: currently required because of lm_optimizer.h. That should not be necessary.
)
target_include_directories(libvis_test PRIVATE
${gtest_SOURCE_DIR}/include
#${gtest_SOURCE_DIR}
${OpenCV_INCLUDE_DIRS}
${GLEW_INCLUDE_DIRS}
${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES} # TODO: currently required because of lm_optimizer.h. That should not be necessary.
GLEW::GLEW
)
add_test(libvis_test
libvis_test
Expand Down
Loading