Skip to content

Commit 2b841c3

Browse files
some best practices
1 parent 412f865 commit 2b841c3

1 file changed

Lines changed: 83 additions & 68 deletions

File tree

src/CMakeLists.txt

Lines changed: 83 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,7 @@ set(IMAGER_VERSION_MINOR 0)
3939
set(IMAGER_VERSION_PATCH 6)
4040
set(IMAGER_VERSION_STR "${IMAGER_VERSION_MAJOR}.${IMAGER_VERSION_MINOR}.${IMAGER_VERSION_PATCH}")
4141
set(IMAGER_VERSION_CSV "${IMAGER_VERSION_MAJOR},${IMAGER_VERSION_MINOR},${IMAGER_VERSION_PATCH},0")
42-
add_definitions(-DIMAGER_VERSION_STR="${IMAGER_VERSION_STR}")
43-
add_definitions(-DIMAGER_VERSION_CSV=${IMAGER_VERSION_CSV})
42+
# Version definitions will be added to target later
4443
set(CMAKE_INCLUDE_CURRENT_DIR ON)
4544

4645
set(CMAKE_CXX_STANDARD 20)
@@ -95,11 +94,7 @@ set(XZ_ENCODERS
9594
)
9695
set(CREATE_LZMA_SYMLINKS OFF CACHE BOOL "" FORCE)
9796
set(CREATE_XZ_SYMLINKS OFF CACHE BOOL "" FORCE)
98-
FetchContent_GetProperties(xz)
99-
if(NOT xz_POPULATED)
100-
FetchContent_Populate(xz)
101-
add_subdirectory(${xz_SOURCE_DIR} ${xz_BINARY_DIR} EXCLUDE_FROM_ALL)
102-
endif()
97+
FetchContent_MakeAvailable(xz)
10398
unset(XZ_MICROLZMA_DECODER)
10499
unset(XZ_MICROLZMA_ENCODER)
105100
unset(XZ_LZIP_DECODER)
@@ -108,14 +103,15 @@ unset(XZ_BUILD_SHARED_LIBS)
108103
unset(XZ_ENABLE_DOXYGEN)
109104
unset(CREATE_LZMA_SYMLINKS)
110105
unset(CREATE_XZ_SYMLINKS)
111-
set(LIBLZMA_FOUND true CACHE BOOL "" FORCE)
112-
set(LIBLZMA_INCLUDE_DIR ${xz_SOURCE_DIR}/src/liblzma/api CACHE PATH "" FORCE)
113-
set(LIBLZMA_INCLUDE_DIRS ${xz_SOURCE_DIR}/src/liblzma/api CACHE PATH "" FORCE)
114-
set(LIBLZMA_LIBRARY liblzma CACHE FILEPATH "" FORCE)
115-
set(LIBLZMA_LIBRARIES ${xz_BINARY_DIR}/liblzma.a CACHE FILEPATH "" FORCE)
116-
set(LIBLZMA_HAS_AUTO_DECODER true CACHE BOOL "" FORCE)
117-
set(LIBLZMA_HAS_EASY_ENCODER true CACHE BOOL "" FORCE)
118-
set(LIBLZMA_HAS_LZMA_PRESET true CACHE BOOL "" FORCE)
106+
# Set LZMA variables for compatibility (avoid FORCE unless necessary)
107+
set(LIBLZMA_FOUND true CACHE BOOL "LZMA library found")
108+
set(LIBLZMA_INCLUDE_DIR ${xz_SOURCE_DIR}/src/liblzma/api CACHE PATH "LZMA include directory")
109+
set(LIBLZMA_INCLUDE_DIRS ${xz_SOURCE_DIR}/src/liblzma/api CACHE PATH "LZMA include directories")
110+
set(LIBLZMA_LIBRARY liblzma CACHE STRING "LZMA library target")
111+
set(LIBLZMA_LIBRARIES liblzma CACHE STRING "LZMA libraries")
112+
set(LIBLZMA_HAS_AUTO_DECODER true CACHE BOOL "LZMA has auto decoder")
113+
set(LIBLZMA_HAS_EASY_ENCODER true CACHE BOOL "LZMA has easy encoder")
114+
set(LIBLZMA_HAS_LZMA_PRESET true CACHE BOOL "LZMA has preset")
119115

