Skip to content

Commit 3d9491b

Browse files
committed
Initial commit of current code
0 parents  commit 3d9491b

44 files changed

Lines changed: 32044 additions & 0 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

CMakeLists.txt

Lines changed: 267 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,267 @@
1+
cmake_minimum_required(VERSION 3.15.0)
2+
3+
set(PROJECT "DualAnalysisPlugin")
4+
PROJECT(${PROJECT})
5+
6+
include(FetchContent)
7+
FetchContent_Declare(cmakesupport
8+
GIT_REPOSITORY https://github.com/ManiVaultStudio/github-actions
9+
GIT_TAG main
10+
GIT_SHALLOW TRUE
11+
SOURCE_SUBDIR CMakeSupport
12+
)
13+
FetchContent_MakeAvailable(cmakesupport)
14+
15+
# -----------------------------------------------------------------------------
16+
# User options
17+
# -----------------------------------------------------------------------------
18+
option(USE_ARTIFACTORY_LIBS "Use the prebuilt libraries from artifactory" ON)
19+
option(ENABLE_AVX "Enable AVX support" OFF)
20+
option(MV_UNITY_BUILD "Combine target source files into batches for faster compilation" OFF)
21+
set(OPTIMIZATION_LEVEL "2" CACHE STRING "Optimization level for all targets in release builds, e.g. 0, 1, 2")
22+
23+
# -----------------------------------------------------------------------------
24+
# CMake options
25+
# -----------------------------------------------------------------------------
26+
set(VERBOSE TRUE)
27+
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
28+
29+
set(CMAKE_AUTOMOC ON)
30+
set(CMAKE_AUTORCC ON)
31+
set(CMAKE_AUTOUIC ON)
32+
33+
# macros for linking both prebuilt artifactory libraries and locally built ones
34+
include(CMakeLinkUtilities)
35+
36+
# Test hardware avx capabilities
37+
include(CMakeSetOptimizationAndAVX)
38+
39+
include(InstallArtifactoryPackage)
40+
41+
if(MSVC)
42+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /DWIN32 /EHsc /MP /permissive- /Zc:__cplusplus")
43+
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MDd")
44+
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MD")
45+
endif(MSVC)
46+
47+
# -----------------------------------------------------------------------------
48+
# Install dependency libraries
49+
# -----------------------------------------------------------------------------
50+
51+
set(LIBRARY_INSTALL_DIR ${PROJECT_BINARY_DIR})
52+
message(status "FetchContent: ${cmakesupport_SOURCE_DIR} ${cmakesupport_BINARY_DIR}")
53+
include("${cmakesupport_SOURCE_DIR}/CMakeSupport/InstallArtifactoryPackage.cmake")
54+
if (USE_ARTIFACTORY_LIBS AND NOT DUAL_ANALYSIS_ARTIFACTORY_LIBS_INSTALLED)
55+
message(STATUS "Installing artifactory packages to: ${LIBRARY_INSTALL_DIR}")
56+
57+
set(HDILib_VERSION 1.2.7)
58+
set(flann_VERSION 1.9.2)
59+
set(lz4_VERSION 1.9.3)
60+
61+
# Both HDILib and flann are available prebuilt in the lkeb-artifactory as combined Debug/Release packages
62+
# lz4 is also available in the lkb-artifactory in separate Debug and |Release packages
63+
install_artifactory_package(HDILib ${HDILib_VERSION} biovault TRUE)
64+
install_artifactory_package(flann ${flann_VERSION} lkeb TRUE)
65+
install_artifactory_package(lz4 ${lz4_VERSION} _ FALSE)
66+
67+
message(STATUS "module path ${CMAKE_MODULE_PATH}")
68+
message(STATUS "Call find_package HDILib search ${CMAKE_SOURCE_DIR}/HDILib/lib/cmake/HDILib")
69+
message(STATUS "Run find_package HDILib")
70+
71+
set(DUAL_ANALYSIS_ARTIFACTORY_LIBS_INSTALLED TRUE CACHE BOOL "Use the prebuilt libraries from artifactory" FORCE)
72+
endif()
73+
74+
# -----------------------------------------------------------------------------
75+
# Dependencies
76+
# -----------------------------------------------------------------------------
77+
78+
if(USE_ARTIFACTORY_LIBS AND DUAL_ANALYSIS_ARTIFACTORY_LIBS_INSTALLED)
79+
# If the HDILib_VERSION is not a x.y.z version number
80+
# omit the version argument from find package
81+
find_package(HDILib COMPONENTS hdidimensionalityreduction hdiutils hdidata PATHS "${LIBRARY_INSTALL_DIR}/HDILib" CONFIG REQUIRED)
82+
else()
83+
if(NOT HDILIB_ROOT)
84+
message(FATAL_ERROR "Define HDILIB_ROOT")
85+
endif()
86+
87+
find_package(flann CONFIG REQUIRED)
88+
find_package(HDILib COMPONENTS hdidimensionalityreduction hdiutils hdidata PATHS "${HDILIB_ROOT}" CONFIG REQUIRED)
89+
90+
message(STATUS "HDILib found at ${HDILIB_ROOT} with ${HDILib_LINK_LIBS}")
91+
endif()
92+
93+
find_package(Qt6 6.3.1 COMPONENTS Widgets WebEngineWidgets REQUIRED)
94+
95+
find_package(ManiVault COMPONENTS Core PointData ImageData CONFIG)
96+
97+
find_package(OpenGL REQUIRED)
98+
find_package(OpenMP)
99+
100+
if(OpenMP_CXX_FOUND)
101+
message(STATUS "Found OpenMP")
102+
endif()
103+
104+
if(UNIX)
105+
message(STATUS "pThreads for Linux")
106+
find_package(Threads REQUIRED)
107+
endif(UNIX)
108+
109+
set(THIRD_PARTY_JSON
110+
${CMAKE_CURRENT_SOURCE_DIR}/third_party/json/nlohmann/json.hpp
111+
)
112+
113+
# Checks whether this is the first CMake run for this project.
114+
# If so, sets the CMake Install Prefix to the ManiVault install directory.
115+
# This if-statement must be placed after the project() command to work.
116+
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
117+
set(CMAKE_INSTALL_PREFIX ${MV_INSTALL_DIR} CACHE PATH "..." FORCE)
118+
endif()
119+
120+
# -----------------------------------------------------------------------------
121+
# Source files
122+
# -----------------------------------------------------------------------------
123+
124+
set(PLUGIN
125+
src/DualAnalysisPlugin.h
126+
src/DualAnalysisPlugin.cpp
127+
src/DualAnalysisPlugin.json
128+
)
129+
130+
set(ACTIONS
131+
src/Actions/SettingsAction.h
132+
src/Actions/SettingsAction.cpp
133+
)
134+
135+
set(COMMON
136+
src/Common/GradientDescentSettingsAction.h
137+
src/Common/GradientDescentSettingsAction.cpp
138+
src/Common/KnnParameters.h
139+
src/Common/KnnSettingsAction.h
140+
src/Common/KnnSettingsAction.cpp
141+
src/Common/OffscreenBuffer.h
142+
src/Common/OffscreenBuffer.cpp
143+
src/Common/TsneAnalysis.h
144+
src/Common/TsneAnalysis.cpp
145+
src/Common/TsneComputationAction.h
146+
src/Common/TsneComputationAction.cpp
147+
src/Common/TsneData.h
148+
src/Common/TsneParameters.h
149+
)
150+
151+
set(TSNE
152+
src/tSNE/GeneralTsneSettingsAction.h
153+
src/tSNE/GeneralTsneSettingsAction.cpp
154+
src/tSNE/InitTsneSettings.h
155+
src/tSNE/InitTsneSettings.cpp
156+
src/tSNE/TsneSettingsAction.h
157+
src/tSNE/TsneSettingsAction.cpp
158+
)
159+
160+
set(HSNE
161+
#src/HSNE/HsneAnalysisPlugin.h
162+
#src/HSNE/HsneAnalysisPlugin.cpp
163+
src/HSNE/GeneralHsneSettingsAction.h
164+
src/HSNE/GeneralHsneSettingsAction.cpp
165+
src/HSNE/HierarchyConstructionSettingsAction.h
166+
src/HSNE/HierarchyConstructionSettingsAction.cpp
167+
src/HSNE/HsneHierarchy.h
168+
src/HSNE/HsneHierarchy.cpp
169+
src/HSNE/HsneParameters.h
170+
src/HSNE/HsneRecomputeWarningDialog.h
171+
src/HSNE/HsneScaleAction.h
172+
src/HSNE/HsneScaleAction.cpp
173+
src/HSNE/HsneSettingsAction.h
174+
src/HSNE/HsneSettingsAction.cpp
175+
)
176+
177+
set(SOURCES ${PLUGIN} ${ACTIONS} ${COMMON} ${TSNE} ${HSNE})
178+
179+
source_group(Plugin FILES ${PLUGIN})
180+
source_group(Actions FILES ${ACTIONS})
181+
source_group(Common FILES ${COMMON})
182+
source_group(tSNE FILES ${TSNE})
183+
source_group(HSNE FILES ${HSNE})
184+
185+
186+
# -----------------------------------------------------------------------------
187+
# CMake Target
188+
# -----------------------------------------------------------
189+
# Create dynamic library for the plugin
190+
add_library(${PROJECT} SHARED ${SOURCES})
191+
192+
# -----------------------------------------------------------------------------
193+
# Target include directories
194+
# -----------------------------------------------------------------------------
195+
# Include ManiVault headers, including system data plugins
196+
target_include_directories(${PROJECT} PRIVATE "${ManiVault_INCLUDE_DIR}")
197+
target_include_directories(${PROJECT} PRIVATE "src/Common")
198+
target_include_directories(${PROJECT} PRIVATE "third_party/json")
199+
200+
set_HDILib_project_includes(${PROJECT})
201+
set_flann_project_includes(${PROJECT})
202+
set_lz4_project_includes(${PROJECT})
203+
204+
# -----------------------------------------------------------------------------
205+
# Target properties
206+
# -----------------------------------------------------------------------------
207+
# Request C++17
208+
target_compile_features(${PROJECT} PRIVATE cxx_std_17)
209+
210+
# Enable unity build
211+
if(MV_UNITY_BUILD)
212+
set_target_properties(${PROJECT} PROPERTIES UNITY_BUILD ON)
213+
endif()
214+
215+
216+
# -----------------------------------------------------------------------------
217+
# Target library linking
218+
# -----------------------------------------------------------------------------
219+
# Link to Qt libraries
220+
target_link_libraries(${PROJECT} PRIVATE Qt6::Widgets)
221+
target_link_libraries(${PROJECT} PRIVATE Qt6::WebEngineWidgets)
222+
223+
# Link to ManiVault and data plugins
224+
target_link_libraries(${PROJECT} PRIVATE ManiVault::Core)
225+
target_link_libraries(${PROJECT} PRIVATE ManiVault::PointData)
226+
target_link_libraries(${PROJECT} PRIVATE ManiVault::ImageData)
227+
228+
target_link_libraries(${PROJECT} PRIVATE ${OPENGL_LIBRARIES})
229+
230+
if(OpenMP_CXX_FOUND)
231+
target_link_libraries(${PROJECT} PRIVATE OpenMP::OpenMP_CXX)
232+
endif()
233+
234+
set_flann_project_link_libraries(${PROJECT})
235+
set_HDILib_project_link_libraries(${PROJECT})
236+
set_lz4_project_link_libraries(${PROJECT})
237+
238+
set_optimization_level(${PROJECT} ${OPTIMIZATION_LEVEL})
239+
check_and_set_AVX(${PROJECT} ${ENABLE_AVX})
240+
241+
silence_opengl_deprecation(${PROJECT})
242+
243+
244+
# -----------------------------------------------------------------------------
245+
# Target installation
246+
# -----------------------------------------------------------------------------
247+
# Install the shared plugin libary to the "Plugins" folder in the ManiVault install directory
248+
install(TARGETS ${PROJECT}
249+
RUNTIME DESTINATION Plugins COMPONENT PLUGINS # Windows .dll
250+
LIBRARY DESTINATION Plugins COMPONENT PLUGINS # Linux/Mac .so
251+
)
252+
253+
add_custom_command(TARGET ${PROJECT} POST_BUILD
254+
COMMAND "${CMAKE_COMMAND}"
255+
--install ${PROJECT_BINARY_DIR}
256+
--config $<CONFIGURATION>
257+
--prefix ${ManiVault_INSTALL_DIR}/$<CONFIGURATION>
258+
)
259+
260+
# -----------------------------------------------------------------------------
261+
# Miscellaneous
262+
# -----------------------------------------------------------------------------
263+
# Automatically set the debug environment (command + working directory) for MSVC
264+
if(MSVC)
265+
set_property(TARGET ${PROJECT} PROPERTY VS_DEBUGGER_WORKING_DIRECTORY $<IF:$<CONFIG:DEBUG>,${ManiVault_INSTALL_DIR}/debug,${ManiVault_INSTALL_DIR}/release>)
266+
set_property(TARGET ${PROJECT} PROPERTY VS_DEBUGGER_COMMAND $<IF:$<CONFIG:DEBUG>,${ManiVault_INSTALL_DIR}/debug/ManiVault\ Studio.exe,${ManiVault_INSTALL_DIR}/release/ManiVault\ Studio.exe>)
267+
endif()

