ladybird/Meta/CMake/libweb_generators.cmake
Aliaksandr Kalenik 9a8a7798ec Meta+LibWeb: Generate WebGL command proxy scaffolding
Moving WebGL execution into the Compositor needs a serializable command
stream and a client-side proxy that can queue commands before sending
them over IPC. The existing generator metadata only described direct GL
wrappers, so generated code could not distinguish async commands from
sync calls or object factory methods.

This teaches the WebGL metadata and generators about command streams and
adds the unused LibWeb proxy/list types. No rendering behavior changes
yet; the later host wiring can build on these generated interfaces
without mixing the metadata churn into that commit.
2026-06-17 19:07:32 +02:00

421 lines
17 KiB
CMake

function (generate_css_implementation)
set(LIBWEB_INPUT_FOLDER "${CMAKE_CURRENT_SOURCE_DIR}")
invoke_py_generator(
"DescriptorID.cpp"
"generate_libweb_css_descriptors.py"
"${LIBWEB_INPUT_FOLDER}/CSS/Descriptors.json"
"CSS/DescriptorID.h"
"CSS/DescriptorID.cpp"
arguments -j "${LIBWEB_INPUT_FOLDER}/CSS/Descriptors.json"
)
invoke_py_generator(
"Enums.cpp"
"generate_libweb_css_enums.py"
"${LIBWEB_INPUT_FOLDER}/CSS/Enums.json"
"CSS/Enums.h"
"CSS/Enums.cpp"
arguments -j "${LIBWEB_INPUT_FOLDER}/CSS/Enums.json"
)
invoke_py_generator(
"EnvironmentVariable.cpp"
"generate_libweb_css_environment_variables.py"
"${LIBWEB_INPUT_FOLDER}/CSS/EnvironmentVariables.json"
"CSS/EnvironmentVariable.h"
"CSS/EnvironmentVariable.cpp"
arguments -j "${LIBWEB_INPUT_FOLDER}/CSS/EnvironmentVariables.json"
)
invoke_py_generator(
"MathFunctions.cpp"
"generate_libweb_css_math_functions.py"
"${LIBWEB_INPUT_FOLDER}/CSS/MathFunctions.json"
"CSS/MathFunctions.h"
"CSS/MathFunctions.cpp"
arguments -j "${LIBWEB_INPUT_FOLDER}/CSS/MathFunctions.json"
)
invoke_py_generator(
"MediaFeatureID.cpp"
"generate_libweb_css_media_feature_id.py"
"${LIBWEB_INPUT_FOLDER}/CSS/MediaFeatures.json"
"CSS/MediaFeatureID.h"
"CSS/MediaFeatureID.cpp"
arguments -j "${LIBWEB_INPUT_FOLDER}/CSS/MediaFeatures.json"
)
invoke_py_generator(
"PropertyID.cpp"
"generate_libweb_css_property_id.py"
"${LIBWEB_INPUT_FOLDER}/CSS/Properties.json"
"CSS/PropertyID.h"
"CSS/PropertyID.cpp"
arguments -j "${LIBWEB_INPUT_FOLDER}/CSS/Properties.json"
-e "${LIBWEB_INPUT_FOLDER}/CSS/Enums.json"
-g "${LIBWEB_INPUT_FOLDER}/CSS/LogicalPropertyGroups.json"
dependencies "${LIBWEB_INPUT_FOLDER}/CSS/Enums.json" "${LIBWEB_INPUT_FOLDER}/CSS/LogicalPropertyGroups.json"
)
invoke_py_generator(
"PseudoClass.cpp"
"generate_libweb_css_pseudo_class.py"
"${LIBWEB_INPUT_FOLDER}/CSS/PseudoClasses.json"
"CSS/PseudoClass.h"
"CSS/PseudoClass.cpp"
arguments -j "${LIBWEB_INPUT_FOLDER}/CSS/PseudoClasses.json"
)
invoke_py_generator(
"PseudoElement.cpp"
"generate_libweb_css_pseudo_element.py"
"${LIBWEB_INPUT_FOLDER}/CSS/PseudoElements.json"
"CSS/PseudoElement.h"
"CSS/PseudoElement.cpp"
arguments -j "${LIBWEB_INPUT_FOLDER}/CSS/PseudoElements.json"
)
invoke_py_generator(
"TransformFunctions.cpp"
"generate_libweb_css_transform_functions.py"
"${LIBWEB_INPUT_FOLDER}/CSS/TransformFunctions.json"
"CSS/TransformFunctions.h"
"CSS/TransformFunctions.cpp"
arguments -j "${LIBWEB_INPUT_FOLDER}/CSS/TransformFunctions.json"
)
invoke_py_generator(
"GeneratedValueTypesParsing.cpp"
"generate_libweb_css_value_types_parsing.py"
"${LIBWEB_INPUT_FOLDER}/CSS/ValueTypes.json"
"CSS/Parser/GeneratedValueTypesParsing.h"
"CSS/Parser/GeneratedValueTypesParsing.cpp"
arguments -j "${LIBWEB_INPUT_FOLDER}/CSS/ValueTypes.json"
-u "${LIBWEB_INPUT_FOLDER}/CSS/Units.json"
dependencies "${LIBWEB_INPUT_FOLDER}/CSS/Units.json"
)
invoke_py_generator(
"Units.cpp"
"generate_libweb_css_units.py"
"${LIBWEB_INPUT_FOLDER}/CSS/Units.json"
"CSS/Units.h"
"CSS/Units.cpp"
arguments -j "${LIBWEB_INPUT_FOLDER}/CSS/Units.json"
)
invoke_py_generator(
"Keyword.cpp"
"generate_libweb_css_keyword.py"
"${LIBWEB_INPUT_FOLDER}/CSS/Keywords.json"
"CSS/Keyword.h"
"CSS/Keyword.cpp"
arguments -j "${LIBWEB_INPUT_FOLDER}/CSS/Keywords.json"
)
invoke_py_idl_generator(
"GeneratedCSSNumericFactoryMethods.cpp"
"GeneratedCSSNumericFactoryMethods.idl"
"generate_libweb_css_numeric_factory_methods.py"
"${LIBWEB_INPUT_FOLDER}/CSS/Units.json"
"CSS/GeneratedCSSNumericFactoryMethods.h"
"CSS/GeneratedCSSNumericFactoryMethods.cpp"
"CSS/GeneratedCSSNumericFactoryMethods.idl"
arguments -j "${LIBWEB_INPUT_FOLDER}/CSS/Units.json"
)
invoke_py_idl_generator(
"GeneratedCSSStyleProperties.cpp"
"GeneratedCSSStyleProperties.idl"
"generate_libweb_css_style_properties.py"
"${LIBWEB_INPUT_FOLDER}/CSS/Properties.json"
"CSS/GeneratedCSSStyleProperties.h"
"CSS/GeneratedCSSStyleProperties.cpp"
"CSS/GeneratedCSSStyleProperties.idl"
arguments -j "${LIBWEB_INPUT_FOLDER}/CSS/Properties.json"
)
embed_as_string(
"DefaultStyleSheetSource.cpp"
"${LIBWEB_INPUT_FOLDER}/CSS/Default.css"
"CSS/DefaultStyleSheetSource.cpp"
"default_stylesheet_source"
NAMESPACE "Web::CSS"
)
embed_as_string(
"QuirksModeStyleSheetSource.cpp"
"${LIBWEB_INPUT_FOLDER}/CSS/QuirksMode.css"
"CSS/QuirksModeStyleSheetSource.cpp"
"quirks_mode_stylesheet_source"
NAMESPACE "Web::CSS"
)
embed_as_string(
"MathMLStyleSheetSource.cpp"
"${LIBWEB_INPUT_FOLDER}/MathML/Default.css"
"MathML/MathMLStyleSheetSource.cpp"
"mathml_stylesheet_source"
NAMESPACE "Web::CSS"
)
embed_as_string(
"SVGStyleSheetSource.cpp"
"${LIBWEB_INPUT_FOLDER}/SVG/Default.css"
"SVG/SVGStyleSheetSource.cpp"
"svg_stylesheet_source"
NAMESPACE "Web::CSS"
)
set(CSS_GENERATED_HEADERS
"CSS/Enums.h"
"CSS/EnvironmentVariable.h"
"CSS/GeneratedCSSStyleProperties.h"
"CSS/GeneratedCSSNumericFactoryMethods.h"
"CSS/Keyword.h"
"CSS/MathFunctions.h"
"CSS/MediaFeatureID.h"
"CSS/PropertyID.h"
"CSS/PseudoClass.h"
"CSS/PseudoElement.h"
"CSS/TransformFunctions.h"
)
list(TRANSFORM CSS_GENERATED_HEADERS PREPEND "${CMAKE_CURRENT_BINARY_DIR}/")
if (ENABLE_INSTALL_HEADERS)
install(FILES ${CSS_GENERATED_HEADERS} DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/LibWeb/CSS")
endif()
list(APPEND LIBWEB_ALL_GENERATED_HEADERS ${CSS_GENERATED_HEADERS})
set(LIBWEB_ALL_GENERATED_HEADERS ${LIBWEB_ALL_GENERATED_HEADERS} PARENT_SCOPE)
set(CSS_GENERATED_IDL
"GeneratedCSSStyleProperties.idl"
"GeneratedCSSNumericFactoryMethods.idl"
)
list(APPEND LIBWEB_ALL_GENERATED_IDL ${CSS_GENERATED_IDL})
set(LIBWEB_ALL_GENERATED_IDL ${LIBWEB_ALL_GENERATED_IDL} PARENT_SCOPE)
endfunction()
function (generate_html_implementation)
set(LIBWEB_INPUT_FOLDER "${CMAKE_CURRENT_SOURCE_DIR}")
invoke_py_generator(
"NamedCharacterReferences.cpp"
"generate_libweb_html_named_character_references.py"
"${LIBWEB_INPUT_FOLDER}/HTML/Parser/Entities.json"
"HTML/Parser/NamedCharacterReferences.h"
"HTML/Parser/NamedCharacterReferences.cpp"
arguments -j "${LIBWEB_INPUT_FOLDER}/HTML/Parser/Entities.json"
)
invoke_py_generator(
"MediaControlsDOM.cpp"
"generate_dom_tree.py"
"${LIBWEB_INPUT_FOLDER}/HTML/MediaControls.html"
"HTML/MediaControlsDOM.h"
"HTML/MediaControlsDOM.cpp"
arguments -i "${LIBWEB_INPUT_FOLDER}/HTML/MediaControls.html"
-s MediaControlsDOM
-n "Web::HTML"
--html-tags "${LIBWEB_INPUT_FOLDER}/HTML/TagNames.h"
--html-attributes "${LIBWEB_INPUT_FOLDER}/HTML/AttributeNames.h"
--svg-tags "${LIBWEB_INPUT_FOLDER}/SVG/TagNames.h"
--svg-attributes "${LIBWEB_INPUT_FOLDER}/SVG/AttributeNames.h"
dependencies "${LIBWEB_INPUT_FOLDER}/HTML/TagNames.h"
"${LIBWEB_INPUT_FOLDER}/HTML/AttributeNames.h"
"${LIBWEB_INPUT_FOLDER}/SVG/TagNames.h"
"${LIBWEB_INPUT_FOLDER}/SVG/AttributeNames.h"
"${LIBWEB_INPUT_FOLDER}/HTML/MediaControls.css"
)
set(HTML_GENERATED_HEADERS
"HTML/Parser/NamedCharacterReferences.h"
"HTML/MediaControlsDOM.h"
)
list(TRANSFORM HTML_GENERATED_HEADERS PREPEND "${CMAKE_CURRENT_BINARY_DIR}/")
if (ENABLE_INSTALL_HEADERS)
install(FILES ${HTML_GENERATED_HEADERS} DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/LibWeb/HTML")
endif()
list(APPEND LIBWEB_ALL_GENERATED_HEADERS ${HTML_GENERATED_HEADERS})
set(LIBWEB_ALL_GENERATED_HEADERS ${LIBWEB_ALL_GENERATED_HEADERS} PARENT_SCOPE)
endfunction()
function (generate_webgl_implementation)
set(LIBWEB_INPUT_FOLDER "${CMAKE_CURRENT_SOURCE_DIR}")
invoke_py_generator(
"GLFunctions.cpp"
"generate_libweb_webgl_functions.py"
"${LIBWEB_INPUT_FOLDER}/WebGL/GLFunctions.json"
"WebGL/GLFunctions.h"
"WebGL/GLFunctions.cpp"
arguments -j "${LIBWEB_INPUT_FOLDER}/WebGL/GLFunctions.json"
dependencies "${LADYBIRD_SOURCE_DIR}/Meta/Generators/libweb_webgl.py"
)
invoke_py_generator(
"WebGLCommands.cpp"
"generate_libweb_webgl_commands.py"
"${LIBWEB_INPUT_FOLDER}/WebGL/GLFunctions.json"
"WebGL/WebGLCommands.h"
"WebGL/WebGLCommands.cpp"
arguments -j "${LIBWEB_INPUT_FOLDER}/WebGL/GLFunctions.json"
dependencies "${LADYBIRD_SOURCE_DIR}/Meta/Generators/libweb_webgl.py"
)
invoke_py_generator(
"WebGLContextProxy.cpp"
"generate_libweb_webgl_proxy.py"
"${LIBWEB_INPUT_FOLDER}/WebGL/GLFunctions.json"
"WebGL/WebGLContextProxy.h"
"WebGL/WebGLContextProxy.cpp"
arguments -j "${LIBWEB_INPUT_FOLDER}/WebGL/GLFunctions.json"
dependencies "${LADYBIRD_SOURCE_DIR}/Meta/Generators/libweb_webgl.py"
)
set(WEBGL_GENERATED_HEADERS
"WebGL/GLFunctions.h"
"WebGL/WebGLCommands.h"
"WebGL/WebGLContextProxy.h"
)
list(TRANSFORM WEBGL_GENERATED_HEADERS PREPEND "${CMAKE_CURRENT_BINARY_DIR}/")
if (ENABLE_INSTALL_HEADERS)
install(FILES ${WEBGL_GENERATED_HEADERS} DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/LibWeb/WebGL")
endif()
list(APPEND LIBWEB_ALL_GENERATED_HEADERS ${WEBGL_GENERATED_HEADERS})
set(LIBWEB_ALL_GENERATED_HEADERS ${LIBWEB_ALL_GENERATED_HEADERS} PARENT_SCOPE)
endfunction()
function (generate_js_bindings target)
set(LIBWEB_INPUT_FOLDER "${CMAKE_CURRENT_SOURCE_DIR}")
find_package(Python3 REQUIRED COMPONENTS Interpreter)
set(generated_idl_targets ${LIBWEB_ALL_GENERATED_IDL})
list(TRANSFORM generated_idl_targets PREPEND "generate_")
set(LIBWEB_ALL_BINDINGS_SOURCES)
set(LIBWEB_ALL_IDL_FILES)
set(LIBWEB_ALL_PARSED_IDL_FILES)
macro(libweb_add_bindings_source class)
get_filename_component(basename "${class}" NAME)
set(BINDINGS_HEADER "${CMAKE_CURRENT_BINARY_DIR}/Bindings/${basename}.h")
set(BINDINGS_SOURCE "${CMAKE_CURRENT_BINARY_DIR}/Bindings/${basename}.cpp")
set(BINDINGS_SOURCES ${BINDINGS_HEADER} ${BINDINGS_SOURCE})
target_sources(${target} PRIVATE ${BINDINGS_SOURCES})
if (ENABLE_INSTALL_HEADERS)
install(FILES ${BINDINGS_HEADER} DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/LibWeb/Bindings")
endif()
list(APPEND LIBWEB_ALL_GENERATED_HEADERS ${BINDINGS_HEADER})
set(LIBWEB_ALL_GENERATED_HEADERS ${LIBWEB_ALL_GENERATED_HEADERS} PARENT_SCOPE)
list(APPEND LIBWEB_ALL_BINDINGS_SOURCES ${BINDINGS_SOURCES})
set(LIBWEB_ALL_BINDINGS_SOURCES ${LIBWEB_ALL_BINDINGS_SOURCES} PARENT_SCOPE)
endmacro()
function(libweb_js_bindings class)
get_filename_component(basename "${class}" NAME)
set(idl_path "${LIBWEB_INPUT_FOLDER}/${class}.idl")
if ("${basename}.idl" IN_LIST LIBWEB_ALL_GENERATED_IDL)
set(idl_path "${CMAKE_CURRENT_BINARY_DIR}/${class}.idl")
endif()
libweb_add_bindings_source(${class})
list(APPEND LIBWEB_ALL_IDL_FILES "${idl_path}")
set(LIBWEB_ALL_IDL_FILES ${LIBWEB_ALL_IDL_FILES} PARENT_SCOPE)
list(APPEND LIBWEB_ALL_PARSED_IDL_FILES "${idl_path}")
set(LIBWEB_ALL_PARSED_IDL_FILES ${LIBWEB_ALL_PARSED_IDL_FILES} PARENT_SCOPE)
endfunction()
set(bindings_generator "${LADYBIRD_SOURCE_DIR}/Meta/Generators/generate_libweb_bindings.py")
set(bindings_generator_dependencies
"${bindings_generator}"
"${LADYBIRD_SOURCE_DIR}/Meta/Generators/libweb_bindings/__init__.py"
"${LADYBIRD_SOURCE_DIR}/Meta/Generators/libweb_bindings/arguments.py"
"${LADYBIRD_SOURCE_DIR}/Meta/Generators/libweb_bindings/attributes.py"
"${LADYBIRD_SOURCE_DIR}/Meta/Generators/libweb_bindings/callback_interfaces.py"
"${LADYBIRD_SOURCE_DIR}/Meta/Generators/libweb_bindings/constants.py"
"${LADYBIRD_SOURCE_DIR}/Meta/Generators/libweb_bindings/constructors.py"
"${LADYBIRD_SOURCE_DIR}/Meta/Generators/libweb_bindings/context.py"
"${LADYBIRD_SOURCE_DIR}/Meta/Generators/libweb_bindings/cpp_types.py"
"${LADYBIRD_SOURCE_DIR}/Meta/Generators/libweb_bindings/default_values.py"
"${LADYBIRD_SOURCE_DIR}/Meta/Generators/libweb_bindings/extended_attributes.py"
"${LADYBIRD_SOURCE_DIR}/Meta/Generators/libweb_bindings/global_mixins.py"
"${LADYBIRD_SOURCE_DIR}/Meta/Generators/libweb_bindings/includes.py"
"${LADYBIRD_SOURCE_DIR}/Meta/Generators/libweb_bindings/interface_declaration.py"
"${LADYBIRD_SOURCE_DIR}/Meta/Generators/libweb_bindings/interfaces.py"
"${LADYBIRD_SOURCE_DIR}/Meta/Generators/libweb_bindings/intrinsics.py"
"${LADYBIRD_SOURCE_DIR}/Meta/Generators/libweb_bindings/iterables.py"
"${LADYBIRD_SOURCE_DIR}/Meta/Generators/libweb_bindings/named_and_indexed_properties.py"
"${LADYBIRD_SOURCE_DIR}/Meta/Generators/libweb_bindings/namespaces.py"
"${LADYBIRD_SOURCE_DIR}/Meta/Generators/libweb_bindings/operations.py"
"${LADYBIRD_SOURCE_DIR}/Meta/Generators/libweb_bindings/overload_resolution.py"
"${LADYBIRD_SOURCE_DIR}/Meta/Generators/libweb_bindings/to_idl_value.py"
"${LADYBIRD_SOURCE_DIR}/Meta/Generators/libweb_bindings/to_js_value.py"
"${LADYBIRD_SOURCE_DIR}/Meta/Utils/lexer.py"
"${LADYBIRD_SOURCE_DIR}/Meta/Utils/utils.py"
"${LADYBIRD_SOURCE_DIR}/Meta/Utils/webidl_parser.py")
set(exposed_interface_sources
Forward.h
IntrinsicDefinitions.cpp IntrinsicDefinitions.h
DedicatedWorkerExposedInterfaces.cpp DedicatedWorkerExposedInterfaces.h
SharedWorkerExposedInterfaces.cpp SharedWorkerExposedInterfaces.h
WindowExposedInterfaces.cpp WindowExposedInterfaces.h)
list(TRANSFORM exposed_interface_sources PREPEND "Bindings/")
target_sources(${target} PRIVATE ${exposed_interface_sources})
set(exposed_interface_headers ${exposed_interface_sources})
list(FILTER exposed_interface_headers INCLUDE REGEX "\.h$")
list(TRANSFORM exposed_interface_headers PREPEND "${CMAKE_CURRENT_BINARY_DIR}/")
if (ENABLE_INSTALL_HEADERS)
install(FILES ${exposed_interface_headers} DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/LibWeb/Bindings")
endif()
list(APPEND LIBWEB_ALL_GENERATED_HEADERS ${exposed_interface_headers})
set(LIBWEB_ALL_GENERATED_HEADERS ${LIBWEB_ALL_GENERATED_HEADERS} PARENT_SCOPE)
include("idl_files.cmake")
list(REMOVE_DUPLICATES LIBWEB_ALL_PARSED_IDL_FILES)
set(LIBWEB_ALL_IDL_FILES_ARGUMENT ${LIBWEB_ALL_IDL_FILES})
set(LIBWEB_ALL_PARSED_IDL_FILES_ARGUMENT ${LIBWEB_ALL_PARSED_IDL_FILES})
set(LIBWEB_BINDINGS_DEPFILE "${CMAKE_CURRENT_BINARY_DIR}/Bindings/LibWebBindings.d")
if (WIN32)
list(JOIN LIBWEB_ALL_IDL_FILES "\n" idl_file_list)
file(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/all_idl_files.txt" CONTENT "${idl_file_list}" NEWLINE_STYLE UNIX)
set(LIBWEB_ALL_IDL_FILES_ARGUMENT "@${CMAKE_CURRENT_BINARY_DIR}/all_idl_files.txt")
list(JOIN LIBWEB_ALL_PARSED_IDL_FILES "\n" parsed_idl_file_list)
file(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/all_parsed_idl_files.txt" CONTENT "${parsed_idl_file_list}" NEWLINE_STYLE UNIX)
set(LIBWEB_ALL_PARSED_IDL_FILES_ARGUMENT "@${CMAKE_CURRENT_BINARY_DIR}/all_parsed_idl_files.txt")
endif()
add_custom_command(
OUTPUT ${LIBWEB_ALL_BINDINGS_SOURCES} ${exposed_interface_sources}
COMMAND "${CMAKE_COMMAND}" -E make_directory "Bindings"
COMMAND "${Python3_EXECUTABLE}" "${bindings_generator}" -o "Bindings"
--depfile "${LIBWEB_BINDINGS_DEPFILE}"
${LIBWEB_ALL_PARSED_IDL_FILES_ARGUMENT}
VERBATIM
COMMENT "Generating LibWeb bindings"
DEPFILE "${LIBWEB_BINDINGS_DEPFILE}"
DEPENDS ${bindings_generator_dependencies} ${LIBWEB_ALL_IDL_FILES} ${LIBWEB_ALL_PARSED_IDL_FILES}
)
add_custom_target(generate_bindings DEPENDS ${LIBWEB_ALL_BINDINGS_SOURCES})
add_dependencies(ladybird_codegen_accumulator generate_bindings)
add_dependencies(${target} generate_bindings)
add_dependencies(generate_bindings ${generated_idl_targets})
add_custom_target(generate_exposed_interfaces DEPENDS ${exposed_interface_sources})
add_dependencies(ladybird_codegen_accumulator generate_exposed_interfaces)
add_dependencies(${target} generate_exposed_interfaces)
add_dependencies(generate_exposed_interfaces ${generated_idl_targets})
set(LIBWEB_ALL_GENERATED_HEADERS ${LIBWEB_ALL_GENERATED_HEADERS} PARENT_SCOPE)
endfunction()