120116
# Bundled zstd
121117
set(ZSTD_VERSION "1.5.7")
@@ -130,25 +126,22 @@ set(ZSTD_BUILD_SHARED OFF CACHE BOOL "" FORCE)
130126
set(ZSTD_BUILD_STATIC ON CACHE BOOL "" FORCE)
131127
set(ZSTD_BUILD_TESTS OFF CACHE BOOL "" FORCE)
132128
set(ZSTD_BUILD_DICTBUILDER OFF CACHE BOOL "" FORCE)
133-
FetchContent_GetProperties(zstd)
134-
if(NOT zstd_POPULATED)
135-
FetchContent_Populate(zstd)
136-
add_subdirectory(${zstd_SOURCE_DIR}/build/cmake ${zstd_BINARY_DIR} EXCLUDE_FROM_ALL)
137-
endif()
129+
FetchContent_MakeAvailable(zstd)
138130
unset(ZSTD_BUILD_PROGRAMS)
139131
unset(ZSTD_BUILD_SHARED)
140132
unset(ZSTD_BUILD_STATIC)
141133
unset(ZSTD_BUILD_TESTS)
142134
unset(ZSTD_BUILD_DICTBUILDER)
143-
set(ZSTD_FOUND true CACHE BOOL "" FORCE)
144-
set(Zstd_VERSION ${ZSTD_VERSION} CACHE STRING "" FORCE)
145-
set(Zstd_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/_deps/zstd-src/lib CACHE PATH "" FORCE)
146-
set(ZSTD_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/_deps/zstd-src/lib CACHE PATH "" FORCE)
147-
set(Zstd_INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR}/_deps/zstd-src/lib CACHE PATH "" FORCE)
148-
set(ZSTD_INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR}/_deps/zstd-src/lib CACHE PATH "" FORCE)
149-
set(Zstd_LIBRARIES libzstd_static CACHE FILEPATH "" FORCE)
150-
set(ZSTD_LIBRARIES libzstd_static CACHE FILEPATH "" FORCE)
151-
set(ZSTD_LIBRARY ${CMAKE_CURRENT_BINARY_DIR}/_deps/zstd-build/lib/libzstd.a CACHE FILEPATH "" FORCE)
135+
# Set ZSTD variables for compatibility
136+
set(ZSTD_FOUND true CACHE BOOL "ZSTD library found")
137+
set(Zstd_VERSION ${ZSTD_VERSION} CACHE STRING "ZSTD version")
138+
set(Zstd_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/_deps/zstd-src/lib CACHE PATH "ZSTD include directory")
139+
set(ZSTD_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/_deps/zstd-src/lib CACHE PATH "ZSTD include directory")
140+
set(Zstd_INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR}/_deps/zstd-src/lib CACHE PATH "ZSTD include directories")
141+
set(ZSTD_INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR}/_deps/zstd-src/lib CACHE PATH "ZSTD include directories")
142+
set(Zstd_LIBRARIES libzstd_static CACHE STRING "ZSTD libraries")
143+
set(ZSTD_LIBRARIES libzstd_static CACHE STRING "ZSTD libraries")
144+
set(ZSTD_LIBRARY libzstd_static CACHE STRING "ZSTD library target")
152145

