@@ -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" )
6970else ()
7071 # Priority 2 & 3: Try to find installed liblsl
7172 set (_lsl_hints)
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-
253243if (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 ()
282253else ()
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} " )
297256endif ()
298257
299258# =============================================================================
300259# Qt Deployment
301260# =============================================================================
302261if (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} " )
341263endif ()
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# =============================================================================
367273if (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 ()
412295endif ()
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
454303set (CPACK_PACKAGE_NAME "${PROJECT_NAME} " )
455304set (CPACK_PACKAGE_VERSION "${PROJECT_VERSION} " )
456305set (CPACK_PACKAGE_VENDOR "Labstreaminglayer" )
457306set (CPACK_PACKAGE_DESCRIPTION_SUMMARY "${PROJECT_DESCRIPTION} " )
458307set (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 } " )
460309set (CPACK_STRIP_FILES ON )
461310
462311if (WIN32 )
0 commit comments