libweb_generators.cmake 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. function (generate_css_implementation)
  2. set(LIBWEB_INPUT_FOLDER "${CMAKE_CURRENT_SOURCE_DIR}")
  3. invoke_generator(
  4. "Enums.cpp"
  5. Lagom::GenerateCSSEnums
  6. "${LIBWEB_INPUT_FOLDER}/CSS/Enums.json"
  7. "CSS/Enums.h"
  8. "CSS/Enums.cpp"
  9. arguments -j "${LIBWEB_INPUT_FOLDER}/CSS/Enums.json"
  10. )
  11. invoke_generator(
  12. "MathFunctions.cpp"
  13. Lagom::GenerateCSSMathFunctions
  14. "${LIBWEB_INPUT_FOLDER}/CSS/MathFunctions.json"
  15. "CSS/MathFunctions.h"
  16. "CSS/MathFunctions.cpp"
  17. arguments -j "${LIBWEB_INPUT_FOLDER}/CSS/MathFunctions.json"
  18. )
  19. invoke_generator(
  20. "MediaFeatureID.cpp"
  21. Lagom::GenerateCSSMediaFeatureID
  22. "${LIBWEB_INPUT_FOLDER}/CSS/MediaFeatures.json"
  23. "CSS/MediaFeatureID.h"
  24. "CSS/MediaFeatureID.cpp"
  25. arguments -j "${LIBWEB_INPUT_FOLDER}/CSS/MediaFeatures.json"
  26. )
  27. invoke_generator(
  28. "PropertyID.cpp"
  29. Lagom::GenerateCSSPropertyID
  30. "${LIBWEB_INPUT_FOLDER}/CSS/Properties.json"
  31. "CSS/PropertyID.h"
  32. "CSS/PropertyID.cpp"
  33. arguments -j "${LIBWEB_INPUT_FOLDER}/CSS/Properties.json"
  34. )
  35. invoke_generator(
  36. "PseudoClass.cpp"
  37. Lagom::GenerateCSSPseudoClass
  38. "${LIBWEB_INPUT_FOLDER}/CSS/PseudoClasses.json"
  39. "CSS/PseudoClass.h"
  40. "CSS/PseudoClass.cpp"
  41. arguments -j "${LIBWEB_INPUT_FOLDER}/CSS/PseudoClasses.json"
  42. )
  43. invoke_generator(
  44. "TransformFunctions.cpp"
  45. Lagom::GenerateCSSTransformFunctions
  46. "${LIBWEB_INPUT_FOLDER}/CSS/TransformFunctions.json"
  47. "CSS/TransformFunctions.h"
  48. "CSS/TransformFunctions.cpp"
  49. arguments -j "${LIBWEB_INPUT_FOLDER}/CSS/TransformFunctions.json"
  50. )
  51. invoke_generator(
  52. "Keyword.cpp"
  53. Lagom::GenerateCSSKeyword
  54. "${LIBWEB_INPUT_FOLDER}/CSS/Keywords.json"
  55. "CSS/Keyword.h"
  56. "CSS/Keyword.cpp"
  57. arguments -j "${LIBWEB_INPUT_FOLDER}/CSS/Keywords.json"
  58. )
  59. embed_as_string(
  60. "DefaultStyleSheetSource.cpp"
  61. "${LIBWEB_INPUT_FOLDER}/CSS/Default.css"
  62. "CSS/DefaultStyleSheetSource.cpp"
  63. "default_stylesheet_source"
  64. NAMESPACE "Web::CSS"
  65. )
  66. embed_as_string(
  67. "QuirksModeStyleSheetSource.cpp"
  68. "${LIBWEB_INPUT_FOLDER}/CSS/QuirksMode.css"
  69. "CSS/QuirksModeStyleSheetSource.cpp"
  70. "quirks_mode_stylesheet_source"
  71. NAMESPACE "Web::CSS"
  72. )
  73. embed_as_string(
  74. "MathMLStyleSheetSource.cpp"
  75. "${LIBWEB_INPUT_FOLDER}/MathML/Default.css"
  76. "MathML/MathMLStyleSheetSource.cpp"
  77. "mathml_stylesheet_source"
  78. NAMESPACE "Web::CSS"
  79. )
  80. embed_as_string(
  81. "SVGStyleSheetSource.cpp"
  82. "${LIBWEB_INPUT_FOLDER}/SVG/Default.css"
  83. "SVG/SVGStyleSheetSource.cpp"
  84. "svg_stylesheet_source"
  85. NAMESPACE "Web::CSS"
  86. )
  87. set(CSS_GENERATED_HEADERS
  88. "CSS/Enums.h"
  89. "CSS/Keyword.h"
  90. "CSS/MathFunctions.h"
  91. "CSS/MediaFeatureID.h"
  92. "CSS/PropertyID.h"
  93. "CSS/PseudoClass.h"
  94. "CSS/TransformFunctions.h"
  95. )
  96. list(TRANSFORM CSS_GENERATED_HEADERS PREPEND "${CMAKE_CURRENT_BINARY_DIR}/")
  97. if (ENABLE_INSTALL_HEADERS)
  98. install(FILES ${CSS_GENERATED_HEADERS} DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/LibWeb/CSS")
  99. endif()
  100. list(APPEND LIBWEB_ALL_GENERATED_HEADERS ${CSS_GENERATED_HEADERS})
  101. set(LIBWEB_ALL_GENERATED_HEADERS ${LIBWEB_ALL_GENERATED_HEADERS} PARENT_SCOPE)
  102. endfunction()
  103. function (generate_js_bindings target)
  104. set(LIBWEB_INPUT_FOLDER "${CMAKE_CURRENT_SOURCE_DIR}")
  105. function(libweb_js_bindings class)
  106. cmake_parse_arguments(PARSE_ARGV 1 LIBWEB_BINDINGS "NAMESPACE;ITERABLE;GLOBAL" "" "")
  107. get_filename_component(basename "${class}" NAME)
  108. if (LIBWEB_BINDINGS_NAMESPACE)
  109. set(BINDINGS_SOURCES
  110. "Bindings/${basename}Namespace.h"
  111. "Bindings/${basename}Namespace.cpp"
  112. )
  113. else()
  114. set(BINDINGS_SOURCES
  115. "Bindings/${basename}Constructor.h"
  116. "Bindings/${basename}Constructor.cpp"
  117. "Bindings/${basename}Prototype.h"
  118. "Bindings/${basename}Prototype.cpp"
  119. )
  120. endif()
  121. if(LIBWEB_BINDINGS_ITERABLE)
  122. list(APPEND BINDINGS_SOURCES
  123. "Bindings/${basename}IteratorPrototype.h"
  124. "Bindings/${basename}IteratorPrototype.cpp"
  125. )
  126. endif()
  127. if(LIBWEB_BINDINGS_GLOBAL)
  128. list(APPEND BINDINGS_SOURCES
  129. "Bindings/${basename}GlobalMixin.h"
  130. "Bindings/${basename}GlobalMixin.cpp"
  131. )
  132. endif()
  133. list(TRANSFORM BINDINGS_SOURCES PREPEND "${CMAKE_CURRENT_BINARY_DIR}/")
  134. target_sources(${target} PRIVATE ${BINDINGS_SOURCES})
  135. get_property(include_paths DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES)
  136. list(TRANSFORM include_paths PREPEND -i)
  137. # Ninja expects the target name in depfiles to be relative to CMAKE_BINARY_DIR, but ${bindings_src} is
  138. # relative to CMAKE_CURRENT_BINARY_DIR. CMake >= 3.20 can do the rewriting transparently (CMP0116).
  139. set(depfile_prefix_arg "")
  140. if(CMAKE_GENERATOR MATCHES "^Ninja" AND NOT POLICY CMP0116)
  141. file(RELATIVE_PATH depfile_target ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR})
  142. set(depfile_prefix_arg "--depfile-prefix ${depfile_target}" )
  143. endif()
  144. add_custom_command(
  145. OUTPUT ${BINDINGS_SOURCES}
  146. COMMAND "$<TARGET_FILE:Lagom::BindingsGenerator>" -o "Bindings" --depfile "Bindings/${basename}.d"
  147. ${depfile_prefix_arg} "${LIBWEB_INPUT_FOLDER}/${class}.idl" "${LIBWEB_INPUT_FOLDER}"
  148. VERBATIM
  149. COMMENT "Generating Bindings for ${class}"
  150. DEPENDS Lagom::BindingsGenerator
  151. MAIN_DEPENDENCY ${class}.idl
  152. DEPFILE ${CMAKE_CURRENT_BINARY_DIR}/Bindings/${basename}.d
  153. )
  154. add_custom_target(generate_${basename} DEPENDS ${BINDINGS_SOURCES})
  155. add_dependencies(all_generated generate_${basename})
  156. add_dependencies(${target} generate_${basename})
  157. set(BINDINGS_HEADERS ${BINDINGS_SOURCES})
  158. list(FILTER BINDINGS_HEADERS INCLUDE REGEX "\.h$")
  159. if (ENABLE_INSTALL_HEADERS)
  160. install(FILES ${BINDINGS_HEADERS} DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/LibWeb/Bindings")
  161. endif()
  162. list(APPEND LIBWEB_ALL_GENERATED_HEADERS ${BINDINGS_HEADERS})
  163. set(LIBWEB_ALL_GENERATED_HEADERS ${LIBWEB_ALL_GENERATED_HEADERS} PARENT_SCOPE)
  164. list(APPEND LIBWEB_ALL_IDL_FILES "${LIBWEB_INPUT_FOLDER}/${class}.idl")
  165. set(LIBWEB_ALL_IDL_FILES ${LIBWEB_ALL_IDL_FILES} PARENT_SCOPE)
  166. endfunction()
  167. function(generate_exposed_interface_files)
  168. set(exposed_interface_sources
  169. IntrinsicDefinitions.cpp
  170. DedicatedWorkerExposedInterfaces.cpp DedicatedWorkerExposedInterfaces.h
  171. SharedWorkerExposedInterfaces.cpp SharedWorkerExposedInterfaces.h
  172. WindowExposedInterfaces.cpp WindowExposedInterfaces.h)
  173. list(TRANSFORM exposed_interface_sources PREPEND "Bindings/")
  174. add_custom_command(
  175. OUTPUT ${exposed_interface_sources}
  176. COMMAND "${CMAKE_COMMAND}" -E make_directory "tmp"
  177. COMMAND $<TARGET_FILE:Lagom::GenerateWindowOrWorkerInterfaces> -o "${CMAKE_CURRENT_BINARY_DIR}/tmp" -b "${LIBWEB_INPUT_FOLDER}" ${LIBWEB_ALL_IDL_FILES}
  178. COMMAND "${CMAKE_COMMAND}" -E copy_if_different tmp/IntrinsicDefinitions.cpp "Bindings/IntrinsicDefinitions.cpp"
  179. COMMAND "${CMAKE_COMMAND}" -E copy_if_different tmp/DedicatedWorkerExposedInterfaces.h "Bindings/DedicatedWorkerExposedInterfaces.h"
  180. COMMAND "${CMAKE_COMMAND}" -E copy_if_different tmp/DedicatedWorkerExposedInterfaces.cpp "Bindings/DedicatedWorkerExposedInterfaces.cpp"
  181. COMMAND "${CMAKE_COMMAND}" -E copy_if_different tmp/SharedWorkerExposedInterfaces.h "Bindings/SharedWorkerExposedInterfaces.h"
  182. COMMAND "${CMAKE_COMMAND}" -E copy_if_different tmp/SharedWorkerExposedInterfaces.cpp "Bindings/SharedWorkerExposedInterfaces.cpp"
  183. COMMAND "${CMAKE_COMMAND}" -E copy_if_different tmp/WindowExposedInterfaces.h "Bindings/WindowExposedInterfaces.h"
  184. COMMAND "${CMAKE_COMMAND}" -E copy_if_different tmp/WindowExposedInterfaces.cpp "Bindings/WindowExposedInterfaces.cpp"
  185. COMMAND "${CMAKE_COMMAND}" -E remove_directory "${CMAKE_CURRENT_BINARY_DIR}/tmp"
  186. VERBATIM
  187. DEPENDS Lagom::GenerateWindowOrWorkerInterfaces ${LIBWEB_ALL_IDL_FILES}
  188. )
  189. target_sources(${target} PRIVATE ${exposed_interface_sources})
  190. add_custom_target(generate_exposed_interfaces DEPENDS ${exposed_interface_sources})
  191. add_dependencies(all_generated generate_exposed_interfaces)
  192. add_dependencies(${target} generate_exposed_interfaces)
  193. list(TRANSFORM exposed_interface_sources PREPEND "${CMAKE_CURRENT_BINARY_DIR}/")
  194. set(exposed_interface_headers ${exposed_interface_sources})
  195. list(FILTER exposed_interface_headers INCLUDE REGEX "\.h$")
  196. if (ENABLE_INSTALL_HEADERS)
  197. install(FILES ${exposed_interface_headers} DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/LibWeb/Bindings")
  198. endif()
  199. list(APPEND LIBWEB_ALL_GENERATED_HEADERS ${exposed_interface_headers})
  200. set(LIBWEB_ALL_GENERATED_HEADERS ${LIBWEB_ALL_GENERATED_HEADERS} PARENT_SCOPE)
  201. endfunction()
  202. include("idl_files.cmake")
  203. generate_exposed_interface_files()
  204. set(LIBWEB_ALL_GENERATED_HEADERS ${LIBWEB_ALL_GENERATED_HEADERS} PARENT_SCOPE)
  205. endfunction()