2012-11-08 30 views
14

Đối với một dự án, tôi xây dựng một thư viện C và ngụ ý ràng buộc Python (thông qua tính từ nội tại GObject) với CMake. Tôi cũng muốn phân phối một số mô-đun trợ giúp Python bằng cách sử dụng các dấu rãnh. Tôi có thể xây dựng và cài đặt module với điều này CMakeLists.txtSử dụng CMake với setup.py

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 sau:

from distutils.core import setup, Extension 

if __name__ == '__main__': 
    setup(name='foo', 
      version='${PACKAGE_VERSION}', 
      package_dir={ '': '${CMAKE_CURRENT_SOURCE_DIR}' }, 
      packages=['module']) 

Thật không may, bước xây dựng được thực hiện mỗi khi tôi chạy make. Tôi đoán, vấn đề là liên quan đến đầu ra của lệnh tùy chỉnh mà là một thư mục chứ không phải là một tập tin. Bây giờ, có cách nào để yêu cầu CMake chạy python setup.py build chỉ khi setup.py.in hoặc một trong các nguồn thay đổi không?

Trả lời

7

Chỉ các tệp, không phải thư mục, có thể được sử dụng một cách đáng tin cậy như OUTPUT và DEPENDS. Bạn có thể sửa đổi lệnh tùy chỉnh của mình để cũng tạo tệp thời gian, như sau:

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) 
+0

Chính xác những gì tôi đang tìm kiếm. Cảm ơn. – matthias

Các vấn đề liên quan