CMakeLists.txt 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. #
  2. # Cmake configuration file
  3. #
  4. ############################# INITIAL SECTION ##########################
  5. cmake_minimum_required(VERSION 3.10)
  6. project(lgspkctl C)
  7. set(PACKAGE_VERSION_MAJOR 1)
  8. set(PACKAGE_VERSION_MINOR 0)
  9. set(PACKAGE_VERSION_PATCH 0)
  10. set(PACKAGE_NAME "${PROJECT_NAME}")
  11. set(PACKAGE_VERSION "${PACKAGE_VERSION_MAJOR}.${PACKAGE_VERSION_MINOR}.${PACKAGE_VERSION_PATCH}")
  12. set(PACKAGE_URL "https://github.com/rozhuk-im/lgspkctl")
  13. set(PACKAGE_BUGREPORT "https://github.com/rozhuk-im/lgspkctl")
  14. set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}")
  15. set(PACKAGE_DESCRIPTION "Tool to control and configure LG sounbar")
  16. set(PACKAGE_TARNAME "${PACKAGE_NAME}-${PACKAGE_VERSION}")
  17. ############################# OPTIONS SECTION ##########################
  18. ############################# INCLUDE SECTION ##########################
  19. include(CheckIncludeFiles)
  20. include(CheckFunctionExists)
  21. include(CheckSymbolExists)
  22. include(CheckCCompilerFlag)
  23. find_library(PTHREAD_LIBRARY pthread)
  24. list(APPEND CMAKE_REQUIRED_LIBRARIES ${PTHREAD_LIBRARY})
  25. find_package(PkgConfig REQUIRED)
  26. find_package(OpenSSL REQUIRED)
  27. include_directories(${OPENSSL_INCLUDE_DIRS})
  28. link_directories(${OPENSSL_LIBRARIES})
  29. list(APPEND CMAKE_REQUIRED_LIBRARIES ${OPENSSL_LIBRARIES})
  30. ############################# MACRO SECTION ############################
  31. macro(try_c_flag prop flag)
  32. # Try flag once on the C compiler
  33. check_c_compiler_flag("-Werror ${flag}" C_FLAG_${prop})
  34. if (C_FLAG_${prop})
  35. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${flag}")
  36. endif()
  37. endmacro()
  38. macro(try_linker_flag prop flag)
  39. # Check with the C compiler
  40. set(CMAKE_REQUIRED_FLAGS ${flag})
  41. check_c_compiler_flag(${flag} LINKER_FLAG_${prop})
  42. set(CMAKE_REQUIRED_FLAGS "")
  43. if (LINKER_FLAG_${prop})
  44. set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${flag}")
  45. set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${flag}")
  46. set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${flag}")
  47. endif()
  48. endmacro()
  49. ############################# CONFIG SECTION ###########################
  50. # Prefer local include dirs to system ones.
  51. include_directories("${CMAKE_CURRENT_SOURCE_DIR}/"
  52. "${CMAKE_CURRENT_SOURCE_DIR}/src"
  53. "${CMAKE_CURRENT_SOURCE_DIR}/lib/json"
  54. "${CMAKE_BINARY_DIR}/src")
  55. # Platform specific configuration.
  56. set(TAR "tar")
  57. if (CMAKE_SYSTEM_NAME MATCHES "^.*BSD$|DragonFly")
  58. set(TAR "gtar")
  59. endif()
  60. if (CMAKE_SYSTEM_NAME STREQUAL "Darwin")
  61. set(TAR "gnutar")
  62. endif()
  63. try_c_flag(PIPE "-pipe")
  64. try_c_flag(NO_DEL_NULL_PTR_CHKS "-fno-delete-null-pointer-checks")
  65. if (CMAKE_BUILD_TYPE MATCHES "Debug")
  66. # Process with warn flags.
  67. try_c_flag(W "-W")
  68. try_c_flag(WALL "-Wall")
  69. try_c_flag(WEVERYTHING "-Weverything")
  70. if (NOT C_FLAG_WEVERYTHING)
  71. try_c_flag(WPOINTER "-Wpointer-arith")
  72. try_c_flag(WSTRICT_PROTOTYPES "-Wstrict-prototypes")
  73. try_c_flag(PEDANTIC "-pedantic")
  74. try_c_flag(WNULL_DEREFERENCE "-Wnull-dereference")
  75. try_c_flag(WDUPLICATED_COND "-Wduplicated-cond")
  76. try_c_flag(WIMPLICIT_FALLTHROUGH "-Wimplicit-fallthrough")
  77. endif()
  78. try_c_flag(WCAST_FN_TYPE_STRICT "-Wno-cast-function-type-strict")
  79. try_c_flag(WCAST_QUAL "-Wno-cast-qual")
  80. try_c_flag(WDOCUMENTATION "-Wno-documentation")
  81. try_c_flag(WDOC_UNKNOWN_CMD "-Wno-documentation-unknown-command")
  82. try_c_flag(WPADDED "-Wno-padded")
  83. #try_c_flag(WPOINTER_SIGN "-Wno-pointer-sign")
  84. #try_c_flag(WRESERVED_ID_MACRO "-Wno-reserved-id-macro")
  85. try_c_flag(WRESERVED_IDENTIFIER "-Wno-reserved-identifier")
  86. #try_c_flag(WSIGN_COMPARE "-Wno-sign-compare")
  87. try_c_flag(WSWITCH_ENUM "-Wno-switch-enum")
  88. #try_c_flag(WUNUSED_CONST "-Wno-unused-const-variable")
  89. #try_c_flag(WUNUSED_FUNCTION "-Wno-unused-function")
  90. #try_c_flag(WUNUSED_PARAM "-Wno-unused-parameter")
  91. #try_c_flag(WUNUSED_VAR "-Wno-unused-variable")
  92. try_c_flag(WUNSAFE_BUFFER_USAGE "-Wno-unsafe-buffer-usage")
  93. try_c_flag(WVARIADIC_MACROS "-Wno-variadic-macros")
  94. try_c_flag(WGNU_ZERO_VAR_MACRO_ARGS "-Wno-gnu-zero-variadic-macro-arguments")
  95. try_c_flag(WZERO_LENGTH_ARRAY "-Wno-zero-length-array")
  96. set(CMAKE_INSTALL_DO_STRIP FALSE)
  97. set(CMAKE_C_OPT_FLAGS "-g3 -ggdb -O0")
  98. message(STATUS "Adding -DDEBUG to definitions.")
  99. add_definitions(-DDEBUG)
  100. else()
  101. set(CMAKE_INSTALL_DO_STRIP TRUE)
  102. message(STATUS "Adding -DNDEBUG to definitions.")
  103. add_definitions(-DNDEBUG)
  104. endif()
  105. message(STATUS "Building in ${CMAKE_BUILD_TYPE} mode.")
  106. message(STATUS "CMAKE_INSTALL_DO_STRIP is ${CMAKE_INSTALL_DO_STRIP}.")
  107. if (NOT "${CMAKE_C_COMPILER_ID}" MATCHES SunPro)
  108. try_c_flag(STD11 "-std=c11")
  109. if (NOT C_FLAG_STD11)
  110. try_c_flag(STD99 "-std=c99")
  111. endif()
  112. endif()
  113. # Hardening flags
  114. try_c_flag(FORTIFY_SOURCE2 "-D_FORTIFY_SOURCE=2")
  115. try_c_flag(FSTACK_PROTECTOR_ALL "-fstack-protector-all")
  116. try_c_flag(FSANITIZE_SAFE_STACK "-fsanitize=safe-stack")
  117. try_c_flag(FSANITIZE_CFI "-fsanitize=cfi")
  118. try_c_flag(MRETPOLINE "-mretpoline")
  119. try_c_flag(MFUNCTION_RETURN "-mfunction-return=thunk")
  120. try_c_flag(MINDIRECT_BRANCH "-mindirect-branch=thunk")
  121. try_c_flag(FWRAPV "-fwrapv")
  122. try_c_flag(FPIE "-fPIE")
  123. if (C_FLAG_FPIE)
  124. try_linker_flag(PIE "-pie")
  125. endif()
  126. try_linker_flag(RETPOLINEPLT "-Wl,-z,retpolineplt")
  127. try_linker_flag(ZRELRO "-Wl,-z,relro")
  128. try_linker_flag(ZNOW "-Wl,-z,now")
  129. try_linker_flag(ZNOEXECSTACK "-Wl,-z,noexecstack")
  130. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_OPT_FLAGS}")
  131. # Silently strip whitespace
  132. string(STRIP "${CMAKE_C_FLAGS}" CMAKE_C_FLAGS)
  133. string(STRIP "${CMAKE_EXE_LINKER_FLAGS}" CMAKE_EXE_LINKER_FLAGS)
  134. string(STRIP "${CMAKE_MODULE_LINKER_FLAGS}" CMAKE_MODULE_LINKER_FLAGS)
  135. string(STRIP "${CMAKE_SHARED_LINKER_FLAGS}" CMAKE_SHARED_LINKER_FLAGS)
  136. configure_file(config.h.cmake src/config.h)
  137. add_definitions(-DHAVE_CONFIG_H)
  138. ################################ SUBDIRS SECTION #######################
  139. include(lib/liblcb/CMakeLists.txt)
  140. add_subdirectory(src)
  141. ############################ TARGETS SECTION ###########################
  142. add_custom_target(dist ${CMAKE_CURRENT_SOURCE_DIR}/dist.sh
  143. "${CMAKE_BINARY_DIR}/${PACKAGE_TARNAME}.tar.xz" "${TAR}"
  144. COMMENT "Create source distribution"
  145. WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
  146. ##################### INSTALLATION #####################################