Skip to content

Commit 0cdd601

Browse files
authored
Simplify ament_python_install_package() macro. (#326)
Do not delegate to setuptools, install egg-info manually. Signed-off-by: Michel Hidalgo <[email protected]>
1 parent 2f544cf commit 0cdd601

File tree

3 files changed

+44
-197
lines changed

3 files changed

+44
-197
lines changed

ament_cmake_python/CMakeLists.txt

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4,31 +4,6 @@ project(ament_cmake_python NONE)
44

55
find_package(ament_cmake_core REQUIRED)
66

7-
set(ament_cmake_python_DIR "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
8-
include("ament_cmake_python-extras.cmake")
9-
ament_python_install_package(${PROJECT_NAME} NO_DATA)
10-
11-
include(CTest)
12-
13-
if(BUILD_TESTING)
14-
execute_process(
15-
COMMAND "${PYTHON_EXECUTABLE}" -m py_compile
16-
foo/__init__.py foo/bar/__init__.py baz/__init__.py
17-
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/test/data"
18-
)
19-
add_test(
20-
NAME test_find_packages_data
21-
COMMAND
22-
"${PYTHON_EXECUTABLE}"
23-
"${CMAKE_CURRENT_SOURCE_DIR}/test/test_find_packages_data.py"
24-
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/test/data"
25-
)
26-
set_tests_properties(test_find_packages_data PROPERTIES
27-
ENVIRONMENT "PYTHONPATH=${CMAKE_CURRENT_SOURCE_DIR}"
28-
TIMEOUT 30
29-
)
30-
endif()
31-
327
ament_package(
338
CONFIG_EXTRAS "ament_cmake_python-extras.cmake"
349
)

ament_cmake_python/ament_cmake_python/__init__.py

Lines changed: 0 additions & 102 deletions
This file was deleted.

ament_cmake_python/cmake/ament_python_install_package.cmake

Lines changed: 44 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
# limitations under the License.
1414

1515
#
16-
# Install a Python package (and its recursive subpackages) as a flat Python egg
16+
# Install a Python package (and its recursive subpackages)
1717
#
1818
# :param package_name: the Python package name
1919
# :type package_name: string
@@ -27,16 +27,14 @@
2727
# :param SETUP_CFG: string
2828
# :param SKIP_COMPILE: if set do not byte-compile the installed package
2929
# :type SKIP_COMPILE: option
30-
# :param NO_DATA: if set do not install any package data
31-
# :type NO_DATA: option
3230
#
3331
macro(ament_python_install_package)
3432
_ament_cmake_python_register_environment_hook()
3533
_ament_cmake_python_install_package(${ARGN})
3634
endmacro()
3735

3836
function(_ament_cmake_python_install_package package_name)
39-
cmake_parse_arguments(ARG "SKIP_COMPILE;NO_DATA" "PACKAGE_DIR;VERSION;SETUP_CFG" "" ${ARGN})
37+
cmake_parse_arguments(ARG "SKIP_COMPILE" "PACKAGE_DIR;VERSION;SETUP_CFG" "" ${ARGN})
4038
if(ARG_UNPARSED_ARGUMENTS)
4139
message(FATAL_ERROR "ament_python_install_package() called with unused "
4240
"arguments: ${ARG_UNPARSED_ARGUMENTS}")
@@ -70,11 +68,14 @@ function(_ament_cmake_python_install_package package_name)
7068
set(ARG_SETUP_CFG "${CMAKE_CURRENT_LIST_DIR}/${ARG_SETUP_CFG}")
7169
endif()
7270

71+
if(NOT PYTHON_INSTALL_DIR)
72+
message(FATAL_ERROR "ament_python_install_package() variable "
73+
"'PYTHON_INSTALL_DIR' must not be empty")
74+
endif()
75+
7376
set(build_dir "${CMAKE_CURRENT_BINARY_DIR}/ament_cmake_python/${package_name}")
74-
file(RELATIVE_PATH source_dir "${build_dir}" "${ARG_PACKAGE_DIR}")
7577

76-
if(ARG_NO_DATA)
77-
string(CONFIGURE "\
78+
string(CONFIGURE "\
7879
import os
7980
from setuptools import find_packages
8081
from setuptools import setup
@@ -83,85 +84,58 @@ setup(
8384
name='${package_name}',
8485
version='${ARG_VERSION}',
8586
packages=find_packages(
86-
where=os.path.normpath('${source_dir}/..'),
8787
include=('${package_name}', '${package_name}.*')),
88-
package_dir={'${package_name}': '${source_dir}'},
8988
)
9089
" setup_py_content)
91-
else()
92-
string(CONFIGURE "\
93-
import os
94-
from setuptools import find_packages
95-
from setuptools import setup
96-
97-
from ament_cmake_python import find_packages_data
98-
99-
setup(
100-
name='${package_name}',
101-
version='${ARG_VERSION}',
102-
packages=find_packages(
103-
where=os.path.normpath('${source_dir}/..'),
104-
include=('${package_name}', '${package_name}.*')),
105-
package_dir={'${package_name}': '${source_dir}'},
106-
package_data=find_packages_data(
107-
where=os.path.normpath('${source_dir}/..'),
108-
include=('${package_name}', '${package_name}.*'))
109-
)
110-
" setup_py_content)
111-
endif()
11290

11391
file(GENERATE
11492
OUTPUT "${build_dir}/setup.py"
11593
CONTENT "${setup_py_content}"
11694
)
11795

11896
if(ARG_SETUP_CFG)
119-
add_custom_command(
120-
OUTPUT "${build_dir}/setup.cfg"
121-
COMMAND ${CMAKE_COMMAND} -E copy "${ARG_SETUP_CFG}" "${build_dir}/setup.cfg"
122-
MAIN_DEPENDENCY "${ARG_SETUP_CFG}"
123-
)
124-
add_custom_target(${package_name}_setup ALL
125-
DEPENDS "${build_dir}/setup.cfg"
97+
add_custom_target(
98+
ament_cmake_python_symlink_${package_name}_setup ALL
99+
COMMAND ${CMAKE_COMMAND} -E create_symlink
100+
"${ARG_SETUP_CFG}" "${build_dir}/setup.cfg"
126101
)
127102
endif()
128103

129-
if(NOT ARG_SKIP_COMPILE)
130-
set(extra_install_args --compile)
131-
else()
132-
set(extra_install_args --no-compile)
133-
endif()
104+
add_custom_target(
105+
ament_cmake_python_symlink_${package_name} ALL
106+
COMMAND ${CMAKE_COMMAND} -E create_symlink
107+
"${ARG_PACKAGE_DIR}" "${build_dir}/${package_name}"
108+
)
109+
110+
add_custom_target(
111+
ament_cmake_python_build_${package_name}_egg ALL
112+
COMMAND ${PYTHON_EXECUTABLE} setup.py egg_info
113+
WORKING_DIRECTORY "${build_dir}"
114+
)
134115

135-
# Install as flat Python .egg to mimic https://github.com/colcon/colcon-core
136-
# handling of pure Python packages.
137-
138-
# NOTE(hidmic): Allow setup.py install to build, as there is no way to
139-
# determine the Python package's source dependencies for proper build
140-
# invalidation.
141-
install(CODE
142-
"set(extra_install_args ${extra_install_args})
143-
set(install_dir \"${CMAKE_INSTALL_PREFIX}/${PYTHON_INSTALL_DIR}\")
144-
if(DEFINED ENV{DESTDIR} AND NOT \"\$ENV{DESTDIR}\" STREQUAL \"\")
145-
list(APPEND extra_install_args --root \$ENV{DESTDIR})
146-
file(TO_CMAKE_PATH \"\$ENV{DESTDIR}/\${install_dir}\" install_dir)
147-
endif()
148-
message(STATUS
149-
\"Installing: ${package_name} as flat Python egg under \${install_dir}\")
150-
file(TO_NATIVE_PATH \"${CMAKE_INSTALL_PREFIX}\" install_prefix)
151-
file(TO_NATIVE_PATH \"${CMAKE_INSTALL_PREFIX}/bin\" scripts_install_dir)
152-
execute_process(
153-
COMMAND
154-
\"${PYTHON_EXECUTABLE}\" setup.py install
155-
--single-version-externally-managed
156-
--install-scripts \${scripts_install_dir}
157-
--prefix \${install_prefix}
158-
--record install.log
159-
\${extra_install_args}
160-
WORKING_DIRECTORY \"${build_dir}\"
161-
OUTPUT_QUIET
162-
)"
116+
install(
117+
DIRECTORY "${build_dir}/${package_name}.egg-info"
118+
DESTINATION "${PYTHON_INSTALL_DIR}/"
163119
)
164120

121+
install(
122+
DIRECTORY "${ARG_PACKAGE_DIR}/"
123+
DESTINATION "${PYTHON_INSTALL_DIR}/${package_name}"
124+
PATTERN "*.pyc" EXCLUDE
125+
PATTERN "__pycache__" EXCLUDE
126+
)
127+
128+
if(NOT ARG_SKIP_COMPILE)
129+
# compile Python files
130+
install(CODE
131+
"execute_process(
132+
COMMAND
133+
\"${PYTHON_EXECUTABLE}\" \"-m\" \"compileall\"
134+
\"${CMAKE_INSTALL_PREFIX}/${PYTHON_INSTALL_DIR}/${package_name}\"
135+
)"
136+
)
137+
endif()
138+
165139
if(package_name IN_LIST AMENT_CMAKE_PYTHON_INSTALL_INSTALLED_NAMES)
166140
message(FATAL_ERROR
167141
"ament_python_install_package() a Python module file or package with "

0 commit comments

Comments
 (0)