summaryrefslogtreecommitdiff
path: root/cmake/Modules
diff options
context:
space:
mode:
authormormj <34754695+mormj@users.noreply.github.com>2020-05-22 14:21:09 -0400
committerJosh Morman <mormjb@gmail.com>2020-06-04 10:05:48 -0400
commit3165f73d7c6224523957fa69beade6069efea6ef (patch)
treebcc09005ab8cc6b2f6bef4589f5b612eeafb29be /cmake/Modules
parentcb1185bc2c12c0c7bd76ab93040a63c39815e847 (diff)
pybind: add hash check to binding file creation (#3472)
Diffstat (limited to 'cmake/Modules')
-rw-r--r--cmake/Modules/GrPybind.cmake172
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