# Copyright 2020 The Dawn Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. find_package(PythonInterp REQUIRED) message(STATUS "Dawn: using python at ${PYTHON_EXECUTABLE}") # Check for Jinja2 if (NOT DAWN_JINJA2_DIR) message(STATUS "Dawn: Using system jinja2") execute_process( COMMAND ${PYTHON_EXECUTABLE} -c "import jinja2" RESULT_VARIABLE RET ) if (NOT RET EQUAL 0) message(FATAL_ERROR "Dawn: Missing dependencies for code generation, please ensure you have python-jinja2 installed.") endif() else() message(STATUS "Dawn: Using jinja2 at ${DAWN_JINJA2_DIR}") endif() # Function to invoke a generator_lib.py generator. # - SCRIPT is the name of the script to call # - ARGS are the extra arguments to pass to the script in addition to the base generator_lib.py arguments # - PRINT_NAME is the name to use when outputting status or errors # - RESULT_VARIABLE will be modified to contain the list of files generated by this generator function(DawnGenerator) set(oneValueArgs SCRIPT RESULT_VARIABLE PRINT_NAME) set(multiValueArgs ARGS) cmake_parse_arguments(G "" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) # Build the set of args common to all invocation of that generator. set(BASE_ARGS ${PYTHON_EXECUTABLE} ${G_SCRIPT} --template-dir "${DAWN_TEMPLATE_DIR}" --root-dir "${Dawn_SOURCE_DIR}" --output-dir "${DAWN_BUILD_GEN_DIR}" ${G_ARGS} ) if (DAWN_JINJA2_DIR) list(APPEND BASE_ARGS --jinja2-path ${DAWN_JINJA2_DIR}) endif() # Call the generator to get the list of its dependencies. execute_process( COMMAND ${BASE_ARGS} --print-cmake-dependencies OUTPUT_VARIABLE DEPENDENCIES RESULT_VARIABLE RET ) if (NOT RET EQUAL 0) message(FATAL_ERROR "Dawn: Failed to get the dependencies for ${G_PRINT_NAME}. Base args are '${BASE_ARGS}'.") endif() # Ask CMake to re-run if any of the dependencies changed as it might modify the build graph. if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.12.0") set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${DEPENDENCIES}) endif() # Call the generator to get the list of its outputs. execute_process( COMMAND ${BASE_ARGS} --print-cmake-outputs OUTPUT_VARIABLE OUTPUTS RESULT_VARIABLE RET ) if (NOT RET EQUAL 0) message(FATAL_ERROR "Dawn: Failed to get the outputs for ${G_PRINT_NAME}. Base args are '${BASE_ARGS}'.") endif() # Add the custom command that calls the generator. add_custom_command( COMMAND ${BASE_ARGS} DEPENDS ${DEPENDENCIES} OUTPUT ${OUTPUTS} COMMENT "Dawn: Generating files for ${G_PRINT_NAME}." ) # Return the list of outputs. set(${G_RESULT_VARIABLE} ${OUTPUTS} PARENT_SCOPE) endfunction() # Helper function to call dawn_generator.py: # - TARGET is the generator target to build # - PRINT_NAME and RESULT_VARIABLE are like for DawnGenerator function(DawnJSONGenerator) set(oneValueArgs TARGET RESULT_VARIABLE) cmake_parse_arguments(G "" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) DawnGenerator( SCRIPT "${Dawn_SOURCE_DIR}/generator/dawn_json_generator.py" ARGS --dawn-json "${Dawn_SOURCE_DIR}/dawn.json" --wire-json "${Dawn_SOURCE_DIR}/dawn_wire.json" --targets ${G_TARGET} RESULT_VARIABLE RET ${G_UNPARSED_ARGUMENTS} ) # Forward the result up one more scope set(${G_RESULT_VARIABLE} ${RET} PARENT_SCOPE) endfunction()