Skip to content

Commit 341c403

Browse files
committed
Leverage LSLCMake.cmake
1 parent 9d0d4c5 commit 341c403

File tree

1 file changed

+31
-182
lines changed

1 file changed

+31
-182
lines changed

CMakeLists.txt

Lines changed: 31 additions & 182 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ if(LSL_SOURCE_DIR)
6666
add_library(LSL::lsl ALIAS lsl)
6767
endif()
6868
set(LSL_FOUND TRUE)
69+
include("${LSL_SOURCE_DIR}/cmake/LSLCMake.cmake")
6970
else()
7071
# Priority 2 & 3: Try to find installed liblsl
7172
set(_lsl_hints)
@@ -74,6 +75,9 @@ else()
7475
endif()
7576
# Common development layout hints (including CLion cmake-build-* directories)
7677
string(TOLOWER "${CMAKE_BUILD_TYPE}" _build_type_lower)
78+
if(NOT _build_type_lower)
79+
set(_build_type_lower "release")
80+
endif()
7781
if(MSVC)
7882
set(_clion_build_dir "cmake-build-${_build_type_lower}-visual-studio")
7983
else()
@@ -108,6 +112,7 @@ else()
108112

109113
if(LSL_FOUND)
110114
message(STATUS "Found installed liblsl: ${LSL_DIR}")
115+
include("${LSL_DIR}/LSLCMake.cmake")
111116
elseif(LSL_FETCH_IF_MISSING)
112117
# Priority 4: Fetch from GitHub
113118
message(STATUS "liblsl not found locally, fetching ${LSL_FETCH_REF} from GitHub...")
@@ -128,6 +133,7 @@ else()
128133
add_library(LSL::lsl ALIAS lsl)
129134
endif()
130135
set(LSL_FOUND TRUE)
136+
include("${liblsl_SOURCE_DIR}/cmake/LSLCMake.cmake")
131137
message(STATUS "liblsl fetched and configured")
132138
else()
133139
message(FATAL_ERROR
@@ -169,14 +175,7 @@ find_package(Threads REQUIRED)
169175
# =============================================================================
170176
# RPATH Configuration (must be set before targets are created)
171177
# =============================================================================
172-
if(APPLE)
173-
# CLI: @executable_path/Frameworks (from install root)
174-
# GUI: @executable_path/../Frameworks (inside .app bundle)
175-
set(CMAKE_INSTALL_RPATH "@executable_path/../Frameworks;@executable_path/Frameworks;@executable_path")
176-
elseif(UNIX AND NOT ANDROID)
177-
set(CMAKE_INSTALL_RPATH "$ORIGIN;$ORIGIN/../lib")
178-
endif()
179-
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
178+
LSL_configure_rpath()
180179

181180
# =============================================================================
182181
# Targets
@@ -241,222 +240,72 @@ install(FILES ${PROJECT_NAME}.cfg DESTINATION "${_config_dest}")
241240
# =============================================================================
242241
# Bundle liblsl with the application
243242
# =============================================================================
244-
# Detect if liblsl is from FetchContent (regular target) or find_package (imported)
245-
set(_lsl_is_fetched FALSE)
246-
if(TARGET lsl)
247-
get_target_property(_lsl_imported lsl IMPORTED)
248-
if(NOT _lsl_imported)
249-
set(_lsl_is_fetched TRUE)
250-
endif()
251-
endif()
252-
253243
if(APPLE)
254-
# macOS: Install framework to multiple destinations (GUI bundle + CLI)
255-
# We use install(CODE) because we need different destinations for GUI vs CLI
244+
# macOS: Install framework to GUI bundle and/or CLI Frameworks directory
256245
if(LSLTEMPLATE_BUILD_GUI)
257-
install(CODE "
258-
set(_lsl_binary \"$<TARGET_FILE:LSL::lsl>\")
259-
cmake_path(GET _lsl_binary PARENT_PATH _lsl_fw_dir) # Versions/A
260-
cmake_path(GET _lsl_fw_dir PARENT_PATH _lsl_fw_dir) # Versions
261-
cmake_path(GET _lsl_fw_dir PARENT_PATH _lsl_fw_dir) # lsl.framework
262-
message(STATUS \"Bundling lsl.framework for GUI from: \${_lsl_fw_dir}\")
263-
file(COPY \"\${_lsl_fw_dir}\"
264-
DESTINATION \"\${CMAKE_INSTALL_PREFIX}/${INSTALL_BINDIR}/${PROJECT_NAME}.app/Contents/Frameworks\"
265-
USE_SOURCE_PERMISSIONS
266-
)
267-
")
246+
LSL_install_liblsl(
247+
FRAMEWORK_DESTINATION "${INSTALL_BINDIR}/${PROJECT_NAME}.app/Contents/Frameworks"
248+
)
268249
endif()
269250
if(LSLTEMPLATE_BUILD_CLI)
270-
install(CODE "
271-
set(_lsl_binary \"$<TARGET_FILE:LSL::lsl>\")
272-
cmake_path(GET _lsl_binary PARENT_PATH _lsl_fw_dir)
273-
cmake_path(GET _lsl_fw_dir PARENT_PATH _lsl_fw_dir)
274-
cmake_path(GET _lsl_fw_dir PARENT_PATH _lsl_fw_dir)
275-
message(STATUS \"Bundling lsl.framework for CLI from: \${_lsl_fw_dir}\")
276-
file(COPY \"\${_lsl_fw_dir}\"
277-
DESTINATION \"\${CMAKE_INSTALL_PREFIX}/Frameworks\"
278-
USE_SOURCE_PERMISSIONS
279-
)
280-
")
251+
LSL_install_liblsl(FRAMEWORK_DESTINATION "Frameworks")
281252
endif()
282253
else()
283-
# Windows/Linux: Use modern CMake install commands that handle symlinks properly
284-
if(_lsl_is_fetched)
285-
# FetchContent: install the target directly
286-
install(TARGETS lsl
287-
RUNTIME DESTINATION "${INSTALL_BINDIR}" # Windows DLLs
288-
LIBRARY DESTINATION "${INSTALL_LIBDIR}" # Linux .so with symlinks
289-
)
290-
else()
291-
# find_package: install imported runtime artifacts (CMake 3.21+)
292-
install(IMPORTED_RUNTIME_ARTIFACTS LSL::lsl
293-
RUNTIME DESTINATION "${INSTALL_BINDIR}"
294-
LIBRARY DESTINATION "${INSTALL_LIBDIR}"
295-
)
296-
endif()
254+
# Windows/Linux: Single install location for all targets
255+
LSL_install_liblsl(DESTINATION "${INSTALL_LIBDIR}")
297256
endif()
298257

299258
# =============================================================================
300259
# Qt Deployment
301260
# =============================================================================
302261
if(LSLTEMPLATE_BUILD_GUI)
303-
get_target_property(QT_QMAKE_EXECUTABLE Qt6::qmake IMPORTED_LOCATION)
304-
get_filename_component(QT_BIN_DIR "${QT_QMAKE_EXECUTABLE}" DIRECTORY)
305-
306-
if(WIN32)
307-
find_program(WINDEPLOYQT_EXECUTABLE windeployqt HINTS "${QT_BIN_DIR}")
308-
if(WINDEPLOYQT_EXECUTABLE)
309-
install(CODE "
310-
message(STATUS \"Running windeployqt...\")
311-
execute_process(
312-
COMMAND \"${WINDEPLOYQT_EXECUTABLE}\"
313-
--no-translations
314-
--no-system-d3d-compiler
315-
--no-opengl-sw
316-
--no-compiler-runtime
317-
--dir \"\${CMAKE_INSTALL_PREFIX}/${INSTALL_BINDIR}\"
318-
\"\${CMAKE_INSTALL_PREFIX}/${INSTALL_BINDIR}/${PROJECT_NAME}.exe\"
319-
)
320-
")
321-
endif()
322-
elseif(APPLE)
323-
find_program(MACDEPLOYQT_EXECUTABLE macdeployqt HINTS "${QT_BIN_DIR}")
324-
if(MACDEPLOYQT_EXECUTABLE)
325-
install(CODE "
326-
message(STATUS \"Running macdeployqt...\")
327-
execute_process(
328-
COMMAND \"${MACDEPLOYQT_EXECUTABLE}\"
329-
\"\${CMAKE_INSTALL_PREFIX}/${INSTALL_BINDIR}/${PROJECT_NAME}.app\"
330-
-verbose=0
331-
-always-overwrite
332-
RESULT_VARIABLE _deploy_result
333-
ERROR_QUIET
334-
)
335-
if(NOT _deploy_result EQUAL 0)
336-
message(WARNING \"macdeployqt returned \${_deploy_result}\")
337-
endif()
338-
")
339-
endif()
340-
endif()
262+
LSL_deploy_qt(TARGET "${PROJECT_NAME}" DESTINATION "${INSTALL_BINDIR}")
341263
endif()
342264

343265
# =============================================================================
344266
# MinGW Runtime Deployment
345-
# Copy MinGW runtime DLLs so executables work outside the build environment
346267
# =============================================================================
347-
if(MINGW)
348-
get_filename_component(MINGW_BIN_DIR "${CMAKE_CXX_COMPILER}" DIRECTORY)
349-
set(MINGW_RUNTIME_DLLS
350-
"${MINGW_BIN_DIR}/libgcc_s_seh-1.dll"
351-
"${MINGW_BIN_DIR}/libstdc++-6.dll"
352-
"${MINGW_BIN_DIR}/libwinpthread-1.dll"
353-
)
354-
foreach(_dll ${MINGW_RUNTIME_DLLS})
355-
if(EXISTS "${_dll}")
356-
install(FILES "${_dll}" DESTINATION "${INSTALL_BINDIR}")
357-
endif()
358-
endforeach()
359-
endif()
268+
LSL_install_mingw_runtime(DESTINATION "${INSTALL_BINDIR}")
360269

361270
# =============================================================================
362271
# macOS: Code Sign
363-
# This runs after Qt deployment. We sign the entire bundle with entitlements.
364-
# The lsl.framework is copied with its original install_name (@rpath/lsl.framework/Versions/A/lsl)
365-
# so no install_name_tool fixups are needed.
366272
# =============================================================================
367273
if(APPLE)
368274
set(MACOSX_BUNDLE_GUI_IDENTIFIER "org.labstreaminglayer.${PROJECT_NAME}")
369275
set(MACOSX_BUNDLE_BUNDLE_VERSION "${PROJECT_VERSION}")
370276
set(MACOSX_BUNDLE_SHORT_VERSION_STRING "${PROJECT_VERSION}")
371277

372-
# Sign GUI app bundle
373278
if(LSLTEMPLATE_BUILD_GUI)
374-
install(CODE "
375-
set(_app \"\${CMAKE_INSTALL_PREFIX}/${INSTALL_BINDIR}/${PROJECT_NAME}.app\")
376-
set(_ent \"${CMAKE_CURRENT_SOURCE_DIR}/app.entitlements\")
377-
378-
# Sign the entire bundle (ad-hoc signature for local development)
379-
# --deep signs all nested code including frameworks
380-
message(STATUS \"Signing app bundle...\")
381-
execute_process(
382-
COMMAND codesign --force --deep --sign - --entitlements \"\${_ent}\" \"\${_app}\"
383-
RESULT_VARIABLE _sign_result
384-
)
385-
386-
# Verify
387-
execute_process(COMMAND codesign --verify --verbose \"\${_app}\" RESULT_VARIABLE _verify_result)
388-
if(_verify_result EQUAL 0)
389-
message(STATUS \"App bundle signature verified successfully\")
390-
else()
391-
message(WARNING \"App bundle signature verification failed!\")
392-
endif()
393-
")
279+
LSL_codesign(
280+
TARGET "${PROJECT_NAME}"
281+
DESTINATION "${INSTALL_BINDIR}"
282+
ENTITLEMENTS "${CMAKE_CURRENT_SOURCE_DIR}/app.entitlements"
283+
BUNDLE
284+
)
394285
endif()
395286

396-
# Sign CLI and its framework
397287
if(LSLTEMPLATE_BUILD_CLI)
398-
install(CODE "
399-
set(_fw \"\${CMAKE_INSTALL_PREFIX}/Frameworks/lsl.framework\")
400-
set(_exe \"\${CMAKE_INSTALL_PREFIX}/${INSTALL_BINDIR}/${PROJECT_NAME}CLI\")
401-
set(_ent \"${CMAKE_CURRENT_SOURCE_DIR}/app.entitlements\")
402-
403-
# Sign the framework first
404-
message(STATUS \"Signing lsl.framework for CLI...\")
405-
execute_process(COMMAND codesign --force --sign - \"\${_fw}\")
406-
407-
# Sign CLI executable
408-
message(STATUS \"Signing CLI...\")
409-
execute_process(COMMAND codesign --force --sign - --entitlements \"\${_ent}\" \"\${_exe}\")
410-
")
288+
LSL_codesign(
289+
TARGET "${PROJECT_NAME}CLI"
290+
DESTINATION "${INSTALL_BINDIR}"
291+
ENTITLEMENTS "${CMAKE_CURRENT_SOURCE_DIR}/app.entitlements"
292+
FRAMEWORK "Frameworks/lsl.framework"
293+
)
411294
endif()
412295
endif()
413296

414297
# =============================================================================
415298
# CPack Configuration
416299
# =============================================================================
417-
418-
# Detect target architecture for package naming
419-
if(CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64|arm64|ARM64)")
420-
set(PACKAGE_ARCH "arm64")
421-
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(x86_64|amd64|AMD64)")
422-
set(PACKAGE_ARCH "amd64")
423-
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(armv7|arm)")
424-
set(PACKAGE_ARCH "armhf")
425-
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(i.86|x86)")
426-
set(PACKAGE_ARCH "i386")
427-
else()
428-
set(PACKAGE_ARCH "${CMAKE_SYSTEM_PROCESSOR}")
429-
endif()
430-
431-
# Detect OS for package naming
432-
if(APPLE)
433-
set(PACKAGE_OS "macOS")
434-
elseif(WIN32)
435-
set(PACKAGE_OS "Win")
436-
else()
437-
# Try to get distro codename (e.g., "jammy", "noble")
438-
find_program(LSB_RELEASE lsb_release)
439-
if(LSB_RELEASE)
440-
execute_process(COMMAND ${LSB_RELEASE} -cs
441-
OUTPUT_VARIABLE _codename
442-
OUTPUT_STRIP_TRAILING_WHITESPACE
443-
ERROR_QUIET)
444-
if(_codename AND NOT _codename STREQUAL "n/a")
445-
set(PACKAGE_OS "${_codename}")
446-
else()
447-
set(PACKAGE_OS "Linux")
448-
endif()
449-
else()
450-
set(PACKAGE_OS "Linux")
451-
endif()
452-
endif()
300+
LSL_get_target_arch()
301+
LSL_get_os_name()
453302

454303
set(CPACK_PACKAGE_NAME "${PROJECT_NAME}")
455304
set(CPACK_PACKAGE_VERSION "${PROJECT_VERSION}")
456305
set(CPACK_PACKAGE_VENDOR "Labstreaminglayer")
457306
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "${PROJECT_DESCRIPTION}")
458307
set(CPACK_PACKAGE_HOMEPAGE_URL "${PROJECT_HOMEPAGE_URL}")
459-
set(CPACK_PACKAGE_FILE_NAME "${PROJECT_NAME}-${PROJECT_VERSION}-${PACKAGE_OS}_${PACKAGE_ARCH}")
308+
set(CPACK_PACKAGE_FILE_NAME "${PROJECT_NAME}-${PROJECT_VERSION}-${LSL_OS}_${LSL_ARCH}")
460309
set(CPACK_STRIP_FILES ON)
461310

462311
if(WIN32)

0 commit comments

Comments
 (0)