Serenity Operating System
1function (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
12 invoke_generator(
13 "MediaFeatureID.cpp"
14 Lagom::GenerateCSSMediaFeatureID
15 "${LIBWEB_INPUT_FOLDER}/CSS/MediaFeatures.json"
16 "CSS/MediaFeatureID.h"
17 "CSS/MediaFeatureID.cpp"
18 arguments -j "${LIBWEB_INPUT_FOLDER}/CSS/MediaFeatures.json"
19 )
20
21 invoke_generator(
22 "PropertyID.cpp"
23 Lagom::GenerateCSSPropertyID
24 "${LIBWEB_INPUT_FOLDER}/CSS/Properties.json"
25 "CSS/PropertyID.h"
26 "CSS/PropertyID.cpp"
27 arguments -j "${LIBWEB_INPUT_FOLDER}/CSS/Properties.json"
28 )
29
30 invoke_generator(
31 "TransformFunctions.cpp"
32 Lagom::GenerateCSSTransformFunctions
33 "${LIBWEB_INPUT_FOLDER}/CSS/TransformFunctions.json"
34 "CSS/TransformFunctions.h"
35 "CSS/TransformFunctions.cpp"
36 arguments -j "${LIBWEB_INPUT_FOLDER}/CSS/TransformFunctions.json"
37 )
38
39 invoke_generator(
40 "ValueID.cpp"
41 Lagom::GenerateCSSValueID
42 "${LIBWEB_INPUT_FOLDER}/CSS/Identifiers.json"
43 "CSS/ValueID.h"
44 "CSS/ValueID.cpp"
45 arguments -j "${LIBWEB_INPUT_FOLDER}/CSS/Identifiers.json"
46 )
47
48 add_custom_command(
49 OUTPUT CSS/DefaultStyleSheetSource.cpp
50 COMMAND "${CMAKE_COMMAND}" -E make_directory CSS
51 COMMAND "${LIBWEB_INPUT_FOLDER}/Scripts/GenerateStyleSheetSource.sh" default_stylesheet_source "${LIBWEB_INPUT_FOLDER}/CSS/Default.css" > CSS/DefaultStyleSheetSource.cpp.tmp
52 COMMAND "${CMAKE_COMMAND}" -E copy_if_different CSS/DefaultStyleSheetSource.cpp.tmp CSS/DefaultStyleSheetSource.cpp
53 COMMAND "${CMAKE_COMMAND}" -E remove CSS/DefaultStyleSheetSource.cpp.tmp
54 VERBATIM
55 DEPENDS "${LIBWEB_INPUT_FOLDER}/Scripts/GenerateStyleSheetSource.sh"
56 MAIN_DEPENDENCY "${LIBWEB_INPUT_FOLDER}/CSS/Default.css"
57 )
58 add_custom_target(generate_DefaultStyleSheetSource.cpp DEPENDS CSS/DefaultStyleSheetSource.cpp)
59 add_dependencies(all_generated generate_DefaultStyleSheetSource.cpp)
60
61 add_custom_command(
62 OUTPUT CSS/QuirksModeStyleSheetSource.cpp
63 COMMAND "${CMAKE_COMMAND}" -E make_directory CSS
64 COMMAND "${LIBWEB_INPUT_FOLDER}/Scripts/GenerateStyleSheetSource.sh" quirks_mode_stylesheet_source "${LIBWEB_INPUT_FOLDER}/CSS/QuirksMode.css" > CSS/QuirksModeStyleSheetSource.cpp.tmp
65 COMMAND "${CMAKE_COMMAND}" -E copy_if_different CSS/QuirksModeStyleSheetSource.cpp.tmp CSS/QuirksModeStyleSheetSource.cpp
66 COMMAND "${CMAKE_COMMAND}" -E remove CSS/QuirksModeStyleSheetSource.cpp.tmp
67 VERBATIM
68 DEPENDS "${LIBWEB_INPUT_FOLDER}/Scripts/GenerateStyleSheetSource.sh"
69 MAIN_DEPENDENCY "${LIBWEB_INPUT_FOLDER}/CSS/Default.css"
70 )
71 add_custom_target(generate_QuirksModeStyleSheetSource.cpp DEPENDS CSS/QuirksModeStyleSheetSource.cpp)
72 add_dependencies(all_generated generate_QuirksModeStyleSheetSource.cpp)
73
74endfunction()
75
76function (generate_js_bindings target)
77 set(LIBWEB_INPUT_FOLDER "${CMAKE_CURRENT_SOURCE_DIR}")
78 function(libweb_js_bindings class)
79 cmake_parse_arguments(PARSE_ARGV 1 LIBWEB_BINDINGS "ITERABLE;GLOBAL" "" "")
80 get_filename_component(basename "${class}" NAME)
81 set(BINDINGS_SOURCES
82 "Bindings/${basename}Constructor.h"
83 "Bindings/${basename}Constructor.cpp"
84 "Bindings/${basename}Prototype.h"
85 "Bindings/${basename}Prototype.cpp"
86 )
87 set(BINDINGS_TYPES
88 constructor-header
89 constructor-implementation
90 prototype-header
91 prototype-implementation
92 )
93
94 # FIXME: Instead of requiring a manual declaration of iterable bindings, we should ask BindingsGenerator if it's iterable
95 if(LIBWEB_BINDINGS_ITERABLE)
96 list(APPEND BINDINGS_SOURCES
97 "Bindings/${basename}IteratorPrototype.h"
98 "Bindings/${basename}IteratorPrototype.cpp"
99 )
100 list(APPEND BINDINGS_TYPES
101 iterator-prototype-header
102 iterator-prototype-implementation
103 )
104 endif()
105
106 # FIXME: Instead of requiring a manual declaration of global object bindings, we should ask BindingsGenerator if it's global
107 if(LIBWEB_BINDINGS_GLOBAL)
108 list(APPEND BINDINGS_SOURCES
109 "Bindings/${basename}GlobalMixin.h"
110 "Bindings/${basename}GlobalMixin.cpp"
111 )
112 list(APPEND BINDINGS_TYPES
113 global-mixin-header
114 global-mixin-implementation
115 )
116 endif()
117
118 target_sources(${target} PRIVATE ${BINDINGS_SOURCES})
119 # FIXME: cmake_minimum_required(3.17) for ZIP_LISTS
120 list(LENGTH BINDINGS_SOURCES num_bindings)
121 math(EXPR bindings_end "${num_bindings} - 1")
122 foreach(iter RANGE "${bindings_end}")
123 list(GET BINDINGS_SOURCES ${iter} bindings_src)
124 list(GET BINDINGS_TYPES ${iter} bindings_type)
125 get_property(include_paths DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES)
126 list(TRANSFORM include_paths PREPEND -i)
127
128 # Ninja expects the target name in depfiles to be relative to CMAKE_BINARY_DIR, but ${bindings_src} is
129 # relative to CMAKE_CURRENT_BINARY_DIR. CMake >= 3.20 can do the rewriting transparently (CMP0116).
130 if(CMAKE_GENERATOR MATCHES "^Ninja" AND NOT POLICY CMP0116)
131 # FIXME: Drop this branch for cmake_minimum_required(3.20)
132 get_filename_component(full_path ${bindings_src} ABSOLUTE BASE_DIR ${CMAKE_CURRENT_BINARY_DIR})
133 file(RELATIVE_PATH depfile_target ${CMAKE_BINARY_DIR} ${full_path})
134 else()
135 set(depfile_target ${bindings_src})
136 endif()
137
138 add_custom_command(
139 OUTPUT "${bindings_src}"
140 COMMAND "$<TARGET_FILE:Lagom::BindingsGenerator>" "--${bindings_type}" -o "${bindings_src}.tmp" --depfile "${bindings_src}.d"
141 --depfile-target "${depfile_target}" ${include_paths} "${LIBWEB_INPUT_FOLDER}/${class}.idl" "${LIBWEB_INPUT_FOLDER}"
142 COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${bindings_src}.tmp" "${bindings_src}"
143 COMMAND "${CMAKE_COMMAND}" -E remove "${bindings_src}.tmp"
144 VERBATIM
145 DEPENDS Lagom::BindingsGenerator
146 MAIN_DEPENDENCY ${class}.idl
147 DEPFILE ${CMAKE_CURRENT_BINARY_DIR}/${bindings_src}.d
148 )
149 endforeach()
150
151 foreach(generated_file IN LISTS BINDINGS_SOURCES)
152 get_filename_component(generated_name ${generated_file} NAME)
153 add_custom_target(generate_${generated_name} DEPENDS ${generated_file})
154 add_dependencies(all_generated generate_${generated_name})
155 add_dependencies(${target} generate_${generated_name})
156 endforeach()
157
158 list(APPEND LIBWEB_ALL_IDL_FILES "${LIBWEB_INPUT_FOLDER}/${class}.idl")
159 set(LIBWEB_ALL_IDL_FILES ${LIBWEB_ALL_IDL_FILES} PARENT_SCOPE)
160 endfunction()
161
162 function(generate_exposed_interface_files)
163 set(exposed_interface_sources
164 Forward.h IntrinsicDefinitions.cpp
165 DedicatedWorkerExposedInterfaces.cpp DedicatedWorkerExposedInterfaces.h
166 SharedWorkerExposedInterfaces.cpp SharedWorkerExposedInterfaces.h
167 WindowExposedInterfaces.cpp WindowExposedInterfaces.h)
168 list(TRANSFORM exposed_interface_sources PREPEND "Bindings/")
169 add_custom_command(
170 OUTPUT ${exposed_interface_sources}
171 COMMAND "${CMAKE_COMMAND}" -E make_directory "tmp"
172 COMMAND $<TARGET_FILE:Lagom::GenerateWindowOrWorkerInterfaces> -o "${CMAKE_CURRENT_BINARY_DIR}/tmp" -b "${LIBWEB_INPUT_FOLDER}" ${LIBWEB_ALL_IDL_FILES}
173 COMMAND "${CMAKE_COMMAND}" -E copy_if_different tmp/Forward.h "Bindings/Forward.h"
174 COMMAND "${CMAKE_COMMAND}" -E copy_if_different tmp/IntrinsicDefinitions.cpp "Bindings/IntrinsicDefinitions.cpp"
175 COMMAND "${CMAKE_COMMAND}" -E copy_if_different tmp/DedicatedWorkerExposedInterfaces.h "Bindings/DedicatedWorkerExposedInterfaces.h"
176 COMMAND "${CMAKE_COMMAND}" -E copy_if_different tmp/DedicatedWorkerExposedInterfaces.cpp "Bindings/DedicatedWorkerExposedInterfaces.cpp"
177 COMMAND "${CMAKE_COMMAND}" -E copy_if_different tmp/SharedWorkerExposedInterfaces.h "Bindings/SharedWorkerExposedInterfaces.h"
178 COMMAND "${CMAKE_COMMAND}" -E copy_if_different tmp/SharedWorkerExposedInterfaces.cpp "Bindings/SharedWorkerExposedInterfaces.cpp"
179 COMMAND "${CMAKE_COMMAND}" -E copy_if_different tmp/WindowExposedInterfaces.h "Bindings/WindowExposedInterfaces.h"
180 COMMAND "${CMAKE_COMMAND}" -E copy_if_different tmp/WindowExposedInterfaces.cpp "Bindings/WindowExposedInterfaces.cpp"
181 COMMAND "${CMAKE_COMMAND}" -E remove_directory "${CMAKE_CURRENT_BINARY_DIR}/tmp"
182 VERBATIM
183 DEPENDS Lagom::GenerateWindowOrWorkerInterfaces ${LIBWEB_ALL_IDL_FILES}
184 )
185 target_sources(${target} PRIVATE ${exposed_interface_sources})
186 add_custom_target(generate_exposed_interfaces DEPENDS ${exposed_interface_sources})
187 add_dependencies(all_generated generate_exposed_interfaces)
188 add_dependencies(${target} generate_exposed_interfaces)
189 endfunction()
190
191 include("idl_files.cmake")
192 generate_exposed_interface_files()
193
194endfunction()