ctkMacroCompilePythonScript.cmake 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. #
  2. # Based on ParaView/VTK/Utilities/vtkTclTest2Py/CMakeLists.txt and
  3. # ParaView/VTK/Wrapping/Python/CMakeLists.txt
  4. #
  5. MACRO(ctkMacroCompilePythonScript)
  6. ctkMacroParseArguments(MY
  7. "TARGET_NAME;SCRIPTS;RESOURCES;DESTINATION_DIR;INSTALL_DIR"
  8. ""
  9. ${ARGN}
  10. )
  11. FIND_PACKAGE(PythonInterp REQUIRED)
  12. FIND_PACKAGE(PythonLibs REQUIRED)
  13. # Extract python lib path
  14. get_filename_component(PYTHON_LIBRARY_PATH ${PYTHON_LIBRARY} PATH)
  15. # Sanity checks
  16. FOREACH(varname TARGET_NAME SCRIPTS DESTINATION_DIR;INSTALL_DIR)
  17. IF(NOT DEFINED MY_${varname})
  18. MESSAGE(SEND_ERROR "${varname} is mandatory")
  19. ENDIF()
  20. ENDFOREACH()
  21. set(copied_files)
  22. set(copied_python_files)
  23. FOREACH(file ${MY_SCRIPTS})
  24. # Append "py" extension if needed
  25. get_filename_component(file_ext ${file} EXT)
  26. IF(NOT "${file_ext}" MATCHES "py")
  27. SET(file "${file}.py")
  28. ENDIF()
  29. SET(src "${CMAKE_CURRENT_SOURCE_DIR}/${file}")
  30. SET(tgt "${MY_DESTINATION_DIR}/${file}")
  31. IF(IS_ABSOLUTE ${file})
  32. SET(src ${file})
  33. file(RELATIVE_PATH tgt_file ${CMAKE_CURRENT_BINARY_DIR} ${file})
  34. SET(tgt "${MY_DESTINATION_DIR}/${tgt_file}")
  35. ENDIF()
  36. SET(copied_python_files ${copied_python_files} ${tgt})
  37. SET(copied_files ${copied_files} ${tgt})
  38. ADD_CUSTOM_COMMAND(DEPENDS ${src}
  39. COMMAND ${CMAKE_COMMAND} -E copy ${src} ${tgt}
  40. OUTPUT ${tgt}
  41. COMMENT "Copying python script: ${file}.py")
  42. ENDFOREACH()
  43. IF(DEFINED MY_RESOURCES)
  44. FOREACH(file ${MY_RESOURCES})
  45. SET(src "${CMAKE_CURRENT_SOURCE_DIR}/${file}")
  46. SET(tgt "${MY_DESTINATION_DIR}/${file}")
  47. SET(copied_files ${copied_files} ${tgt})
  48. ADD_CUSTOM_COMMAND(DEPENDS ${src}
  49. COMMAND ${CMAKE_COMMAND} -E copy ${src} ${tgt}
  50. OUTPUT ${tgt}
  51. COMMENT "Copying python resource: ${file}")
  52. ENDFOREACH()
  53. ADD_CUSTOM_TARGET(Copy${MY_TARGET_NAME}PythonFiles
  54. ALL
  55. DEPENDS ${copied_files})
  56. ENDIF()
  57. # Byte compile the Python files.
  58. SET(compile_all_script "${CMAKE_CURRENT_BINARY_DIR}/compile_${MY_TARGET_NAME}_python_scripts.py")
  59. # Generate compile_${MY_TARGET_NAME}_python_scripts.py
  60. FILE(WRITE ${compile_all_script} "
  61. #
  62. # Generated by ctkMacroCompilePythonScript CMAKE macro
  63. #
  64. # Based on paraview/VTK/Wrapping/Python/compile_all_vtk.py.in
  65. import compileall
  66. compileall.compile_dir('@MY_DESTINATION_DIR@')
  67. file = open('@CMAKE_CURRENT_BINARY_DIR@/python_compile_@MY_TARGET_NAME@_complete', 'w')
  68. file.write('Done')
  69. ")
  70. # Configure cmake script associated with the custom command
  71. # required to properly update the library path with PYTHON_LIBRARY_PATH
  72. SET(compile_all_cmake_script "${CMAKE_CURRENT_BINARY_DIR}/compile_${MY_TARGET_NAME}_python_scripts.cmake")
  73. FILE(WRITE ${compile_all_cmake_script} "
  74. #
  75. # Generated by ctkMacroCompilePythonScript CMAKE macro
  76. #
  77. IF(WIN32)
  78. SET(ENV{PATH} \"@PYTHON_LIBRARY_PATH@;\$ENV{PATH}\")
  79. ELSEIF(APPLE)
  80. SET(ENV{DYLD_LIBRARY_PATH} \"@PYTHON_LIBRARY_PATH@:\$ENV{DYLD_LIBRARY_PATH}\")
  81. ELSE()
  82. SET(ENV{LD_LIBRARY_PATH} \"@PYTHON_LIBRARY_PATH@:\$ENV{LD_LIBRARY_PATH}\")
  83. ENDIF()
  84. EXECUTE_PROCESS(
  85. COMMAND \"@PYTHON_EXECUTABLE@\" \"@compile_all_script@\"
  86. )
  87. ")
  88. ADD_CUSTOM_COMMAND(
  89. COMMAND ${CMAKE_COMMAND} -P ${compile_all_cmake_script}
  90. DEPENDS ${copied_python_files} ${compile_all_script}
  91. OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/python_compile_${MY_TARGET_NAME}_complete"
  92. COMMENT "Compiling python scripts: ${MY_TARGET_NAME}"
  93. )
  94. ADD_CUSTOM_TARGET(Compile${MY_TARGET_NAME}PythonFiles ALL
  95. DEPENDS
  96. ${CMAKE_CURRENT_BINARY_DIR}/python_compile_${MY_TARGET_NAME}_complete
  97. ${compile_all_script}
  98. )
  99. # Install python module directory
  100. INSTALL(DIRECTORY "${MY_DESTINATION_DIR}"
  101. DESTINATION "${MY_INSTALL_DIR}" COMPONENT Runtime
  102. USE_SOURCE_PERMISSIONS)
  103. ENDMACRO()