Skip to content
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
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
bld/
[Bb]in/
[Oo]bj/
[Ii]nstall/

# Visual Studio 2015 cache/options directory
.vs/
Expand Down
149 changes: 85 additions & 64 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,30 +1,30 @@
cmake_minimum_required(VERSION 3.28)

# Define the project
project(cvutil VERSION "2.5.0" DESCRIPTION "Computer Vision UTILity Toolkit" LANGUAGES CXX)

set(CVUTIL_PROJECT "cvutil" CACHE STRING "CVUTIL project")

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# Set the preferred compilers in order of priority
if(NOT CMAKE_CXX_COMPILER)
# Set the preferred compilers in order of priority (must be before project())
if(NOT DEFINED CMAKE_CXX_COMPILER)
find_program(CLANG_COMPILER NAMES clang++ clang)
find_program(GCC_COMPILER NAMES g++ gcc)
find_program(MSVC_COMPILER NAMES cl)

if(CLANG_COMPILER)
set(CMAKE_CXX_COMPILER ${CLANG_COMPILER})
set(CMAKE_CXX_COMPILER ${CLANG_COMPILER} CACHE FILEPATH "C++ compiler")
elseif(GCC_COMPILER)
set(CMAKE_CXX_COMPILER ${GCC_COMPILER})
set(CMAKE_CXX_COMPILER ${GCC_COMPILER} CACHE FILEPATH "C++ compiler")
elseif(MSVC_COMPILER)
set(CMAKE_CXX_COMPILER ${MSVC_COMPILER})
set(CMAKE_CXX_COMPILER ${MSVC_COMPILER} CACHE FILEPATH "C++ compiler")
else()
message(FATAL_ERROR "No suitable compiler found")
endif()
endif()

# Define the project
project(cvutil VERSION "2.5.0" DESCRIPTION "Computer Vision UTILity Toolkit" LANGUAGES CXX)

set(CVUTIL_PROJECT "cvutil" CACHE STRING "CVUTIL project")

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# Options to enable or disable AVX-512 and AVX2/FMA support
option(ENABLE_AVX512 "Enable AVX-512 support" OFF) # To be enabled on x86_64 server processors
option(ENABLE_AVX2_FMA "Enable AVX2 and FMA support" ON) # Default support for x86_64 desktop processors
Expand All @@ -40,58 +40,62 @@ endif()

message(STATUS "Using ${CMAKE_CXX_COMPILER_ID} as the C++ compiler")

# Set global CMake build options
if(MSVC) # OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
# Create an interface library for compiler flags (modern CMake approach)
add_library(cvutil_compiler_flags INTERFACE)

# MSVC-specific flags
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MDd /Zi /Ob0 /Od /RTC1 /DDEBUG /D_CRT_SECURE_NO_WARNINGS")
set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} /DEBUG /INCREMENTAL")

set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MD /Ox /DNDEBUG")
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /OPT:REF /OPT:ICF")

# Enable AVX-512 and AVX2/FMA support
if(ENABLE_AVX512)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:AVX512")
endif()
if(ENABLE_AVX2_FMA)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:AVX2")
endif()

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /fp:precise /fp:strict")

elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g -DDEBUG -D_DEBUG -O0")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -DNDEBUG")

# Enable AVX-512 and AVX2/FMA support
if(ENABLE_AVX512)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mavx512")
endif()
if(ENABLE_AVX2_FMA)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mavx2 -mfma")
endif()

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-fast-math -frounding-math")

elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g -DDEBUG -D_DEBUG -O0")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -DNDEBUG")

# Enable AVX-512 and AVX2/FMA support
if(ENABLE_AVX512)
message(STATUS "Enabling AVX-512 support")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mavx512")
endif()
if(ENABLE_AVX2_FMA)
message(STATUS "Enabling AVX2 and FMA support")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mavx2 -mfma")
endif()

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-fast-math -frounding-math")

