CMakeLists.txt 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. # libclipboard cmake configuration file
  2. cmake_minimum_required(VERSION 2.8)
  3. project(libclipboard)
  4. # Defines and options
  5. set(LIBCLIPBOARD_VERSION_MAJOR 1 CACHE STRING "libclipboard major version number")
  6. set(LIBCLIPBOARD_VERSION_MINOR 0 CACHE STRING "libclipboard minor version number")
  7. set(LIBCLIPBOARD_VERSION "${LIBCLIPBOARD_VERSION_MAJOR}.${LIBCLIPBOARD_VERSION_MINOR}" CACHE STRING "libclipboard version number")
  8. option(LIBCLIPBOARD_FORCE_WIN32 "Force building the Win32 backend (default:off)" OFF)
  9. option(LIBCLIPBOARD_FORCE_X11 "Force building the X11 backend (default:off)" OFF)
  10. option(LIBCLIPBOARD_FORCE_COCOA "Force building the Cocoa backend(default:off)" OFF)
  11. option(LIBCLIPBOARD_ADD_SOVERSION "Add soname versions to the built library (default:off)" OFF)
  12. option(LIBCLIPBOARD_USE_STDCALL "Use the stdcall calling convention (default:off)" OFF)
  13. option(BUILD_SHARED_LIBS "Build shared libraries instead of static libraries" OFF)
  14. set(LIBCLIPBOARD_BUILD_SHARED ${BUILD_SHARED_LIBS})
  15. # Sigh... gtest quirks workarounds
  16. if (MINGW)
  17. option(gtest_disable_pthreads "Disable gtest pthreads (default:on)" ON)
  18. elseif(MSVC)
  19. option(gtest_force_shared_crt "Always use dynamic runtime library (default:on)" ON)
  20. endif()
  21. # Check supplied options make sense
  22. if ((WIN32 OR CYGWIN OR LIBCLIPBOARD_FORCE_WIN32) AND NOT (LIBCLIPBOARD_FORCE_X11 OR LIBCLIPBOARD_FORCE_COCOA))
  23. set(LIBCLIPBOARD_BUILD_WIN32 TRUE)
  24. endif()
  25. if (((UNIX AND NOT APPLE) OR LIBCLIPBOARD_FORCE_X11) AND NOT (LIBCLIPBOARD_FORCE_WIN32 OR LIBCLIPBOARD_FORCE_COCOA))
  26. set(LIBCLIPBOARD_BUILD_X11 TRUE)
  27. endif()
  28. if ((APPLE OR LIBCLIPBOARD_FORCE_COCOA) AND NOT (LIBCLIPBOARD_FORCE_WIN32 OR LIBCLIPBOARD_FORCE_X11))
  29. set(LIBCLIPBOARD_BUILD_COCOA TRUE)
  30. endif()
  31. if (NOT (LIBCLIPBOARD_BUILD_WIN32 OR LIBCLIPBOARD_BUILD_X11 OR LIBCLIPBOARD_BUILD_COCOA))
  32. message(FATAL_ERROR "Invalid build options. Can only specify one backend to be built.")
  33. endif()
  34. # Set compiler flags
  35. if (CMAKE_COMPILER_IS_GNUCC OR LIBCLIPBOARD_BUILD_COCOA)
  36. set(GCC_COMPILE_FLAGS "-std=c99 -Wall -pedantic -g")
  37. execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion
  38. OUTPUT_VARIABLE GCC_VERSION)
  39. if (GCC_VERSION VERSION_GREATER 4.9 OR GCC_VERSION VERSION_EQUAL 4.9)
  40. set(GCC_COMPILE_FLAGS "${GCC_COMPILE_FLAGS} -fdiagnostics-color=auto")
  41. endif()
  42. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${GCC_COMPILE_FLAGS}")
  43. endif()
  44. if (CMAKE_COMPILER_IS_GNUCXX OR LIBCLIPBOARD_BUILD_COCOA)
  45. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -pedantic -g")
  46. endif()
  47. # Dependencies
  48. if (LIBCLIPBOARD_BUILD_COCOA)
  49. set_source_files_properties(src/clipboard_cocoa.c PROPERTIES COMPILE_FLAGS "-x objective-c")
  50. set(LIBCLIPBOARD_PRIVATE_LIBS ${LIBCLIPBOARD_PRIVATE_LIBS} "-framework Cocoa")
  51. elseif(LIBCLIPBOARD_BUILD_X11)
  52. include(FindPkgConfig REQUIRED)
  53. pkg_check_modules(X11 xcb REQUIRED)
  54. find_package(Threads REQUIRED)
  55. include_directories(${X11_INCLUDE_DIRS})
  56. link_directories(${X11_LIBRARY_DIRS})
  57. set(LIBCLIPBOARD_PRIVATE_LIBS ${LIBCLIPBOARD_PRIVATE_LIBS} ${X11_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT})
  58. endif()
  59. # Include directories
  60. include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include")
  61. include_directories("${CMAKE_CURRENT_BINARY_DIR}/include")
  62. # Configure header
  63. configure_file("include/libclipboard-config.h.in" "include/libclipboard-config.h")
  64. # Source files
  65. set(HEADERS
  66. include/libclipboard.h
  67. ${CMAKE_CURRENT_BINARY_DIR}/include/libclipboard-config.h
  68. )
  69. set(SOURCE
  70. src/clipboard_win32.c
  71. src/clipboard_x11.c
  72. src/clipboard_cocoa.c
  73. src/clipboard_common.c
  74. )
  75. # Set the output folders
  76. set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
  77. set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
  78. set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
  79. # Make the library
  80. add_library(clipboard ${HEADERS} ${SOURCE})
  81. target_link_libraries(clipboard LINK_PRIVATE ${LIBCLIPBOARD_PRIVATE_LIBS})
  82. if (LIBCLIPBOARD_ADD_SOVERSION)
  83. # Not by default because my file system doesn't support symlinks
  84. set_target_properties(clipboard PROPERTIES SOVERSION ${LIBCLIPBOARD_VERSION} VERSION ${LIBCLIPBOARD_VERSION})
  85. endif()
  86. # Testing mode?
  87. if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/third_party/googletest/googletest)
  88. # gtest does not play well with pthreads and mingw
  89. if (gtest_disable_pthreads)
  90. set(LIBCLIPBOARD_USE_PTHREADS_INIT ${CMAKE_USE_PTHREADS_INIT})
  91. unset(CMAKE_USE_PTHREADS_INIT)
  92. endif()
  93. add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/third_party/googletest EXCLUDE_FROM_ALL)
  94. enable_testing()
  95. include_directories(${gtest_SOURCE_DIR}/include ${gtest_SOURCE_DIR})
  96. add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/test)
  97. set(CMAKE_USE_PTHREADS_INIT ${LIBCLIPBOARD_USE_PTHREADS_INIT})
  98. else()
  99. endif()
  100. # Build sample executables
  101. add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/samples)
  102. # Pkgconfig
  103. include(FindPkgConfig QUIET)
  104. if (PKGCONFIG_FOUND)
  105. string(REPLACE "-l" "" LIBCLIPBOARD_PRIVATE_LIBS_LIST "${LIBCLIPBOARD_PRIVATE_LIBS}")
  106. string(REPLACE ";" " -l" LIBCLIPBOARD_PRIVATE_LIBS_LIST "${LIBCLIPBOARD_PRIVATE_LIBS_LIST}")
  107. string(STRIP "${LIBCLIPBOARD_PRIVATE_LIBS_LIST}" LIBCLIPBOARD_PRIVATE_LIBS_LIST)
  108. configure_file("libclipboard.pc.in" "${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/pkgconfig/libclipboard.pc" @ONLY)
  109. install(FILES "${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/pkgconfig/libclipboard.pc" DESTINATION "lib/pkgconfig")
  110. endif()
  111. # Install options
  112. install(TARGETS clipboard
  113. RUNTIME DESTINATION bin
  114. LIBRARY DESTINATION lib
  115. ARCHIVE DESTINATION lib)
  116. install(FILES ${HEADERS} DESTINATION include)
  117. # Uninstall target
  118. configure_file(
  119. "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
  120. "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
  121. IMMEDIATE @ONLY)
  122. add_custom_target(uninstall
  123. COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)