target_link_optional_libraries.cmake 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. # This file is part of Desktop App Toolkit,
  2. # a set of libraries for developing nice desktop applications.
  3. #
  4. # For license and copyright information please follow this link:
  5. # https://github.com/desktop-app/legal/blob/master/LEGAL
  6. function(generate_implib)
  7. find_package(Python3 REQUIRED)
  8. set(gen_dst ${CMAKE_CURRENT_BINARY_DIR}/gen)
  9. file(MAKE_DIRECTORY ${gen_dst})
  10. foreach (lib ${ARGN})
  11. string(MAKE_C_IDENTIFIER ${lib} lib_identifier)
  12. find_library(DESKTOP_APP_${lib_identifier}_PATH ${lib} REQUIRED)
  13. get_filename_component(lib_file ${DESKTOP_APP_${lib_identifier}_PATH} NAME)
  14. set(gen_timestamp ${gen_dst}/implib_${lib_identifier}.timestamp)
  15. set(gen_files
  16. ${gen_dst}/${lib_file}.init.c
  17. ${gen_dst}/${lib_file}.tramp.S
  18. )
  19. add_custom_command(
  20. OUTPUT
  21. ${gen_timestamp}
  22. BYPRODUCTS
  23. ${gen_files}
  24. COMMAND
  25. ${Python3_EXECUTABLE}
  26. ${cmake_helpers_loc}/external/Implib.so/implib-gen.py
  27. -q
  28. -o
  29. ${gen_dst}
  30. ${DESKTOP_APP_${lib_identifier}_PATH}
  31. COMMAND
  32. echo 1> ${gen_timestamp}
  33. COMMENT "Generating dlopen helper for ${lib_file}"
  34. DEPENDS
  35. ${DESKTOP_APP_${lib_identifier}_PATH}
  36. )
  37. add_library(implib_${lib_identifier} STATIC)
  38. init_target(implib_${lib_identifier} "(gen)")
  39. generate_target(implib_${lib_identifier} timestamp ${gen_timestamp} "${gen_files}" ${gen_dst})
  40. endforeach()
  41. endfunction()
  42. function(target_link_optional_libraries target_name)
  43. set(writing_now "")
  44. set(private_libs "")
  45. set(public_libs "")
  46. set(interface_libs "")
  47. foreach (entry ${ARGN})
  48. if (${entry} STREQUAL "PRIVATE" OR ${entry} STREQUAL "PUBLIC" OR ${entry} STREQUAL "INTERFACE")
  49. set(writing_now ${entry})
  50. else()
  51. string(MAKE_C_IDENTIFIER ${entry} entry_identifier)
  52. if (NOT TARGET implib_${entry_identifier})
  53. generate_implib(${entry})
  54. endif()
  55. set(result
  56. $<LINK_ONLY:implib_${entry_identifier}>
  57. $<TARGET_FILE:implib_${entry_identifier}>
  58. )
  59. if ("${writing_now}" STREQUAL "PRIVATE")
  60. list(APPEND private_libs ${result})
  61. elseif ("${writing_now}" STREQUAL "PUBLIC")
  62. list(APPEND public_libs ${result})
  63. elseif ("${writing_now}" STREQUAL "INTERFACE")
  64. list(APPEND interface_libs ${result})
  65. else()
  66. message(FATAL_ERROR "Unknown libraries scope for target ${target_name}")
  67. endif()
  68. endif()
  69. endforeach()
  70. if (NOT "${public_libs}" STREQUAL "")
  71. target_link_libraries(${target_name} PUBLIC ${public_libs})
  72. endif()
  73. if (NOT "${private_libs}" STREQUAL "")
  74. target_link_libraries(${target_name} PRIVATE ${private_libs})
  75. endif()
  76. if (NOT "${interface_libs}" STREQUAL "")
  77. target_link_libraries(${target_name} INTERFACE ${interface_libs})
  78. endif()
  79. endfunction()