Использование CMake с setup.py
Для проекта я создаю библиотеку C и использую привязки Python (через самоанализ GObject) с помощью CMake. Я также хочу распространять некоторые вспомогательные модули Python, используя distutils. Я могу собрать и установить модуль с этим CMakeLists.txt
find_program(PYTHON "python")
if (PYTHON)
set(SETUP_PY_IN "${CMAKE_CURRENT_SOURCE_DIR}/setup.py.in")
set(SETUP_PY "${CMAKE_CURRENT_BINARY_DIR}/setup.py")
set(DEPS "${CMAKE_CURRENT_SOURCE_DIR}/module/__init__.py")
set(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/build")
configure_file(${SETUP_PY_IN} ${SETUP_PY})
add_custom_command(OUTPUT ${OUTPUT}
COMMAND ${PYTHON}
ARGS setup.py build
DEPENDS ${DEPS})
add_custom_target(target ALL DEPENDS ${OUTPUT})
install(CODE "execute_process(COMMAND ${PYTHON} ${SETUP_PY} install)")
endif()
и следующее setup.py.in
:
from distutils.core import setup, Extension
if __name__ == '__main__':
setup(name='foo',
version='${PACKAGE_VERSION}',
package_dir={ '': '${CMAKE_CURRENT_SOURCE_DIR}' },
packages=['module'])
К сожалению, шаг сборки выполняется каждый раз, когда я запускаю make
, Я думаю, проблема связана с выводом пользовательской команды, которая является каталогом, а не файлом. Теперь есть ли способ сказать CMake для запуска python setup.py build
только когда setup.py.in
или один из источников изменился?
1 ответ
Только файлы, а не каталоги, могут быть надежно использованы в качестве ВЫХОДА и ЗАВИСИМОСТИ. Вы можете изменить свою пользовательскую команду, чтобы также создать файл метки времени, что-то вроде этого:
add_custom_command(
OUTPUT ${OUTPUT}/timestamp
COMMAND ${PYTHON} setup.py build
COMMAND ${CMAKE_COMMAND} -E touch ${OUTPUT}/timestamp
DEPENDS ${DEPS}
)
add_custom_target(target ALL DEPENDS ${OUTPUT}/timestamp)