2013-02-09 34 views
8

Tôi đang viết một thư viện C++ có thể được sử dụng từ cả C++ và Python trên Mac và Linux. Vì vậy, tôi đã quyết định sử dụng CMake và SWIG cho dự án của tôi.`make install` với CMake + SWIG + Python

Cũng được mô tả trong tài liệu SWIG 2.0, kết hợp SWIG và CMake cũng hoạt động tốt trên máy Mac của tôi. http://www.swig.org/Doc2.0/SWIGDocumentation.html#Introduction_build_system

Nhưng tôi có câu hỏi về make install.

Sau khi nhập cmake .make, _example.so đã được tạo thành công. Nhưng make install không hoạt động, vì Makefile được tạo tự động không có mục tiêu install. Tôi muốn biết làm thế nào tôi có thể thêm mục tiêu install trong Makefile. Tôi muốn _example.so được cài đặt theo thư mục site-packages trên mỗi hệ thống.

Tôi rất cảm kích nếu có ai đó có thể cho tôi biết cách sửa đổi ví dụ CMake được viết trong liên kết ở trên.

Trả lời

7

Giao diện CMake tới make install là lệnh CMake install(). Trong ví dụ của bạn, bạn có thể thêm một quy tắc cài đặt như thế này:

install(
    TARGETS ${SWIG_MODULE_example_REAL_NAME} 
    # ... add other arguments to install() as necessary 
) 

Khi có bất kỳ install() lệnh trong một CMakeList, CMake sẽ tạo ra một mục tiêu install callable như make install.

+0

Cảm ơn rất nhiều. Tôi sẽ thêm một câu trả lời để hiển thị toàn bộ các lệnh. –

+0

Tự hỏi làm thế nào để tạo ra tên biến động ... Mặc dù kỳ vọng của tôi, '$ {SWIG_MODULE _ $ {PROJECT_NAME} _REAL_NAME}' dường như hoạt động! – Melebius

8
find_package(SWIG REQUIRED) 
find_package(PythonLibs REQUIRED) 

include(${SWIG_USE_FILE}) 
set(CMAKE_SWIG_FLAGS "") 
include_directories(${PYTHON_INCLUDE_DIRS}) 

set_source_files_properties(target.i PROPERTIES CPLUSPLUS ON) 
set_source_files_properties(target.i PROPERTIES SWIG_FLAGS "-includeall") 
swig_add_module(target python target.i ${SOURCES}) 
swig_link_libraries(target ${PYTHON_LIBRARIES}) 

execute_process(COMMAND python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()" OUTPUT_VARIABLE PYTHON_SITE_PACKAGES OUTPUT_STRIP_TRAILING_WHITESPACE) 
install(TARGETS _target DESTINATION ${PYTHON_SITE_PACKAGES}) 
install(FILES ${CMAKE_BINARY_DIR}/src/target.py DESTINATION ${PYTHON_SITE_PACKAGES}) 
+0

Tính năng này hoạt động như thế nào nếu CMAKE_INSTALL_PREFIX được đặt thành một thư mục cục bộ? PYTHON_SITE_PACKAGES sẽ trỏ đến thư mục hệ thống và không sử dụng tiền tố ... –

+0

Tôi tìm thấy câu trả lời trong tệp python CMakeLists.txt của libftdi. Tôi không hiểu nó đủ tốt để đáp ứng với bất kỳ bản cập nhật nào được nêu ra nhưng đối với bất cứ ai cũng quan tâm kiểm tra http://developer.intra2net.com/git/?p=libftdi;a=blob;f=python/CMakeLists.txt; h = 93410544fac2a45eec51cb8dd344708b3bbdfe67; hb = HEAD –

+0

Hành vi này như mong đợi trong thế giới Python. Thư viện được cài đặt vào môi trường mà một cuộc gọi ngây thơ đến python sẽ sử dụng. Điều này cho phép bạn cài đặt vào virtualenv hiện đang được kích hoạt hoặc những gì có bạn. –

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