Использование CMake с setup.py - программирование
Подтвердить что ты не робот

Использование 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 или один из источников изменился?

4b9b3361

Ответ 1

Только файлы, а не каталоги, могут быть надежно использованы как OUTPUT и DEPENDS. Вы можете изменить свою пользовательскую команду, чтобы также создать файл временной отметки, например:

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)