123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- #[=======================================================================[.rst:
- python_callouts.cmake
- ---------------------
- This file contains functions which which rely on calling Python
- * Generate Trimmed API
- * Generate File List
- * Generate Bindings
- ]=======================================================================]
- #[[ Generate Trimmed API
- The build_profile.py has a __main__ and is used as a tool
- Its usage is listed as:
- $ python build_profile.py BUILD_PROFILE INPUT_JSON [OUTPUT_JSON]
- ]]
- function( build_profile_generate_trimmed_api BUILD_PROFILE INPUT_JSON OUTPUT_JSON )
- execute_process(
- COMMAND "${Python3_EXECUTABLE}" "build_profile.py" "${BUILD_PROFILE}" "${INPUT_JSON}" "${OUTPUT_JSON}"
- WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
- )
- endfunction( )
- #[[ Generate File List
- Use the binding_generator.py Python script to determine the list of files that
- will be passed to the code generator using extension_api.json.
- NOTE: This happens for every configure.]]
- function( binding_generator_get_file_list OUT_VAR_NAME API_FILEPATH OUTPUT_DIR )
- # This code snippet will be squashed into a single line
- # The two strings make this a list, in CMake lists are semicolon delimited strings.
- set( PYTHON_SCRIPT
- "from binding_generator import print_file_list"
- "print_file_list( api_filepath='${API_FILEPATH}',
- output_dir='${OUTPUT_DIR}',
- headers=True,
- sources=True)")
- message( DEBUG "Python:\n${PYTHON_SCRIPT}" )
- # Strip newlines and whitespace to make it a one-liner.
- string( REGEX REPLACE "\n *" " " PYTHON_SCRIPT "${PYTHON_SCRIPT}" )
- execute_process( COMMAND "${Python3_EXECUTABLE}" "-c" "${PYTHON_SCRIPT}"
- WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
- OUTPUT_VARIABLE GENERATED_FILES_LIST
- OUTPUT_STRIP_TRAILING_WHITESPACE
- )
- # Debug output
- message( DEBUG "FileList-Begin" )
- foreach( PATH ${GENERATED_FILES_LIST} )
- message( DEBUG ${PATH} )
- endforeach()
- # Error out if the file list generator returned no files.
- list( LENGTH GENERATED_FILES_LIST LIST_LENGTH )
- if( NOT LIST_LENGTH GREATER 0 )
- message( FATAL_ERROR "File List Generation Failed")
- endif()
- message( STATUS "There are ${LIST_LENGTH} Files to generate" )
- set( ${OUT_VAR_NAME} ${GENERATED_FILES_LIST} PARENT_SCOPE )
- endfunction( )
- #[[ Generate Bindings
- Using the generated file list, use the binding_generator.py to generate the
- godot-cpp bindings. This will run at build time only if there are files
- missing. ]]
- function( binding_generator_generate_bindings API_FILE USE_TEMPLATE_GET_NODE, BITS, PRECISION, OUTPUT_DIR )
- # This code snippet will be squashed into a single line
- set( PYTHON_SCRIPT
- "from binding_generator import generate_bindings"
- "generate_bindings(
- api_filepath='${API_FILE}',
- use_template_get_node='${USE_TEMPLATE_GET_NODE}',
- bits='${BITS}',
- precision='${PRECISION}',
- output_dir='${OUTPUT_DIR}')")
- message( DEBUG "Python:\n${PYTHON_SCRIPT}" )
- # Strip newlines and whitespace to make it a one-liner.
- string( REGEX REPLACE "\n *" " " PYTHON_SCRIPT "${PYTHON_SCRIPT}" )
- add_custom_command(OUTPUT ${GENERATED_FILES_LIST}
- COMMAND "${Python3_EXECUTABLE}" "-c" "${PYTHON_SCRIPT}"
- VERBATIM
- WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
- MAIN_DEPENDENCY ${GODOT_GDEXTENSION_API_FILE}
- DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/binding_generator.py
- COMMENT "Generating bindings"
- )
- endfunction( )
|