13
13
# limitations under the License.
14
14
15
15
#
16
- # Install a Python package (and its recursive subpackages) as a flat Python egg
16
+ # Install a Python package (and its recursive subpackages)
17
17
#
18
18
# :param package_name: the Python package name
19
19
# :type package_name: string
27
27
# :param SETUP_CFG: string
28
28
# :param SKIP_COMPILE: if set do not byte-compile the installed package
29
29
# :type SKIP_COMPILE: option
30
- # :param NO_DATA: if set do not install any package data
31
- # :type NO_DATA: option
32
30
#
33
31
macro (ament_python_install_package )
34
32
_ament_cmake_python_register_environment_hook ()
35
33
_ament_cmake_python_install_package (${ARGN} )
36
34
endmacro ()
37
35
38
36
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} )
40
38
if (ARG_UNPARSED_ARGUMENTS )
41
39
message (FATAL_ERROR "ament_python_install_package() called with unused "
42
40
"arguments: ${ARG_UNPARSED_ARGUMENTS} " )
@@ -70,11 +68,14 @@ function(_ament_cmake_python_install_package package_name)
70
68
set (ARG_SETUP_CFG "${CMAKE_CURRENT_LIST_DIR} /${ARG_SETUP_CFG} " )
71
69
endif ()
72
70
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
+
73
76
set (build_dir "${CMAKE_CURRENT_BINARY_DIR} /ament_cmake_python/${package_name} " )
74
- file (RELATIVE_PATH source_dir "${build_dir} " "${ARG_PACKAGE_DIR} " )
75
77
76
- if (ARG_NO_DATA )
77
- string (CONFIGURE "\
78
+ string (CONFIGURE "\
78
79
import os
79
80
from setuptools import find_packages
80
81
from setuptools import setup
@@ -83,85 +84,58 @@ setup(
83
84
name='${package_name} ',
84
85
version='${ARG_VERSION} ',
85
86
packages=find_packages(
86
- where=os.path.normpath('${source_dir} /..'),
87
87
include=('${package_name} ', '${package_name} .*')),
88
- package_dir={'${package_name} ': '${source_dir} '},
89
88
)
90
89
" 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 ()
112
90
113
91
file (GENERATE
114
92
OUTPUT "${build_dir} /setup.py"
115
93
CONTENT "${setup_py_content} "
116
94
)
117
95
118
96
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"
126
101
)
127
102
endif ()
128
103
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
+ )
134
115
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} /"
163
119
)
164
120
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
+
165
139
if (package_name IN_LIST AMENT_CMAKE_PYTHON_INSTALL_INSTALLED_NAMES )
166
140
message (FATAL_ERROR
167
141
"ament_python_install_package() a Python module file or package with "
0 commit comments