153146
if (NOT APPLE)
154147
# Bundled zlib (Windows/Linux only)
@@ -173,16 +166,15 @@ if (NOT APPLE)
173166
unset(ZLIB_BUILD_STATIC)
174167
unset(ZLIB_BUILD_TESTS)
175168
unset(SKIP_INSTALL_ALL)
176-
set(ZLIB_USE_STATIC_LIBS ON CACHE BOOL "" FORCE)
177-
set(ZLIB_ROOT ${zlib_SOURCE_DIR} CACHE PATH "" FORCE)
169+
set(ZLIB_USE_STATIC_LIBS ON CACHE BOOL "Use static ZLIB")
170+
set(ZLIB_ROOT ${zlib_SOURCE_DIR} CACHE PATH "ZLIB root directory")
178171

179-
# Create proper ZLIB::ZLIB alias target instead of IMPORTED target
180-
# This avoids hardcoded paths and lets CMake handle dependencies automatically
181-
set(ZLIB_INCLUDE_DIR ${zlib_SOURCE_DIR} CACHE PATH "" FORCE)
182-
set(ZLIB_INCLUDE_DIRS ${zlib_SOURCE_DIR};${zlib_BINARY_DIR} CACHE PATH "" FORCE)
183-
set(ZLIB_FOUND TRUE CACHE BOOL "" FORCE)
184-
set(ZLIB_LIBRARY zlibstatic CACHE STRING "" FORCE)
185-
set(ZLIB_LIBRARIES zlibstatic CACHE STRING "" FORCE)
172+
# Set ZLIB variables for compatibility
173+
set(ZLIB_INCLUDE_DIR ${zlib_SOURCE_DIR} CACHE PATH "ZLIB include directory")
174+
set(ZLIB_INCLUDE_DIRS ${zlib_SOURCE_DIR};${zlib_BINARY_DIR} CACHE PATH "ZLIB include directories")
175+
set(ZLIB_FOUND TRUE CACHE BOOL "ZLIB library found")
176+
set(ZLIB_LIBRARY zlibstatic CACHE STRING "ZLIB library target")
177+
set(ZLIB_LIBRARIES zlibstatic CACHE STRING "ZLIB libraries")
186178

187179
# Create ZLIB::ZLIB alias target pointing to the actual zlibstatic target
188180
# This lets CMake handle the actual library path and build dependencies automatically
@@ -233,9 +225,9 @@ set(ARCHIVE_BUILD_EXAMPLES OFF CACHE BOOL "")
233225
set(ENABLE_ZSTD ON CACHE BOOL "")
234226
set(ENABLE_LZMA ON CACHE BOOL "")
235227
# Point libarchive to our bundled LZMA
236-
set(LIBLZMA_INCLUDE_DIR ${xz_SOURCE_DIR}/src/liblzma/api CACHE PATH "" FORCE)
237-
set(LIBLZMA_LIBRARY liblzma CACHE FILEPATH "" FORCE)
238-
set(POSIX_REGEX_LIB "libc" CACHE STRING "" FORCE)
228+
set(LIBLZMA_INCLUDE_DIR ${xz_SOURCE_DIR}/src/liblzma/api CACHE PATH "LZMA include for libarchive")
229+
set(LIBLZMA_LIBRARY liblzma CACHE STRING "LZMA library for libarchive")
230+
set(POSIX_REGEX_LIB "libc" CACHE STRING "Regex library for libarchive")
239231
set(LIBARCHIVE_VERSION "3.8.1")
240232

