cef_macros.cmake 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387
  1. # Copyright (c) 2016 The Chromium Embedded Framework Authors. All rights
  2. # reserved. Use of this source code is governed by a BSD-style license that
  3. # can be found in the LICENSE file.
  4. # Must be loaded via FindCEF.cmake.
  5. if(NOT DEFINED _CEF_ROOT_EXPLICIT)
  6. message(FATAL_ERROR "Use find_package(CEF) to load this file.")
  7. endif()
  8. #
  9. # Shared macros.
  10. #
  11. # Print the current CEF configuration.
  12. macro(PRINT_CEF_CONFIG)
  13. message(STATUS "*** CEF CONFIGURATION SETTINGS ***")
  14. message(STATUS "Generator: ${CMAKE_GENERATOR}")
  15. message(STATUS "Platform: ${CMAKE_SYSTEM_NAME}")
  16. message(STATUS "Project architecture: ${PROJECT_ARCH}")
  17. if(GEN_NINJA OR GEN_MAKEFILES)
  18. message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
  19. endif()
  20. message(STATUS "Binary distribution root: ${_CEF_ROOT}")
  21. if(OS_MAC)
  22. message(STATUS "Base SDK: ${CMAKE_OSX_SYSROOT}")
  23. message(STATUS "Target SDK: ${CEF_TARGET_SDK}")
  24. endif()
  25. if(OS_WINDOWS)
  26. message(STATUS "Visual Studio ATL support: ${USE_ATL}")
  27. endif()
  28. message(STATUS "CEF sandbox: ${USE_SANDBOX}")
  29. set(_libraries ${CEF_STANDARD_LIBS})
  30. if(OS_WINDOWS AND USE_SANDBOX)
  31. list(APPEND _libraries ${CEF_SANDBOX_STANDARD_LIBS})
  32. endif()
  33. message(STATUS "Standard libraries: ${_libraries}")
  34. message(STATUS "Compile defines: ${CEF_COMPILER_DEFINES}")
  35. message(STATUS "Compile defines (Debug): ${CEF_COMPILER_DEFINES_DEBUG}")
  36. message(STATUS "Compile defines (Release): ${CEF_COMPILER_DEFINES_RELEASE}")
  37. message(STATUS "C compile flags: ${CEF_COMPILER_FLAGS} ${CEF_C_COMPILER_FLAGS}")
  38. message(STATUS "C compile flags (Debug): ${CEF_COMPILER_FLAGS_DEBUG} ${CEF_C_COMPILER_FLAGS_DEBUG}")
  39. message(STATUS "C compile flags (Release): ${CEF_COMPILER_FLAGS_RELEASE} ${CEF_C_COMPILER_FLAGS_RELEASE}")
  40. message(STATUS "C++ compile flags: ${CEF_COMPILER_FLAGS} ${CEF_CXX_COMPILER_FLAGS}")
  41. message(STATUS "C++ compile flags (Debug): ${CEF_COMPILER_FLAGS_DEBUG} ${CEF_CXX_COMPILER_FLAGS_DEBUG}")
  42. message(STATUS "C++ compile flags (Release): ${CEF_COMPILER_FLAGS_RELEASE} ${CEF_CXX_COMPILER_FLAGS_RELEASE}")
  43. message(STATUS "Exe link flags: ${CEF_LINKER_FLAGS} ${CEF_EXE_LINKER_FLAGS}")
  44. message(STATUS "Exe link flags (Debug): ${CEF_LINKER_FLAGS_DEBUG} ${CEF_EXE_LINKER_FLAGS_DEBUG}")
  45. message(STATUS "Exe link flags (Release): ${CEF_LINKER_FLAGS_RELEASE} ${CEF_EXE_LINKER_FLAGS_RELEASE}")
  46. message(STATUS "Shared link flags: ${CEF_LINKER_FLAGS} ${CEF_SHARED_LINKER_FLAGS}")
  47. message(STATUS "Shared link flags (Debug): ${CEF_LINKER_FLAGS_DEBUG} ${CEF_SHARED_LINKER_FLAGS_DEBUG}")
  48. message(STATUS "Shared link flags (Release): ${CEF_LINKER_FLAGS_RELEASE} ${CEF_SHARED_LINKER_FLAGS_RELEASE}")
  49. if(OS_LINUX OR OS_WINDOWS)
  50. message(STATUS "CEF Binary files: ${CEF_BINARY_FILES}")
  51. message(STATUS "CEF Resource files: ${CEF_RESOURCE_FILES}")
  52. endif()
  53. endmacro()
  54. # Append platform specific sources to a list of sources.
  55. macro(APPEND_PLATFORM_SOURCES name_of_list)
  56. if(OS_LINUX AND ${name_of_list}_LINUX)
  57. list(APPEND ${name_of_list} ${${name_of_list}_LINUX})
  58. endif()
  59. if(OS_POSIX AND ${name_of_list}_POSIX)
  60. list(APPEND ${name_of_list} ${${name_of_list}_POSIX})
  61. endif()
  62. if(OS_WINDOWS AND ${name_of_list}_WINDOWS)
  63. list(APPEND ${name_of_list} ${${name_of_list}_WINDOWS})
  64. endif()
  65. if(OS_MAC AND ${name_of_list}_MAC)
  66. list(APPEND ${name_of_list} ${${name_of_list}_MAC})
  67. endif()
  68. endmacro()
  69. # Determine the target output directory based on platform and generator.
  70. macro(SET_CEF_TARGET_OUT_DIR)
  71. if(GEN_NINJA OR GEN_MAKEFILES)
  72. # By default Ninja and Make builds don't create a subdirectory named after
  73. # the configuration.
  74. set(CEF_TARGET_OUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE}")
  75. # Output binaries (executables, libraries) to the correct directory.
  76. set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CEF_TARGET_OUT_DIR})
  77. set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CEF_TARGET_OUT_DIR})
  78. else()
  79. set(CEF_TARGET_OUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/$<CONFIGURATION>")
  80. endif()
  81. endmacro()
  82. # Copy a list of files from one directory to another. Relative file paths are maintained.
  83. macro(COPY_FILES target file_list source_dir target_dir)
  84. foreach(FILENAME ${file_list})
  85. set(source_file ${source_dir}/${FILENAME})
  86. # Remove the target file path component.
  87. get_filename_component(target_name ${FILENAME} NAME)
  88. set(target_file ${target_dir}/${target_name})
  89. COPY_SINGLE_FILE(${target} ${source_file} ${target_file})
  90. endforeach()
  91. endmacro()
  92. # Copy a list of files from one directory to another. Relative file paths are maintained.
  93. macro(COPY_RESOURCES target file_list prefix_list source_dir target_dir)
  94. foreach(FILENAME ${file_list})
  95. set(source_file ${source_dir}/${FILENAME})
  96. # Remove one or more prefixes from the source paths.
  97. set(TARGET_FILENAME "${FILENAME}")
  98. foreach(PREFIX ${prefix_list})
  99. string(REGEX REPLACE "^.*${PREFIX}" "" TARGET_FILENAME ${TARGET_FILENAME})
  100. endforeach()
  101. set(target_file ${target_dir}/${TARGET_FILENAME})
  102. COPY_SINGLE_FILE(${target} ${source_file} ${target_file})
  103. endforeach()
  104. endmacro()
  105. macro(COPY_SINGLE_FILE target source_file target_file)
  106. string(FIND ${source_file} "$<CONFIGURATION>" _pos)
  107. if(NOT ${_pos} EQUAL -1)
  108. # Must test with an actual configuration directory.
  109. string(REPLACE "$<CONFIGURATION>" "Release" existing_source_file ${source_file})
  110. if(NOT EXISTS ${existing_source_file})
  111. string(REPLACE "$<CONFIGURATION>" "Debug" existing_source_file ${source_file})
  112. endif()
  113. else()
  114. set(existing_source_file ${source_file})
  115. endif()
  116. if(IS_DIRECTORY ${existing_source_file})
  117. add_custom_command(
  118. TARGET ${target}
  119. POST_BUILD
  120. COMMAND ${CMAKE_COMMAND} -E copy_directory "${source_file}" "${target_file}"
  121. VERBATIM
  122. )
  123. else()
  124. add_custom_command(
  125. TARGET ${target}
  126. POST_BUILD
  127. COMMAND ${CMAKE_COMMAND} -E copy_if_different "${source_file}" "${target_file}"
  128. VERBATIM
  129. )
  130. endif()
  131. endmacro()
  132. #
  133. # Linux macros.
  134. #
  135. if(OS_LINUX)
  136. # Use pkg-config to find Linux libraries and update compiler/linker variables.
  137. macro(FIND_LINUX_LIBRARIES libraries)
  138. # Read pkg-config info into variables.
  139. execute_process(COMMAND pkg-config --cflags ${libraries} OUTPUT_VARIABLE FLL_CFLAGS)
  140. execute_process(COMMAND pkg-config --libs-only-L --libs-only-other ${libraries} OUTPUT_VARIABLE FLL_LDFLAGS)
  141. execute_process(COMMAND pkg-config --libs-only-l ${libraries} OUTPUT_VARIABLE FLL_LIBS)
  142. # Strip leading and trailing whitepspace.
  143. STRING(STRIP "${FLL_CFLAGS}" FLL_CFLAGS)
  144. STRING(STRIP "${FLL_LDFLAGS}" FLL_LDFLAGS)
  145. STRING(STRIP "${FLL_LIBS}" FLL_LIBS)
  146. # Convert to a list.
  147. separate_arguments(FLL_CFLAGS)
  148. separate_arguments(FLL_LDFLAGS)
  149. separate_arguments(FLL_LIBS)
  150. # Update build variables.
  151. list(APPEND CEF_C_COMPILER_FLAGS ${FLL_CFLAGS})
  152. list(APPEND CEF_CXX_COMPILER_FLAGS ${FLL_CFLAGS})
  153. list(APPEND CEF_EXE_LINKER_FLAGS ${FLL_LDFLAGS})
  154. list(APPEND CEF_SHARED_LINKER_FLAGS ${FLL_LDFLAGS})
  155. list(APPEND CEF_STANDARD_LIBS ${FLL_LIBS})
  156. endmacro()
  157. # Set SUID permissions on the specified executable.
  158. macro(SET_LINUX_SUID_PERMISSIONS target executable)
  159. add_custom_command(
  160. TARGET ${target}
  161. POST_BUILD
  162. COMMAND ${CMAKE_COMMAND} -E echo ""
  163. COMMAND ${CMAKE_COMMAND} -E echo "*** Run the following command manually to set SUID permissions ***"
  164. COMMAND ${CMAKE_COMMAND} -E echo "EXE=\"${executable}\" && sudo -- chown root:root $EXE && sudo -- chmod 4755 $EXE"
  165. COMMAND ${CMAKE_COMMAND} -E echo ""
  166. VERBATIM
  167. )
  168. endmacro()
  169. endif(OS_LINUX)
  170. #
  171. # Mac OS X macros.
  172. #
  173. if(OS_MAC)
  174. # Manually process and copy over resource files.
  175. macro(COPY_MAC_RESOURCES resource_list prefix_list target source_dir app_path)
  176. foreach(FILENAME ${resource_list})
  177. # Remove one or more prefixes from the source paths.
  178. set(TARGET_FILENAME "${FILENAME}")
  179. foreach(PREFIX ${prefix_list})
  180. string(REGEX REPLACE "^.*${PREFIX}" "" TARGET_FILENAME ${TARGET_FILENAME})
  181. endforeach()
  182. # Determine the absolute source and target paths.
  183. set(TARGET_PATH "${app_path}/Contents/Resources/${TARGET_FILENAME}")
  184. if(IS_ABSOLUTE ${FILENAME})
  185. set(SOURCE_PATH ${FILENAME})
  186. else()
  187. set(SOURCE_PATH "${source_dir}/${FILENAME}")
  188. endif()
  189. if(${FILENAME} MATCHES ".xib$")
  190. # Change the target file extension.
  191. string(REGEX REPLACE ".xib$" ".nib" TARGET_PATH ${TARGET_PATH})
  192. get_filename_component(TARGET_DIRECTORY ${TARGET_PATH} PATH)
  193. add_custom_command(
  194. TARGET ${target}
  195. POST_BUILD
  196. # Create the target directory.
  197. COMMAND ${CMAKE_COMMAND} -E make_directory "${TARGET_DIRECTORY}"
  198. # Compile the XIB file to a NIB.
  199. COMMAND /usr/bin/ibtool --output-format binary1 --compile "${TARGET_PATH}" "${SOURCE_PATH}"
  200. VERBATIM
  201. )
  202. elseif(NOT ${TARGET_FILENAME} STREQUAL "Info.plist")
  203. # Copy the file as-is.
  204. add_custom_command(
  205. TARGET ${target}
  206. POST_BUILD
  207. COMMAND ${CMAKE_COMMAND} -E copy "${SOURCE_PATH}" "${TARGET_PATH}"
  208. VERBATIM
  209. )
  210. endif()
  211. endforeach()
  212. endmacro()
  213. endif(OS_MAC)
  214. #
  215. # Windows macros.
  216. #
  217. if(OS_WINDOWS)
  218. # Add custom manifest files to an executable target.
  219. macro(ADD_WINDOWS_MANIFEST manifest_path target extension)
  220. add_custom_command(
  221. TARGET ${target}
  222. POST_BUILD
  223. COMMAND "mt.exe" -nologo
  224. -manifest \"${manifest_path}/${target}.${extension}.manifest\" \"${manifest_path}/compatibility.manifest\"
  225. -outputresource:"${CEF_TARGET_OUT_DIR}/${target}.${extension}"\;\#1
  226. COMMENT "Adding manifest..."
  227. )
  228. endmacro()
  229. endif(OS_WINDOWS)
  230. #
  231. # Target configuration macros.
  232. #
  233. # Add a logical target that can be used to link the specified libraries into an
  234. # executable target.
  235. macro(ADD_LOGICAL_TARGET target debug_lib release_lib)
  236. add_library(${target} ${CEF_LIBTYPE} IMPORTED)
  237. set_target_properties(${target} PROPERTIES
  238. IMPORTED_LOCATION "${release_lib}"
  239. IMPORTED_LOCATION_DEBUG "${debug_lib}"
  240. IMPORTED_LOCATION_RELEASE "${release_lib}"
  241. )
  242. endmacro()
  243. # Set common target properties. Use SET_LIBRARY_TARGET_PROPERTIES() or
  244. # SET_EXECUTABLE_TARGET_PROPERTIES() instead of calling this macro directly.
  245. macro(SET_COMMON_TARGET_PROPERTIES target)
  246. # Compile flags.
  247. target_compile_options(${target} PRIVATE ${CEF_COMPILER_FLAGS} ${CEF_CXX_COMPILER_FLAGS})
  248. target_compile_options(${target} PRIVATE $<$<CONFIG:Debug>:${CEF_COMPILER_FLAGS_DEBUG} ${CEF_CXX_COMPILER_FLAGS_DEBUG}>)
  249. target_compile_options(${target} PRIVATE $<$<CONFIG:Release>:${CEF_COMPILER_FLAGS_RELEASE} ${CEF_CXX_COMPILER_FLAGS_RELEASE}>)
  250. # Compile definitions.
  251. target_compile_definitions(${target} PRIVATE ${CEF_COMPILER_DEFINES})
  252. target_compile_definitions(${target} PRIVATE $<$<CONFIG:Debug>:${CEF_COMPILER_DEFINES_DEBUG}>)
  253. target_compile_definitions(${target} PRIVATE $<$<CONFIG:Release>:${CEF_COMPILER_DEFINES_RELEASE}>)
  254. # Include directories.
  255. target_include_directories(${target} PRIVATE ${CEF_INCLUDE_PATH})
  256. # Linker flags.
  257. if(CEF_LINKER_FLAGS)
  258. string(REPLACE ";" " " _flags_str "${CEF_LINKER_FLAGS}")
  259. set_property(TARGET ${target} PROPERTY LINK_FLAGS ${_flags_str})
  260. endif()
  261. if(CEF_LINKER_FLAGS_DEBUG)
  262. string(REPLACE ";" " " _flags_str "${CEF_LINKER_FLAGS_DEBUG}")
  263. set_property(TARGET ${target} PROPERTY LINK_FLAGS_DEBUG ${_flags_str})
  264. endif()
  265. if(CEF_LINKER_FLAGS_RELEASE)
  266. string(REPLACE ";" " " _flags_str "${CEF_LINKER_FLAGS_RELEASE}")
  267. set_property(TARGET ${target} PROPERTY LINK_FLAGS_RELEASE ${_flags_str})
  268. endif()
  269. if(OS_MAC)
  270. # Set Xcode target properties.
  271. set_target_properties(${target} PROPERTIES
  272. XCODE_ATTRIBUTE_ALWAYS_SEARCH_USER_PATHS NO
  273. XCODE_ATTRIBUTE_CLANG_CXX_LANGUAGE_STANDARD "gnu++11" # -std=gnu++11
  274. XCODE_ATTRIBUTE_CLANG_LINK_OBJC_RUNTIME NO # -fno-objc-link-runtime
  275. XCODE_ATTRIBUTE_CLANG_WARN_OBJC_MISSING_PROPERTY_SYNTHESIS YES # -Wobjc-missing-property-synthesis
  276. XCODE_ATTRIBUTE_COPY_PHASE_STRIP NO
  277. XCODE_ATTRIBUTE_DEAD_CODE_STRIPPING[variant=Release] YES # -Wl,-dead_strip
  278. XCODE_ATTRIBUTE_GCC_C_LANGUAGE_STANDARD "c99" # -std=c99
  279. XCODE_ATTRIBUTE_GCC_CW_ASM_SYNTAX NO # No -fasm-blocks
  280. XCODE_ATTRIBUTE_GCC_DYNAMIC_NO_PIC NO
  281. XCODE_ATTRIBUTE_GCC_ENABLE_CPP_EXCEPTIONS NO # -fno-exceptions
  282. XCODE_ATTRIBUTE_GCC_ENABLE_CPP_RTTI NO # -fno-rtti
  283. XCODE_ATTRIBUTE_GCC_ENABLE_PASCAL_STRINGS NO # No -mpascal-strings
  284. XCODE_ATTRIBUTE_GCC_INLINES_ARE_PRIVATE_EXTERN YES # -fvisibility-inlines-hidden
  285. XCODE_ATTRIBUTE_GCC_OBJC_CALL_CXX_CDTORS YES # -fobjc-call-cxx-cdtors
  286. XCODE_ATTRIBUTE_GCC_SYMBOLS_PRIVATE_EXTERN YES # -fvisibility=hidden
  287. XCODE_ATTRIBUTE_GCC_THREADSAFE_STATICS NO # -fno-threadsafe-statics
  288. XCODE_ATTRIBUTE_GCC_TREAT_WARNINGS_AS_ERRORS YES # -Werror
  289. XCODE_ATTRIBUTE_GCC_VERSION "com.apple.compilers.llvm.clang.1_0"
  290. XCODE_ATTRIBUTE_GCC_WARN_ABOUT_MISSING_NEWLINE YES # -Wnewline-eof
  291. XCODE_ATTRIBUTE_USE_HEADERMAP NO
  292. OSX_ARCHITECTURES_DEBUG "${CMAKE_OSX_ARCHITECTURES}"
  293. OSX_ARCHITECTURES_RELEASE "${CMAKE_OSX_ARCHITECTURES}"
  294. )
  295. endif()
  296. endmacro()
  297. # Set library-specific properties.
  298. macro(SET_LIBRARY_TARGET_PROPERTIES target)
  299. SET_COMMON_TARGET_PROPERTIES(${target})
  300. # Shared library linker flags.
  301. if(CEF_SHARED_LINKER_FLAGS)
  302. string(REPLACE ";" " " _flags_str "${CEF_SHARED_LINKER_FLAGS}")
  303. set_property(TARGET ${target} PROPERTY LINK_FLAGS ${_flags_str})
  304. endif()
  305. if(CEF_SHARED_LINKER_FLAGS_DEBUG)
  306. string(REPLACE ";" " " _flags_str "${CEF_SHARED_LINKER_FLAGS_DEBUG}")
  307. set_property(TARGET ${target} PROPERTY LINK_FLAGS_DEBUG ${_flags_str})
  308. endif()
  309. if(CEF_SHARED_LINKER_FLAGS_RELEASE)
  310. string(REPLACE ";" " " _flags_str "${CEF_SHARED_LINKER_FLAGS_RELEASE}")
  311. set_property(TARGET ${target} PROPERTY LINK_FLAGS_RELEASE ${_flags_str})
  312. endif()
  313. endmacro()
  314. # Set executable-specific properties.
  315. macro(SET_EXECUTABLE_TARGET_PROPERTIES target)
  316. SET_COMMON_TARGET_PROPERTIES(${target})
  317. # Executable linker flags.
  318. if(CEF_EXE_LINKER_FLAGS)
  319. string(REPLACE ";" " " _flags_str "${CEF_EXE_LINKER_FLAGS}")
  320. set_property(TARGET ${target} PROPERTY LINK_FLAGS ${_flags_str})
  321. endif()
  322. if(CEF_EXE_LINKER_FLAGS_DEBUG)
  323. string(REPLACE ";" " " _flags_str "${CEF_EXE_LINKER_FLAGS_DEBUG}")
  324. set_property(TARGET ${target} PROPERTY LINK_FLAGS_DEBUG ${_flags_str})
  325. endif()
  326. if(CEF_EXE_LINKER_FLAGS_RELEASE)
  327. string(REPLACE ";" " " _flags_str "${CEF_EXE_LINKER_FLAGS_RELEASE}")
  328. set_property(TARGET ${target} PROPERTY LINK_FLAGS_RELEASE ${_flags_str})
  329. endif()
  330. endmacro()