else()
message(FATAL_ERROR "Unsupported compiler")
endif()
target_compile_options(cvutil_compiler_flags INTERFACE
$<$<CXX_COMPILER_ID:MSVC>:
$<$<CONFIG:Debug>:/MDd /Zi /Ob0 /Od /RTC1 /fsanitize=address>
$<$<CONFIG:Release>:/MD /Ox>
/fp:precise /fp:strict
$<$<BOOL:${ENABLE_AVX512}>:/arch:AVX512>
$<$<BOOL:${ENABLE_AVX2_FMA}>:/arch:AVX2>
>
$<$<OR:$<CXX_COMPILER_ID:Clang>,$<CXX_COMPILER_ID:GNU>>:
$<$<CONFIG:Debug>:-g -O0 -fsanitize=address>
$<$<CONFIG:Release>:-O3>
-fno-fast-math -frounding-math
$<$<BOOL:${ENABLE_AVX512}>:-mavx512f>
$<$<BOOL:${ENABLE_AVX2_FMA}>:-mavx2 -mfma>
>
)

target_compile_definitions(cvutil_compiler_flags INTERFACE
$<$<CXX_COMPILER_ID:MSVC>:
$<$<CONFIG:Debug>:DEBUG;_CRT_SECURE_NO_WARNINGS>
$<$<CONFIG:Release>:NDEBUG>
>
$<$<OR:$<CXX_COMPILER_ID:Clang>,$<CXX_COMPILER_ID:GNU>>:
$<$<CONFIG:Debug>:DEBUG;_DEBUG>
$<$<CONFIG:Release>:NDEBUG>
>
)

target_link_options(cvutil_compiler_flags INTERFACE
$<$<CXX_COMPILER_ID:MSVC>:
$<$<CONFIG:Debug>:/DEBUG /INCREMENTAL> # /INFERASANLIBS:NO
$<$<CONFIG:Release>:/OPT:REF /OPT:ICF>
>
$<$<OR:$<CXX_COMPILER_ID:Clang>,$<CXX_COMPILER_ID:GNU>>:
$<$<CONFIG:Debug>:-fsanitize=address>
>
)

# # Find and link the ASAN runtime library for Debug builds with MSVC
# if(MSVC)
# # Find the ASAN import library
# get_filename_component(COMPILER_DIR ${CMAKE_CXX_COMPILER} DIRECTORY)
# file(GLOB ASAN_LIB "${COMPILER_DIR}/clang_rt.asan_dynamic-x86_64.lib")
# if(ASAN_LIB)
# target_link_libraries(cvutil_compiler_flags INTERFACE
# $<$<CONFIG:Debug>:${ASAN_LIB}>
# )
# message(STATUS "Found ASAN import library: ${ASAN_LIB}")
# else()
# message(WARNING "ASAN import library not found in ${COMPILER_DIR}")
# endif()
# endif()

# Find OpenCV
find_package(OpenCV REQUIRED)
Expand Down Expand Up @@ -125,6 +129,23 @@ if (CMAKE_SYSTEM_NAME STREQUAL "Windows")
foreach(qt_lib Qt6::Core Qt6::Widgets Qt6::Gui Qt6::Charts Qt6::OpenGL Qt6::OpenGLWidgets)
install(FILES $<TARGET_FILE:${qt_lib}> CONFIGURATIONS Debug Release DESTINATION bin)
endforeach()

if(MSVC)
# Get the compiler directory and construct paths dynamically
get_filename_component(COMPILER_DIR "${CMAKE_CXX_COMPILER}" DIRECTORY)

# Find and install ASAN DLL for Debug builds
find_file(ASAN_DLL "clang_rt.asan_dynamic-x86_64.dll"
PATHS "${COMPILER_DIR}"
"${COMPILER_DIR}/../../../bin"
"${COMPILER_DIR}/../../bin"
"C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/Llvm/x64/bin"
Copy link

Copilot AI Dec 2, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The hardcoded path "C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/Llvm/x64/bin" may not be portable across different Visual Studio installations. Consider using environment variables like VSINSTALLDIR or make this path configurable through a CMake option to support different Visual Studio editions (Community, Professional, Enterprise) and installation locations.

Copilot uses AI. Check for mistakes.
NO_DEFAULT_PATH)
if(ASAN_DLL)
install(FILES ${ASAN_DLL} CONFIGURATIONS Debug DESTINATION bin)
endif()
endif()

elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux")
# Set RPATH to include our bundled libraries
# set(CMAKE_INSTALL_RPATH "\$ORIGIN/../lib/cvutil;\$ORIGIN/../lib;/usr/lib/x86_64-linux-gnu;/lib/x86_64-linux-gnu")
Expand Down
65 changes: 33 additions & 32 deletions PluginManager/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ target_include_directories(PluginManager
# Link libraries (PluginManager depends on Qt)
target_link_libraries(PluginManager
PRIVATE
cvutil_compiler_flags
Qt6::Core
Qt6::Widgets
Qt6::Charts
Expand All @@ -65,29 +66,29 @@ set(PUBLIC_HEADERS
include/PluginManager.h
)

file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/library/bin)
file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/library/include)
file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/library/lib)
# file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/library/bin)
# file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/library/include)
# file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/library/lib)

# Set the output directories for the built targets
set_target_properties(cvutil PROPERTIES
RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/library/bin/
RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/library/bin/
# # Set the output directories for the built targets
# set_target_properties(cvutil PROPERTIES
# RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/library/bin/
# RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/library/bin/

LIBRARY_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/library/lib/
LIBRARY_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/library/lib/
# LIBRARY_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/library/lib/
# LIBRARY_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/library/lib/

ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/library/lib/
ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/library/lib/
)
# ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/library/lib/
# ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/library/lib/
# )

# Post-build commands (copy the library to the correct directories)
add_custom_command(TARGET PluginManager POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
${CMAKE_CURRENT_SOURCE_DIR}/include/PluginInterfaces.h ${CMAKE_BINARY_DIR}/library/include/
COMMAND ${CMAKE_COMMAND} -E copy_if_different
${CMAKE_CURRENT_SOURCE_DIR}/include/PluginManager.h ${CMAKE_BINARY_DIR}/library/include/
)
# # Post-build commands (copy the library to the correct directories)
# add_custom_command(TARGET PluginManager POST_BUILD
# COMMAND ${CMAKE_COMMAND} -E copy_if_different
# ${CMAKE_CURRENT_SOURCE_DIR}/include/PluginInterfaces.h ${CMAKE_BINARY_DIR}/library/include/
# COMMAND ${CMAKE_COMMAND} -E copy_if_different
# ${CMAKE_CURRENT_SOURCE_DIR}/include/PluginManager.h ${CMAKE_BINARY_DIR}/library/include/
# )

# # Install the PluginManager library
# install(TARGETS PluginManager
Expand Down Expand Up @@ -154,17 +155,17 @@ if (MSVC)
install(FILES $<TARGET_PDB_FILE:PluginManager> CONFIGURATIONS Debug DESTINATION bin COMPONENT development)
endif()

# For the PluginManager target
if (CMAKE_SYSTEM_NAME STREQUAL "Windows")
add_custom_command(TARGET PluginManager POST_BUILD
COMMAND ${CMAKE_COMMAND}
-D TARGET_FILE=$<TARGET_FILE:PluginManager>
-D INSTALL_BIN=${CMAKE_INSTALL_PREFIX}/$<IF:$<BOOL:${WIN32}>,bin,lib/cvutil>
-D SEARCH_DIRS=${DEP_PATH}
-D BUILD_CONFIG=$<CONFIG>
-D BINARY_DIR=${CMAKE_BINARY_DIR}
-P "${CMAKE_CURRENT_SOURCE_DIR}/../CMake/find_runtime_deps.cmake"
COMMENT "Copying runtime dependencies for PluginManager"
)
endif()
# # For the PluginManager target
# if (CMAKE_SYSTEM_NAME STREQUAL "Windows")
# add_custom_command(TARGET PluginManager POST_BUILD
# COMMAND ${CMAKE_COMMAND}
# -D TARGET_FILE=$<TARGET_FILE:PluginManager>
# -D INSTALL_BIN=${CMAKE_INSTALL_PREFIX}/$<IF:$<BOOL:${WIN32}>,bin,lib/cvutil>
# -D SEARCH_DIRS=${DEP_PATH}
# -D BUILD_CONFIG=$<CONFIG>
# -D BINARY_DIR=${CMAKE_BINARY_DIR}
# -P "${CMAKE_CURRENT_SOURCE_DIR}/../CMake/find_runtime_deps.cmake"
# COMMENT "Copying runtime dependencies for PluginManager"
# )
# endif()

