Skip to content
Draft
4 changes: 3 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_LIST_DIR}/cmake")
option(ENABLE_ASAN "Enable Address Sanitizer" OFF)
option(BASE_AS_SHARED "Build the base library as a shared library" OFF)
option(BUILDING_WITH_CONAN "Using Conan for dependencies" OFF)
option(PREFER_DYNAMIC_ZSTD "Prefer dynamic linking for zstd library" OFF)
option(PREFER_DYNAMIC_LZ4 "Prefer dynamic linking for lz4 library" OFF)

if(NOT WIN32 AND ENABLE_ASAN)
set(CMAKE_CXX_FLAGS
Expand Down Expand Up @@ -227,7 +229,7 @@ target_include_directories(

target_link_libraries(
plotjuggler_base
PUBLIC plotjuggler_qwt
PUBLIC plotjuggler_qwt Qt5::Xml
PRIVATE fmt::fmt lua::lua)

# Add compile definitions to plotjuggler_base
Expand Down
100 changes: 76 additions & 24 deletions cmake/find_or_download_lz4.cmake
Original file line number Diff line number Diff line change
@@ -1,41 +1,93 @@
function(find_or_download_lz4)

if(TARGET LZ4::lz4_static)
if(TARGET LZ4::lz4)
message(STATUS "LZ4 targets already defined")
return()
endif()

find_package(LZ4 QUIET)

# Check if LZ4 targets already exist (e.g., from Arrow)
if(NOT TARGET LZ4::lz4_static)
message(STATUS "Downloading and compiling LZ4")
# Determine which library type to use
if(PREFER_DYNAMIC_LZ4)
set(LZ4_PREFER_SHARED ON)
message(STATUS "LZ4: Preferring dynamic library")
else()
set(LZ4_PREFER_SHARED OFF)
message(STATUS "LZ4: Preferring static library")
endif()

# lz4 ###
cpmaddpackage(
NAME lz4
URL https://github.com/lz4/lz4/archive/refs/tags/v1.10.0.zip
DOWNLOAD_ONLY YES)
# Reuse any existing LZ4 targets from find_package or toolchains
set(_lz4_base_candidates LZ4::lz4 lz4::lz4 lz4)
foreach(_candidate IN LISTS _lz4_base_candidates)
if(TARGET ${_candidate})
add_library(LZ4::lz4 ALIAS ${_candidate})
message(STATUS "LZ4: Using existing target ${_candidate}")
return()
endif()
endforeach()

set(LZ4_FOUND TRUE FORCE)
set(_lz4_shared_candidates LZ4::lz4_shared lz4::lz4_shared lz4_shared)
set(_lz4_static_candidates LZ4::lz4_static lz4::lz4_static lz4_static)

file(GLOB LZ4_SOURCES ${lz4_SOURCE_DIR}/lib/*.c)
set(_lz4_shared_target "")
foreach(_candidate IN LISTS _lz4_shared_candidates)
if(TARGET ${_candidate})
set(_lz4_shared_target ${_candidate})
break()
endif()
endforeach()

# define a helper to build both static and shared variants
macro(build_lz4_variant TYPE SUFFIX)
set(target lz4_${SUFFIX})
add_library(${target} ${TYPE} ${LZ4_SOURCES})
set_property(TARGET ${target} PROPERTY POSITION_INDEPENDENT_CODE ON)
set(_lz4_static_target "")
foreach(_candidate IN LISTS _lz4_static_candidates)
if(TARGET ${_candidate})
set(_lz4_static_target ${_candidate})
break()
endif()
endforeach()

add_library(LZ4::${target} INTERFACE IMPORTED)
set_target_properties(LZ4::${target} PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES ${lz4_SOURCE_DIR}/lib
INTERFACE_LINK_LIBRARIES ${target})
endmacro()
if(_lz4_shared_target OR _lz4_static_target)
if(LZ4_PREFER_SHARED AND _lz4_shared_target)
add_library(LZ4::lz4 ALIAS ${_lz4_shared_target})
message(STATUS "LZ4: Using shared library from find_package (${_lz4_shared_target})")
elseif(_lz4_static_target)
add_library(LZ4::lz4 ALIAS ${_lz4_static_target})
message(STATUS "LZ4: Using static library from find_package (${_lz4_static_target})")
elseif(_lz4_shared_target)
add_library(LZ4::lz4 ALIAS ${_lz4_shared_target})
message(STATUS "LZ4: Falling back to shared library from find_package (${_lz4_shared_target})")
endif()
return()
endif()

# now build both
build_lz4_variant(STATIC static)
message(STATUS "Downloading and compiling LZ4")

endif()
# lz4 ###
cpmaddpackage(
NAME lz4
URL https://github.com/lz4/lz4/archive/refs/tags/v1.10.0.zip
DOWNLOAD_ONLY YES)

set(LZ4_FOUND TRUE FORCE)

file(GLOB LZ4_SOURCES ${lz4_SOURCE_DIR}/lib/*.c)

# define a helper to build both static and shared variants
macro(build_lz4_variant TYPE SUFFIX)
set(target lz4_${SUFFIX})
add_library(${target} ${TYPE} ${LZ4_SOURCES})
set_property(TARGET ${target} PROPERTY POSITION_INDEPENDENT_CODE ON)

add_library(LZ4::${target} INTERFACE IMPORTED)
set_target_properties(LZ4::${target} PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES ${lz4_SOURCE_DIR}/lib
INTERFACE_LINK_LIBRARIES ${target})
endmacro()

# now build both
build_lz4_variant(STATIC static)

# Create the preferred alias
add_library(LZ4::lz4 ALIAS LZ4::lz4_static)
message(STATUS "LZ4: Built static library from source")

endfunction()
118 changes: 85 additions & 33 deletions cmake/find_or_download_zstd.cmake
Original file line number Diff line number Diff line change
@@ -1,54 +1,106 @@
function(find_or_download_zstd)

if(TARGET zstd::libzstd_static)
if(TARGET zstd::zstd)
message(STATUS "ZSTD targets already defined")
return()
endif()

find_package(ZSTD QUIET)

# Check if ZSTD targets already exist (e.g., from Arrow)
if(NOT TARGET zstd::libzstd_static)
message(STATUS "Downloading and compiling ZSTD")
# Determine which library type to use
if(PREFER_DYNAMIC_ZSTD)
set(ZSTD_PREFER_SHARED ON)
message(STATUS "ZSTD: Preferring dynamic library")
else()
set(ZSTD_PREFER_SHARED OFF)
message(STATUS "ZSTD: Preferring static library")
endif()

# zstd ###
cpmaddpackage(
NAME zstd
URL https://github.com/facebook/zstd/archive/refs/tags/v1.5.7.zip
DOWNLOAD_ONLY YES)
# Reuse any existing ZSTD targets from find_package or toolchains
set(_zstd_base_candidates zstd::zstd ZSTD::ZSTD zstd)
foreach(_candidate IN LISTS _zstd_base_candidates)
if(TARGET ${_candidate})
add_library(zstd::zstd ALIAS ${_candidate})
message(STATUS "ZSTD: Using existing target ${_candidate}")
return()
endif()
endforeach()

set(LIBRARY_DIR ${zstd_SOURCE_DIR}/lib)
file(GLOB CommonSources ${LIBRARY_DIR}/common/*.c)
file(GLOB CommonHeaders ${LIBRARY_DIR}/common/*.h)
set(_zstd_shared_candidates zstd::libzstd_shared ZSTD::libzstd_shared zstd_shared)
set(_zstd_static_candidates zstd::libzstd_static ZSTD::libzstd_static zstd_static)

file(GLOB CompressSources ${LIBRARY_DIR}/compress/*.c)
file(GLOB CompressHeaders ${LIBRARY_DIR}/compress/*.h)
set(_zstd_shared_target "")
foreach(_candidate IN LISTS _zstd_shared_candidates)
if(TARGET ${_candidate})
set(_zstd_shared_target ${_candidate})
break()
endif()
endforeach()

file(GLOB DecompressSources ${LIBRARY_DIR}/decompress/*.c)
file(GLOB DecompressHeaders ${LIBRARY_DIR}/decompress/*.h)
set(_zstd_static_target "")
foreach(_candidate IN LISTS _zstd_static_candidates)
if(TARGET ${_candidate})
set(_zstd_static_target ${_candidate})
break()
endif()
endforeach()

set(Sources ${CommonSources} ${CompressSources} ${DecompressSources})
set(Headers ${PublicHeaders} ${CommonHeaders} ${CompressHeaders} ${DecompressHeaders})
if(_zstd_shared_target OR _zstd_static_target)
if(ZSTD_PREFER_SHARED AND _zstd_shared_target)
add_library(zstd::zstd ALIAS ${_zstd_shared_target})
message(STATUS "ZSTD: Using shared library from find_package (${_zstd_shared_target})")
elseif(_zstd_static_target)
add_library(zstd::zstd ALIAS ${_zstd_static_target})
message(STATUS "ZSTD: Using static library from find_package (${_zstd_static_target})")
elseif(_zstd_shared_target)
add_library(zstd::zstd ALIAS ${_zstd_shared_target})
message(STATUS "ZSTD: Falling back to shared library from find_package (${_zstd_shared_target})")
endif()
return()
endif()

add_compile_options(-DZSTD_DISABLE_ASM)
message(STATUS "Downloading and compiling ZSTD")

set(ZSTD_FOUND TRUE PARENT_SCOPE)
# zstd ###
cpmaddpackage(
NAME zstd
URL https://github.com/facebook/zstd/archive/refs/tags/v1.5.7.zip
DOWNLOAD_ONLY YES)

# define a helper to build both static and shared variants
macro(build_zstd_variant TYPE SUFFIX)
set(target libzstd_${SUFFIX})
add_library(${target} ${TYPE} ${Sources} ${Headers})
set_property(TARGET ${target} PROPERTY POSITION_INDEPENDENT_CODE ON)
set(LIBRARY_DIR ${zstd_SOURCE_DIR}/lib)
file(GLOB CommonSources ${LIBRARY_DIR}/common/*.c)
file(GLOB CommonHeaders ${LIBRARY_DIR}/common/*.h)

add_library(zstd::${target} INTERFACE IMPORTED)
set_target_properties(zstd::${target} PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES ${zstd_SOURCE_DIR}/lib
INTERFACE_LINK_LIBRARIES ${target})
endmacro()
file(GLOB CompressSources ${LIBRARY_DIR}/compress/*.c)
file(GLOB CompressHeaders ${LIBRARY_DIR}/compress/*.h)

# now build both
build_zstd_variant(STATIC static)
file(GLOB DecompressSources ${LIBRARY_DIR}/decompress/*.c)
file(GLOB DecompressHeaders ${LIBRARY_DIR}/decompress/*.h)

endif()
set(Sources ${CommonSources} ${CompressSources} ${DecompressSources})
set(Headers ${PublicHeaders} ${CommonHeaders} ${CompressHeaders} ${DecompressHeaders})

add_compile_options(-DZSTD_DISABLE_ASM)

set(ZSTD_FOUND TRUE PARENT_SCOPE)

# define a helper to build both static and shared variants
macro(build_zstd_variant TYPE SUFFIX)
set(target libzstd_${SUFFIX})
add_library(${target} ${TYPE} ${Sources} ${Headers})
set_property(TARGET ${target} PROPERTY POSITION_INDEPENDENT_CODE ON)

add_library(zstd::${target} INTERFACE IMPORTED)
set_target_properties(zstd::${target} PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES ${zstd_SOURCE_DIR}/lib
INTERFACE_LINK_LIBRARIES ${target})
endmacro()

# now build both
build_zstd_variant(STATIC static)

# Create the preferred alias
add_library(zstd::zstd ALIAS zstd::libzstd_static)
message(STATUS "ZSTD: Built static library from source")

endfunction()
Loading