diff options
author | mormj <34754695+mormj@users.noreply.github.com> | 2020-05-22 14:21:09 -0400 |
---|---|---|
committer | Josh Morman <mormjb@gmail.com> | 2020-06-04 10:05:48 -0400 |
commit | 3165f73d7c6224523957fa69beade6069efea6ef (patch) | |
tree | bcc09005ab8cc6b2f6bef4589f5b612eeafb29be /cmake/Modules | |
parent | cb1185bc2c12c0c7bd76ab93040a63c39815e847 (diff) |
pybind: add hash check to binding file creation (#3472)
Diffstat (limited to 'cmake/Modules')
-rw-r--r-- | cmake/Modules/GrPybind.cmake | 172 |
1 files changed, 171 insertions, 1 deletions
diff --git a/cmake/Modules/GrPybind.cmake b/cmake/Modules/GrPybind.cmake index 7f3880c759..4f9fee6eba 100644 --- a/cmake/Modules/GrPybind.cmake +++ b/cmake/Modules/GrPybind.cmake @@ -46,8 +46,178 @@ add_dependencies(${name}_python ${name}_docstrings) endmacro(GR_PYBIND_MAKE) +macro(GR_PYBIND_MAKE_CHECK_HASH name updir filter files) + +configure_file(${CMAKE_SOURCE_DIR}/docs/doxygen/pydoc_macros.h ${CMAKE_CURRENT_BINARY_DIR} COPYONLY) + +list(APPEND regen_targets "") +foreach(file ${files}) + + execute_process(COMMAND "python3" + ${CMAKE_SOURCE_DIR}/gr-utils/bindtool/scripts/header_utils.py + "all" + ${CMAKE_CURRENT_SOURCE_DIR}/${file} + OUTPUT_VARIABLE flags_all + ) + list(GET flags_all 0 flag_auto) + list(GET flags_all 1 flag_pygccxml) + list(GET flags_all 2 header_filename) + list(GET flags_all 3 header_file_hash + ) + # message(STATUS ${file} ":" ${flag_auto} ":" ${flag_pygccxml} ":" ${header_filename} ":" ${header_file_hash}) + + if (NOT ${header_filename} STREQUAL "None") # If no header filename is specified, don't bother checking for a rebuild + if (${name} STREQUAL gr) + set(header_full_path ${CMAKE_CURRENT_SOURCE_DIR}/${updir}/include/gnuradio/${header_filename}) + else() + set(header_full_path ${CMAKE_CURRENT_SOURCE_DIR}/${updir}/include/gnuradio/${name}/${header_filename}) + endif() + + file(MD5 ${header_full_path} calc_hash) + # message(STATUS ${ii} " " ${calc_hash} " " ${saved_hash}) + if (NOT ${calc_hash} STREQUAL ${header_file_hash}) + # check the file and see if bindings should be automatically regenerated + if (flag_auto STREQUAL "False") # the regex match was not found, manual bindings + # if (NOT bindtool_use_pygccxml STREQUAL ) + message(FATAL_ERROR "Python bindings for " ${header_filename} " are out of sync" ) + else() + if (flag_pygccxml STREQUAL "True") + if(NOT PYGCCXML_FOUND) + message(FATAL_ERROR "Python bindings for " ${header_filename} " require pygccxml for automatic regeneration" ) + endif() + endif() + + message(STATUS "Regenerating Bindings in-place for " ${header_filename}) + + file(REMOVE ${CMAKE_CURRENT_BINARY_DIR}/${file}.regen_status) + # Automatically regenerate the bindings + add_custom_command( + OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}}/${file} + COMMAND "python3" + ${CMAKE_SOURCE_DIR}/gr-utils/bindtool/scripts/bind_intree_file.py + "--output_dir" ${CMAKE_CURRENT_SOURCE_DIR}/.. + "--prefix" ${CMAKE_INSTALL_PREFIX} + "--src" ${CMAKE_SOURCE_DIR} + "--module" ${name} + "--filename" ${header_full_path} + "--status" ${CMAKE_CURRENT_BINARY_DIR}/${file}.regen_status + "--flag_automatic" ${flag_auto} + "--flag_pygccxml" ${flag_pygccxml} + # "--include" "$<INSTALL_INTERFACE:include>" #FIXME: Make the pygccxml generation use the source tree headers + COMMENT "Automatic generation of pybind11 bindings for " ${header_full_path}) + add_custom_target(${file}_regen_bindings ALL DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}}/${file}) + list(APPEND regen_targets ${file}_regen_bindings) + endif() + + endif() + endif() +endforeach() + +pybind11_add_module(${name}_python ${files}) + +SET(MODULE_NAME ${name}) +if (${name} STREQUAL gr) + SET(MODULE_NAME "runtime") +endif() + +if(ENABLE_DOXYGEN) + add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/docstring_status + COMMAND python3 ${CMAKE_SOURCE_DIR}/docs/doxygen/update_pydoc.py "sub" + "--json_path" ${CMAKE_BINARY_DIR}/docs/doxygen/gnuradio_docstrings.json + "--bindings_dir" ${CMAKE_CURRENT_SOURCE_DIR}/docstrings + "--output_dir" ${CMAKE_CURRENT_BINARY_DIR} + "--filter" ${filter} + COMMENT "Adding docstrings into ${name} pybind headers ..." + DEPENDS gnuradio_docstrings gnuradio-${MODULE_NAME}) + add_custom_target(${name}_docstrings ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/docstring_status) +else(ENABLE_DOXYGEN) + add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/docstring_status + COMMAND python3 ${CMAKE_SOURCE_DIR}/docs/doxygen/update_pydoc.py "copy" + "--bindings_dir" ${CMAKE_CURRENT_SOURCE_DIR}/docstrings + "--output_dir" ${CMAKE_CURRENT_BINARY_DIR} + COMMENT "Copying ${name} docstring templates as pybind headers ...") + add_custom_target(${name}_docstrings ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/docstring_status) +endif(ENABLE_DOXYGEN) + +target_include_directories(${name}_python PUBLIC + ${CMAKE_CURRENT_BINARY_DIR} + ${PYTHON_NUMPY_INCLUDE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/${updir}/lib + ${CMAKE_CURRENT_SOURCE_DIR}/${updir}/include + ${PYBIND11_INCLUDE_DIR} +) +target_link_libraries(${name}_python PUBLIC ${Boost_LIBRARIES} ${PYTHON_LIBRARIES} gnuradio-${MODULE_NAME}) +target_compile_options(${name}_python PRIVATE -Wno-unused-variable) # disable warnings for docstring templates +add_dependencies(${name}_python ${name}_docstrings ${regen_targets}) + +endmacro(GR_PYBIND_MAKE_CHECK_HASH) + + + macro(GR_PYBIND_MAKE_OOT name updir filter files) +list(APPEND regen_targets "") +foreach(file ${files}) + + execute_process(COMMAND "python3" + ${CMAKE_CURRENT_SOURCE_DIR}/header_utils.py + "all" + ${CMAKE_CURRENT_SOURCE_DIR}/${file} + OUTPUT_VARIABLE flags_all + ) + list(GET flags_all 0 flag_auto) + list(GET flags_all 1 flag_pygccxml) + list(GET flags_all 2 header_filename) + list(GET flags_all 3 header_file_hash + ) + + # message(STATUS ${file} ":" ${flag_auto} ":" ${flag_pygccxml} ":" ${header_filename} ":" ${header_file_hash}) + + if (NOT ${header_filename} STREQUAL "None") # If no header filename is specified, don't bother checking for a rebuild + set(header_full_path ${CMAKE_CURRENT_SOURCE_DIR}/${updir}/include/${name}/${header_filename}) # NOTE OOT version does not have gnuradio/ here + file(MD5 ${header_full_path} calc_hash) + # message(STATUS ${ii} " " ${calc_hash} " " ${saved_hash}) + if (NOT ${calc_hash} STREQUAL ${header_file_hash}) + # check the file and see if bindings should be automatically regenerated + if (flag_auto STREQUAL "False") # the regex match was not found, manual bindings + # if (NOT bindtool_use_pygccxml STREQUAL ) + message(FATAL_ERROR "Python bindings for " ${header_filename} " are out of sync" ) + else() + if (flag_pygccxml STREQUAL "True") + if(NOT PYGCCXML_FOUND) + message(FATAL_ERROR "Python bindings for " ${header_filename} " require pygccxml for automatic regeneration" ) + endif() + endif() + + message(STATUS "Regenerating Bindings in-place for " ${header_filename}) + + file(REMOVE ${CMAKE_CURRENT_BINARY_DIR}/${file}.regen_status) + # Automatically regenerate the bindings + add_custom_command( + OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}}/${file} + COMMAND "python3" + ${CMAKE_CURRENT_SOURCE_DIR}/bind_oot_file.py + "--output_dir" ${CMAKE_CURRENT_SOURCE_DIR}/.. + "--prefix" ${CMAKE_INSTALL_PREFIX} + "--src" ${CMAKE_SOURCE_DIR} + "--module" ${name} + "--filename" ${header_full_path} + "--status" ${CMAKE_CURRENT_BINARY_DIR}/${file}.regen_status + "--flag_automatic" ${flag_auto} + "--flag_pygccxml" ${flag_pygccxml} + # "--include" "$<INSTALL_INTERFACE:include>" #FIXME: Make the pygccxml generation use the source tree headers + COMMENT "Automatic generation of pybind11 bindings for " ${header_full_path}) + add_custom_target(${file}_regen_bindings ALL DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}}/${file}) + list(APPEND regen_targets ${file}_regen_bindings) + endif() + + endif() + endif() +endforeach() + + configure_file(${CMAKE_SOURCE_DIR}/docs/doxygen/pydoc_macros.h ${CMAKE_CURRENT_BINARY_DIR} COPYONLY) pybind11_add_module(${name}_python ${files}) @@ -101,6 +271,6 @@ target_include_directories(${name}_python PUBLIC ) target_link_libraries(${name}_python PUBLIC ${Boost_LIBRARIES} ${PYTHON_LIBRARIES} gnuradio-${MODULE_NAME}) target_compile_options(${name}_python PRIVATE -Wno-unused-variable) # disable warnings for docstring templates -add_dependencies(${name}_python ${name}_docstrings) +add_dependencies(${name}_python ${name}_docstrings ${regen_targets}) endmacro(GR_PYBIND_MAKE_OOT)
\ No newline at end of file |