cmake/CMakeLinkUtilities.cmake

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
# The following 4 macros are designed to support the use of user supplied
2+
# libraries or the PREBUILT libraries for flann and HDILib from the LKEB
3+
# artifactory.
4+
5+
# TODO complete for MacOS and Linux
6+
7+
# Include flann includes via target_include_directories to the current project
8+
macro(set_flann_project_includes target)
9+
if(USE_ARTIFACTORY_LIBS)
10+
MESSAGE( STATUS "Including PREBUILT ARTIFACTORY flann ${LIBRARY_INSTALL_DIR}/flann")
11+
target_include_directories("${target}" PRIVATE "${LIBRARY_INSTALL_DIR}/flann/include")
12+
else()
13+
14+
endif()
15+
endmacro()
16+
17+
# Link the flann libraries via target_link_library to the current project
18+
macro(set_flann_project_link_libraries target)
19+
if(USE_ARTIFACTORY_LIBS)
20+
MESSAGE( STATUS "Linking PREBUILT flann libraries...")
21+
if(MSVC)
22+
target_link_libraries("${target}" PRIVATE debug "${LIBRARY_INSTALL_DIR}/flann/lib/Debug/flann.lib")
23+
target_link_libraries("${target}" PRIVATE optimized "${LIBRARY_INSTALL_DIR}/flann/lib/Release/flann.lib")
24+
endif()
25+
else()
26+
message (STATUS "Linking flann: " ${flann_DIR})
27+
if(WIN32)
28+
target_link_libraries("${target}" PRIVATE flann::flann_cpp_s)
29+
else()
30+
target_link_libraries("${target}" PRIVATE flann::flann)
31+
endif()
32+
endif()
33+
endmacro()
34+
35+
# Include HDILib includes via target_include_directories to the current project
36+
macro(set_HDILib_project_includes target)
37+
MESSAGE( STATUS "Including HDILib ${HDILib_INCLUDE_DIR}")
38+
target_include_directories("${target}" PRIVATE "${HDILib_INCLUDE_DIR}")
39+
endmacro()
40+
41+
# Link the HDILib libraries via target_link_library to the current project
42+
macro(set_HDILib_project_link_libraries target)
43+
MESSAGE( STATUS "Linking HDILib libraries...")
44+
target_link_libraries("${target}" PRIVATE ${HDILib_LINK_LIBS})
45+
endmacro()
46+
47+
# lz4 currently only with prebuilt libs - is used in flann 1.8.4 and greater.
48+
macro(set_lz4_project_includes target)
49+
if(USE_ARTIFACTORY_LIBS)
50+
if(MSVC)
51+
MESSAGE( STATUS "Including PREBUILT ARTIFACTORY lz4 ${LIBRARY_INSTALL_DIR}/lz4")
52+
target_include_directories("${target}" PRIVATE "${LIBRARY_INSTALL_DIR}/lz4/Release/include")
53+
endif()
54+
endif()
55+
endmacro()
56+
57+
macro(set_lz4_project_link_libraries target)
58+
if(USE_ARTIFACTORY_LIBS)
59+
MESSAGE( STATUS "Linking PREBUILT lz4 libraries...")
60+
if(MSVC)
61+
target_link_libraries("${target}" PRIVATE debug "${LIBRARY_INSTALL_DIR}/lz4/Debug/lib/lz4.lib")
62+
target_link_libraries("${target}" PRIVATE optimized "${LIBRARY_INSTALL_DIR}/lz4/Release/lib/lz4.lib")
63+
endif()
64+
if(APPLE)
65+
target_link_libraries("${target}" PRIVATE debug "${LIBRARY_INSTALL_DIR}/lz4/Debug/lib/liblz4.a")
66+
target_link_libraries("${target}" PRIVATE optimized "${LIBRARY_INSTALL_DIR}/lz4/Release/lib/liblz4.a")
67+
endif()
68+
endif()
69+
endmacro()
70+
71+
# This silences OpenGL deprecation warnings on MacOS
72+
macro(silence_opengl_deprecation target)
73+
if (APPLE)
74+
target_compile_definitions("${target}" PRIVATE GL_SILENCE_DEPRECATION)
75+
endif()
76+
endmacro()
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
# -----------------------------------------------------------------------------
2+
# Check for and link to AVX instruction sets
3+
# -----------------------------------------------------------------------------
4+
macro(check_and_set_AVX target useavx)
5+
message(STATUS "Set instruction sets for ${target}, MV_USE_AVX is ${useavx}")
6+
7+
if(${useavx})
8+
# Use cmake hardware checks to see whether AVX should be activated
9+
include(CheckCXXCompilerFlag)
10+
11+
if(MSVC)
12+
set(AXV_CompileOption "/arch:AVX")
13+
set(AXV2_CompileOption "/arch:AVX2")
14+
else()
15+
set(AXV_CompileOption "-DUSE_AVX")
16+
set(AXV2_CompileOption "-DUSE_AVX2")
17+
endif()
18+
19+
if(NOT DEFINED COMPILER_OPT_AVX_SUPPORTED OR NOT DEFINED COMPILER_OPT_AVX2_SUPPORTED)
20+
check_cxx_compiler_flag(${AXV_CompileOption} COMPILER_OPT_AVX_SUPPORTED)
21+
check_cxx_compiler_flag(${AXV2_CompileOption} COMPILER_OPT_AVX2_SUPPORTED)
22+
endif()
23+
24+
if(COMPILER_OPT_AVX2_SUPPORTED)
25+
message( STATUS "Use AXV2 for ${target}")
26+
target_compile_options(${target} PRIVATE ${AXV2_CompileOption})
27+
elseif(COMPILER_OPT_AVX_SUPPORTED)
28+
message( STATUS "Use AXV for ${target}")
29+
target_compile_options(${target} PRIVATE ${AXV_CompileOption})
30+
endif()
31+
endif()
32+
endmacro()
33+
34+
# -----------------------------------------------------------------------------
35+
# Sets the optimization level
36+
# -----------------------------------------------------------------------------
37+
macro(set_optimization_level target level)
38+
message(STATUS "Set optimization level in release for ${target} to ${level}")
39+
40+
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang|AppleClang")
41+
set(OPTIMIZATION_LEVEL_FLAG "-O${level}")
42+
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
43+
if(${level} EQUAL 0)
44+
set(OPTIMIZATION_LEVEL_FLAG "/Od")
45+
else()
46+
set(OPTIMIZATION_LEVEL_FLAG "/O${level}")
47+
endif()
48+
endif()
49+
50+
target_compile_options(${target} PRIVATE "$<$<CONFIG:Release>:${OPTIMIZATION_LEVEL_FLAG}>")
51+
52+
message( STATUS "Optimization level for ${target} (release) is ${OPTIMIZATION_LEVEL_FLAG}")
53+
endmacro()

0 commit comments

Comments
 (0)