241233
FetchContent_Declare(libarchive
@@ -278,10 +270,11 @@ unset(ENABLE_CAT)
278270
unset(ARCHIVE_BUILD_SHARED_LIBS)
279271
unset(ENABLE_ZSTD)
280272
unset(ENABLE_LZMA)
281-
set(LibArchive_FOUND true CACHE BOOL "" FORCE)
282-
set(LibArchive_LIBRARIES archive_static CACHE FILEPATH "" FORCE)
283-
set(LibArchive_INCLUDE_DIR ${libarchive_SOURCE_DIR}/libarchive CACHE PATH "" FORCE)
284-
set(LibArchive_INCLUDE_DIRS ${libarchive_SOURCE_DIR}/libarchive CACHE PATH "" FORCE)
273+
# Set LibArchive variables for compatibility
274+
set(LibArchive_FOUND true CACHE BOOL "LibArchive library found")
275+
set(LibArchive_LIBRARIES archive_static CACHE STRING "LibArchive libraries")
276+
set(LibArchive_INCLUDE_DIR ${libarchive_SOURCE_DIR}/libarchive CACHE PATH "LibArchive include directory")
277+
set(LibArchive_INCLUDE_DIRS ${libarchive_SOURCE_DIR}/libarchive CACHE PATH "LibArchive include directories")
285278

286279
# Bundled libcurl
287280
set(CURL_VERSION "8.14.1")
@@ -427,10 +420,11 @@ unset(CURL_USE_SCHANNEL)
427420
unset(CURL_DEFAULT_SSL_BACKEND)
428421
unset(CURL_USE_GNUTLS)
429422

430-
set(CURL_FOUND true CACHE BOOL "" FORCE)
431-
set(CURL_LIBRARIES libcurl_static CACHE FILEPATH "" FORCE)
432-
set(CURL_INCLUDE_DIR ${curl_SOURCE_DIR}/include CACHE PATH "" FORCE)
433-
set(CURL_INCLUDE_DIRS ${curl_SOURCE_DIR}/include CACHE PATH "" FORCE)
423+
# Set CURL variables for compatibility
424+
set(CURL_FOUND true CACHE BOOL "CURL library found")
425+
set(CURL_LIBRARIES libcurl_static CACHE STRING "CURL libraries")
426+
set(CURL_INCLUDE_DIR ${curl_SOURCE_DIR}/include CACHE PATH "CURL include directory")
427+
set(CURL_INCLUDE_DIRS ${curl_SOURCE_DIR}/include CACHE PATH "CURL include directories")
434428

435429
# Adding headers explicity so they are displayed in Qt Creator
436430
set(HEADERS config.h imagewriter.h networkaccessmanagerfactory.h nan.h drivelistitem.h drivelistmodel.h drivelistmodelpollthread.h driveformatthread.h powersaveblocker.h cli.h
@@ -458,7 +452,7 @@ elseif (UNIX)
458452
)
459453
set(EXTRALIBS ${EXTRALIBS} GnuTLS::GnuTLS)
460454
set(DEPENDENCIES "")
461-
add_definitions(-DHAVE_GNUTLS)
455+
# Platform definitions will be added after target creation
462456
elseif (WIN32)
463457
set(PLATFORM_SOURCES
464458
acceleratedcryptographichash.cpp
@@ -471,11 +465,10 @@ elseif (WIN32)
471465
windows/openhdimagewriter.rc
472466
)
473467
set(EXTRALIBS setupapi wlanapi)
474-
add_definitions(-DHAVE_WINCRYPT)
475-
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
468+
# Platform definitions will be added after target creation
476469
endif()
477470

478-
include_directories(BEFORE .)
471+
# Include directories handled via target properties
479472

480473
# Test if we need libatomic
481474
include(CheckCXXSourceCompiles)
@@ -496,7 +489,7 @@ if (NOT atomicbuiltin)
496489
endif()
497490
endif()
498491

499-
include_directories(BEFORE .)
492+
# Include directories handled via target properties
500493

501494
# Test if we need libatomic
502495
include(CheckCXXSourceCompiles)
@@ -561,6 +554,39 @@ set_property(TARGET ${PROJECT_NAME} PROPERTY AUTOMOC ON)
561554
set_property(TARGET ${PROJECT_NAME} PROPERTY AUTORCC ON)
562555
set_property(TARGET ${PROJECT_NAME} PROPERTY AUTOUIC ON)
563556

557+
# Target-based compile definitions (modern CMake best practice)
558+
target_compile_definitions(${PROJECT_NAME} PRIVATE
559+
IMAGER_VERSION_STR="${IMAGER_VERSION_STR}"
560+
IMAGER_VERSION_CSV=${IMAGER_VERSION_CSV}
561+
$<$<BOOL:${ENABLE_TELEMETRY}>:TELEMETRY_ENABLED_DEFAULT=true>
562+
$<$<NOT:$<BOOL:${ENABLE_TELEMETRY}>>:TELEMETRY_ENABLED_DEFAULT=false>
563+
$<$<BOOL:${ENABLE_CHECK_VERSION}>:CHECK_VERSION_DEFAULT=true>
564+
$<$<NOT:$<BOOL:${ENABLE_CHECK_VERSION}>>:CHECK_VERSION_DEFAULT=false>
565+
)
566+
567+
# Platform-specific definitions
568+
if(UNIX AND NOT APPLE)
569+
target_compile_definitions(${PROJECT_NAME} PRIVATE HAVE_GNUTLS)
570+
elseif(WIN32)
571+
target_compile_definitions(${PROJECT_NAME} PRIVATE
572+
HAVE_WINCRYPT
573+
_CRT_SECURE_NO_WARNINGS
574+
WINVER=0x0A00
575+
_WIN32_WINNT=0x0A00
576+
NTDDI_VERSION=0x0A000000
577+
)
578+
endif()
579+
580+
# Target-based include directories (modern CMake best practice)
581+
target_include_directories(${PROJECT_NAME} PRIVATE
582+
${CMAKE_CURRENT_SOURCE_DIR}
583+
${CURL_INCLUDE_DIR}
584+
${LibArchive_INCLUDE_DIR}
585+
${LIBLZMA_INCLUDE_DIRS}
586+
${ZLIB_INCLUDE_DIRS}
587+
${ZSTD_INCLUDE_DIR}
588+
)
589+
564590
# Create lupdate target (after executable target is created)
565591
qt_add_lupdate(${PROJECT_NAME}
566592
TS_FILES ${TRANSLATIONS}
@@ -578,17 +604,7 @@ qt_add_lupdate(${PROJECT_NAME}
578604
# message(STATUS "LTO not supported: <${ipoerror}>")
579605
# endif()
580606

581-
if(ENABLE_TELEMETRY)
582-
add_definitions(-DTELEMETRY_ENABLED_DEFAULT=true)
583-
else()
584-
add_definitions(-DTELEMETRY_ENABLED_DEFAULT=false)
585-
endif()
586-
587-
if(ENABLE_CHECK_VERSION)
588-
add_definitions(-DCHECK_VERSION_DEFAULT=true)
589-
else()
590-
add_definitions(-DCHECK_VERSION_DEFAULT=false)
591-
endif()
607+
# Feature definitions will be added to target after creation
592608

593609
qt_policy(SET QTP0001 NEW)
594610

@@ -626,8 +642,7 @@ qt_add_qml_module(${PROJECT_NAME}
626642

627643
# Because dependencies are typically not available by default on Windows, build bundled code
628644
if (WIN32)
629-
# Target Windows 10, in line with Qt6 requirements
630-
add_definitions(-DWINVER=0x0A00 -D_WIN32_WINNT=0x0A00 -DNTDDI_VERSION=0x0A000000)
645+
# Target Windows 10, in line with Qt6 requirements (definitions added to target)
631646

632647
# Strip debug symbols
633648
add_custom_command(TARGET ${PROJECT_NAME}
@@ -725,7 +740,7 @@ endif()
725740
if(TARGET ZLIB::ZLIB)
726741
add_dependencies(${PROJECT_NAME} ZLIB::ZLIB)
727742
endif()
728-
include_directories(${CURL_INCLUDE_DIR} ${LibArchive_INCLUDE_DIR} ${LIBLZMA_INCLUDE_DIRS} ${ZLIB_INCLUDE_DIRS} ${ZSTD_INCLUDE_DIR})
743+
# Include directories will be set via target properties
729744

730745
# Set up ZLIB library variable for linking
731746
if(TARGET ZLIB::ZLIB)

0 commit comments

Comments
 (0)