2012-04-03 23 views
11

cmake tạo ra một cái gì đó như sau cho sự cai trị cài đặt:Có thể thêm các lệnh sau khi cài đặt vào Makefile cấp cao nhất được tạo bởi cmake không?

# Special rule for the target install 
install: preinstall 
     @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." 
     /usr/local/bin/cmake -P cmake_install.cmake 
.PHONY : install 

Những gì tôi muốn làm là có một số lệnh tùy chỉnh thực hiện sau khi cmake_install.cmake được gọi để nó trông giống như sau:

# Special rule for the target install 
install: preinstall 
     @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." 
     /usr/local/bin/cmake -P cmake_install.cmake 
     post_install_command_1 
     ... 
     post_install_command_n 
.PHONY : install 

Tôi có thể làm những gì tôi muốn bằng cách sử dụng "add_custom_command (TARGET ... POST_BUILD ...)" cho những thứ mà chúng tôi đã viết (6 - 10 macro để cập nhật). Tuy nhiên, có một loạt các thứ bên thứ ba được cài đặt và tôi thực sự không muốn thêm các lệnh tùy chỉnh POST_BUILD cho tất cả chúng (hiện tại có 19 dự án với nhiều dự án hơn và có thể khó xác định những gì cần xử lý sau khi xây dựng thay vì sau khi cài đặt). Tôi nghĩ sẽ dễ dàng hơn để duy trì nếu lệnh tùy chỉnh chỉ được sử dụng ở một nơi (tức là phần cuối cùng của quá trình cài đặt) và nơi tôi biết chúng sẽ làm mọi thứ cần thiết.

Có thể lấy cmake để thêm lệnh vào quy tắc cài đặt của Makefile cấp cao nhất không?

Trả lời

8

Bạn có thể sử dụng biến thể SCRIPT hoặc CODE của lệnh install. Nếu bạn đặt các lệnh cần thiết trong một kịch bản PostInstall.cmake trong thư mục gốc của dự án, thêm cuộc gọi sau đây để ngoài cùng CMakeLists.txt của bạn:

install (SCRIPT "${CMAKE_SOURCE_DIR}/PostInstall.cmake") 

install lệnh được thêm vào cmake_install.cmake kịch bản theo thứ tự, do đó các cuộc gọi nên được thêm vào kết thúc của CMakeLists.txt để chạy sau khi tất cả các cài đặt khác đã hoàn tất.

+0

Cảm ơn bạn! Tôi thề rằng tôi đã thử một cái gì đó như thế này và nó đã không hoạt động. Thử lại lần nữa và nó hoạt động.Đoán tôi phải có một lỗi đánh máy (hoặc cái gì đó) mà giữ nó làm việc. – joast

+4

Tính năng này không hoạt động đối với bản dựng của tôi với các thư mục con. Sự kết thúc của CMakeLists.txt ngoài cùng được thực hiện trước khi tất cả các cmake_install.cmake được đưa vào từ các thư mục con. – rickfoosusa

+0

Ít khó khăn, đặc biệt là liên quan đến việc chỉ định đường dẫn cài đặt thư mục con và mục tiêu từ gốc, nhưng cuối cùng nó hoạt động. – taranaki

3

Để thêm bước cài đặt bài đăng, bạn cần thêm thư mục ở cấp cao nhất CMakeLists.txt. Bạn phải có một thư mục với một CMakeLists.txt trong nó để thiết lập các bước cài đặt bài đăng sẽ được thực thi cuối cùng trong tiến trình cài đặt.

Bước đầu tiên là thêm các biến và giá trị được sử dụng bởi tập lệnh cài đặt bài đăng. Không có biến nào trong quá trình xây dựng sẽ có sẵn bài đăng, vì vậy mọi thứ bạn cần phải được thiết lập tại đây.

Ở cấp cao nhất CMakeLists.txt, sau khi tất cả các lệnh add_subdirectory trước đó đã được thực hiện, hãy thêm một cái gì đó như thế này.

# Workaround for the lack of post_install steps. 
# add_subdirectory is executed in order, this one must be last. 
if(CMAKE_PROGRAM_PREFIX) 
    # Make sure this is the LAST directory added. 
    add_subdirectory(${CMAKE_SOURCE_DIR}/cmake/postinstall) 
    # Add any variables you need during post install. 
    install(CODE "set(CMAKE_PROGRAM_PREFIX \"${CMAKE_PROGRAM_PREFIX}\")") 
    # Add any properties to your post install. 
    get_property(PROGRAM_PREFIX_FILES GLOBAL PROPERTY PROGRAM_PREFIX_FILES) 
    install(CODE "set(PROGRAM_PREFIX_FILES \"${PROGRAM_PREFIX_FILES}\")") 
endif() 

Bây giờ chúng tôi có các biến và thuộc tính được chuyển đổi sang các biến có sẵn để sử dụng khi cài đặt bài đăng.

Tiếp theo, chúng tôi cần tệp CMakeLists.txt trong thư mục cài đặt sau. Cmake sẽ thực thi tệp này ở cuối bản dựng. Tại thời điểm đó, chúng tôi cài đặt SCRIPT thực hiện công việc trong khi cài đặt bài đăng.

# CMake will execute this last in the build. 
# Install the script that does the post install work. 
install(SCRIPT "${CMAKE_SOURCE_DIR}/cmake/postinstall/ProgramPrefix.cmake") 

Bây giờ chúng tôi sẽ được kiểm soát trong khi cài đặt bài đăng trong ProgramPrefix.cmake. CMake sẽ thêm các biến mà chúng ta đã thiết lập trước đó.

# Make sure this was requested. 
if(CMAKE_PROGRAM_PREFIX) 
    # CMake builds a manifest of all files it has installed. 
    foreach(file ${CMAKE_INSTALL_MANIFEST_FILES}) 
     # Make a list of installed files to compare. 
     get_filename_component(nm ${file} NAME) 
     list(APPEND fileindex ${nm}) 
    endforeach() 

    # Process program prefix files. 
    foreach(nm ${PROGRAM_PREFIX_FILES}) 
     list(FIND fileindex ${nm} efound) 
     # Did we match a manifest file with our list of files? 
     if(NOT efound LESS 0) 
      # Process the file. 
      program_prefix_file(${efound}) 
     endif() 
    endforeach() 
endif() 

Còn một ít công việc để thực hiện tiền tố chương trình, nhưng khung này sẽ cho phép bạn thực thi lệnh cmake sau khi mọi thứ đã được cài đặt.

+0

Tôi không hiểu nội dung về tiền tố chương trình. Điều đó có liên quan không? Hoặc chỉ là một ví dụ mã ngẫu nhiên về cách bạn có thể chạy tập lệnh sau khi cài đặt? – Joakim

+0

Tôi muốn thêm một chương trình - tiền tố chức năng như autoconf có trong một cây hỗ trợ cả autoconf và xây dựng cmake. Tiền tố chương trình chỉ là ví dụ. Các bước cài đặt bài cmake có thể được sử dụng cho bất cứ điều gì. – rickfoosusa

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