Skip to content

Commit

Permalink
ENH: Support "compiling" source file exclusively to .pyc
Browse files Browse the repository at this point in the history
Introduce the option CTK_COMPILE_PYTHON_SCRIPT_KEEP_ONLY_PYC
to support remove `*.py` scripts once the corresponding `.pyc`
file has been generated in the destination directory.

Update `_ctk_add_compile_python_directories_target` to accept `keep_only_pyc` argument.

Update CMake function `ctkFunctionAddCompilePythonScriptTargets` to
accept the `KEEP_ONLY_PYC` option and call `_ctk_add_compile_python_directories_target`
accordingly.

Update CMake macro `ctkMacroCompilePythonScript` to call `ctkFunctionAddCompilePythonScriptTargets`
passing KEEP_ONLY_PYC based on the value of `CTK_COMPILE_PYTHON_SCRIPT_KEEP_ONLY_PYC`.

Address warning when using CMake >= 3.13, setting CMP0077 to NEW.
See https://cmake.org/cmake/help/latest/policy/CMP0077.html

Co-authored-by: Jean-Christophe Fillion-Robin <[email protected]>
  • Loading branch information
jcfr committed Mar 20, 2024
1 parent cbf0111 commit 103fc97
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 22 deletions.
47 changes: 27 additions & 20 deletions CMake/ctkMacroCompilePythonScript.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,16 @@
#

include(${CTK_CMAKE_DIR}/ctkMacroParseArguments.cmake)
if(${CMAKE_VERSION} VERSION_LESS "3.5")
include(CMakeParseArguments)
endif()

set(CTK_PYTHON_COMPILE_FILE_SCRIPT_DIR "${CMAKE_BINARY_DIR}/CMakeFiles")

# Setting this option to TRUE disable the copy of ".py" files into the
# destination directory associated with ctkMacroCompilePythonScript.
if(NOT DEFINED CTK_COMPILE_PYTHON_SCRIPT_SKIP_SCRIPT_COPY)
set(CTK_COMPILE_PYTHON_SCRIPT_SKIP_SCRIPT_COPY FALSE)
# Setting this option to TRUE remove the relevant ".py" files from the
# destination directory after they have been byte-compiled in ctkMacroCompilePythonScript.
if(NOT DEFINED CTK_COMPILE_PYTHON_SCRIPT_KEEP_ONLY_PYC)
set(CTK_COMPILE_PYTHON_SCRIPT_KEEP_ONLY_PYC FALSE)
endif()

#! \ingroup CMakeAPI
Expand Down Expand Up @@ -104,11 +107,11 @@ macro(ctkMacroCompilePythonScript)
USE_SOURCE_PERMISSIONS)

if(NOT MY_GLOBAL_TARGET)
set(_skip_script_copy_option)
if(CTK_COMPILE_PYTHON_SCRIPT_SKIP_SCRIPT_COPY)
set(_skip_script_copy_option SKIP_SCRIPT_COPY)
set(_keep_only_pyc_option)
if(CTK_COMPILE_PYTHON_SCRIPT_KEEP_ONLY_PYC)
set(_keep_only_pyc_option KEEP_ONLY_PYC)
endif()
ctkFunctionAddCompilePythonScriptTargets(${target} ${_skip_script_copy_option})
ctkFunctionAddCompilePythonScriptTargets(${target} ${_keep_only_pyc_option})
endif()
endmacro()

Expand Down Expand Up @@ -141,7 +144,7 @@ function(_ctk_add_copy_python_files_target target type)
endfunction()


function(_ctk_add_compile_python_directories_target target)
function(_ctk_add_compile_python_directories_target target keep_only_pyc)
set(target_name Compile${target}PythonFiles)
if(NOT TARGET ${target_name})
# Byte compile the Python files.
Expand All @@ -155,7 +158,10 @@ function(_ctk_add_compile_python_directories_target target)
list(GET tuple 1 tgt_file)
list(GET tuple 2 dest_dir)
set(tgt ${dest_dir}/${tgt_file})
set(_compileall_code "${_compileall_code}\nctk_compile_file('${tgt}', force=1)")
set(_compileall_code "${_compileall_code}\nsuccess = ctk_compile_file('${tgt}', force=1)")
if(keep_only_pyc)
set(_compileall_code "${_compileall_code}\nif success: Path('${tgt}').unlink()")
endif()
endforeach()

if(NOT PYTHONINTERP_FOUND)
Expand Down Expand Up @@ -193,15 +199,16 @@ function(_ctk_add_compile_python_directories_target target)
endfunction()

function(ctkFunctionAddCompilePythonScriptTargets target)
ctkMacroParseArguments(MY
""
"SKIP_SCRIPT_COPY"
${ARGN}
set(options
KEEP_ONLY_PYC
)
# Skip defining the target CopySlicerPythonScriptFiles when the argument skip_script_copy is set to True
if(NOT MY_SKIP_SCRIPT_COPY)
_ctk_add_copy_python_files_target(${target} Script ${ARGN})
endif()
_ctk_add_copy_python_files_target(${target} Resource ${ARGN})
_ctk_add_compile_python_directories_target(${target})
set(oneValueArgs
)
set(multiValueArgs
)
cmake_parse_arguments(MY "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})

_ctk_add_copy_python_files_target(${target} Script ${MY_UNPARSED_ARGUMENTS})
_ctk_add_copy_python_files_target(${target} Resource ${MY_UNPARSED_ARGUMENTS})
_ctk_add_compile_python_directories_target(${target} ${MY_KEEP_ONLY_PYC})
endfunction()
2 changes: 2 additions & 0 deletions CMake/ctk_compile_python_scripts.cmake.in
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ import sys
import py_compile
import struct
from pathlib import Path
def ctk_compile_file(fullname, ddir=None, force=0, rx=None, quiet=0):
\"\"\"Byte-compile one file.
Expand Down
4 changes: 2 additions & 2 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -747,9 +747,9 @@ mark_as_superbuild(CTK_ENABLE_Python_Wrapping)

include(CMakeDependentOption)
cmake_dependent_option(
CTK_COMPILE_PYTHON_SCRIPT_SKIP_SCRIPT_COPY "Disable copy of .py files when using ctkMacroCompilePythonScript()" OFF
CTK_COMPILE_PYTHON_SCRIPT_KEEP_ONLY_PYC "Remove .py scripts from destination directory after compiling to .pyc" OFF
"CTK_ENABLE_Python_Wrapping" OFF)
mark_as_superbuild(CTK_COMPILE_PYTHON_SCRIPT_SKIP_SCRIPT_COPY)
mark_as_superbuild(CTK_COMPILE_PYTHON_SCRIPT_KEEP_ONLY_PYC)

# Build examples
# Create the logical expression containing the minimum set of required options
Expand Down

0 comments on commit 103fc97

Please sign in to comment.