61 changes: 31 additions & 30 deletions RoiManager/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ target_include_directories(RoiManager
# Link Qt6 and OpenCV libraries, along with other dependencies
target_link_libraries(RoiManager
PRIVATE
cvutil_compiler_flags
${OpenCV_LIBS}
Qt6::Core
Qt6::Widgets
Expand All @@ -57,27 +58,27 @@ set(PUBLIC_HEADERS
include/RoiManager.h
)

file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/library/bin)
file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/library/include)
file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/library/lib)
# file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/library/bin)
# file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/library/include)
# file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/library/lib)

# Set the output directories for the built targets
set_target_properties(cvutil PROPERTIES
RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/library/bin/
RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/library/bin/
# # Set the output directories for the built targets
# set_target_properties(cvutil PROPERTIES
# RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/library/bin/
# RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/library/bin/

LIBRARY_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/library/lib/
LIBRARY_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/library/lib/
# LIBRARY_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/library/lib/
# LIBRARY_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/library/lib/

ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/library/lib/
ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/library/lib/
)
# ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/library/lib/
# ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/library/lib/
# )

# Post-build events to copy DLL, lib, and headers to appropriate directories
add_custom_command(TARGET RoiManager POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
${CMAKE_CURRENT_SOURCE_DIR}/include/RoiManager.h ${CMAKE_BINARY_DIR}/library/include/
)
# # Post-build events to copy DLL, lib, and headers to appropriate directories
# add_custom_command(TARGET RoiManager POST_BUILD
# COMMAND ${CMAKE_COMMAND} -E copy_if_different
# ${CMAKE_CURRENT_SOURCE_DIR}/include/RoiManager.h ${CMAKE_BINARY_DIR}/library/include/
# )

# # Install the RoiManager library for Debug configuration
# install(TARGETS RoiManager
Expand Down Expand Up @@ -146,16 +147,16 @@ endif()

message(STATUS "Dependency path: ${DEP_PATH}")

# For the RoiManager target
if (CMAKE_SYSTEM_NAME STREQUAL "Windows")
add_custom_command(TARGET RoiManager POST_BUILD
COMMAND ${CMAKE_COMMAND}
-D TARGET_FILE=$<TARGET_FILE:RoiManager>
-D INSTALL_BIN=${CMAKE_INSTALL_PREFIX}/$<IF:$<BOOL:${WIN32}>,bin,lib/cvutil>
-D SEARCH_DIRS=${DEP_PATH}
-D BUILD_CONFIG=$<CONFIG>
-D BINARY_DIR=${CMAKE_BINARY_DIR}
-P "${CMAKE_CURRENT_SOURCE_DIR}/../CMake/find_runtime_deps.cmake"
COMMENT "Copying runtime dependencies for RoiManager"
)
endif()
# # For the RoiManager target
# if (CMAKE_SYSTEM_NAME STREQUAL "Windows")
# add_custom_command(TARGET RoiManager POST_BUILD
# COMMAND ${CMAKE_COMMAND}
# -D TARGET_FILE=$<TARGET_FILE:RoiManager>
# -D INSTALL_BIN=${CMAKE_INSTALL_PREFIX}/$<IF:$<BOOL:${WIN32}>,bin,lib/cvutil>
# -D SEARCH_DIRS=${DEP_PATH}
# -D BUILD_CONFIG=$<CONFIG>
# -D BINARY_DIR=${CMAKE_BINARY_DIR}
# -P "${CMAKE_CURRENT_SOURCE_DIR}/../CMake/find_runtime_deps.cmake"
# COMMENT "Copying runtime dependencies for RoiManager"
# )
# endif()
Loading