2012-04-03 41 views
11

cmake的產生類似的安裝規則如下:是否可以將安裝後命令添加到由cmake生成的頂級Makefile中?

# 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 

我想要做的是有cmake_install.cmake後執行一些自定義的命令被調用,所以它看起來是這樣的:

# 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 

我可以使用「add_custom_command(TARGET ... POST_BUILD ...)」來完成我們所寫的內容(需要更新6到10個宏)。然而,有一些第三方的東西被安裝,我真的不希望爲它們添加POST_BUILD自定義命令(目前有19個項目將有更多的項目,並且可能很難確定需要處理的東西在安裝之後而不是在安裝之後)。我認爲如果自定義命令僅用於一個地方(即作爲安裝處理的最後部分),並且我知道他們將執行所有必要的操作,那麼維護起來會容易得多。

是否可以讓cmake將命令添加到頂層Makefile的安裝規則中?

回答

8

您可以使用install命令的SCRIPTCODE變體。如果你把所需的命令的腳本PostInstall.cmake在項目的根目錄下,下面的調用添加到您最CMakeLists.txt

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

install命令添加到cmake_install.cmake腳本命令,因此調用應加在所有其他安裝完成後運行CMakeLists.txt的結尾。

+0

謝謝!我發誓我嘗試過這樣的事情,但沒有奏效。試了一遍,它似乎工作。猜猜我必須有一個錯字(或其他東西),使它無法正常工作。 – joast 2012-04-03 21:33:30

+4

這不適用於我的構建子目錄。在從子目錄中包含所有cmake_install.cmake之前執行最外面的CMakeLists.txt的結尾。 – rickfoosusa 2015-02-24 22:08:53

+0

有點棘手,特別是關於從根指定子目錄安裝路徑和目標,但最終得到它的工作。 – taranaki 2017-06-13 18:33:31

3

要添加安裝後步驟,您需要在頂級CMakeLists.txt中添加一個目錄。您必須擁有一個包含CMakeLists.txt的目錄,以便設置最後在安裝中執行的安裝後步驟。

第一步是添加要由安裝後腳本使用的變量和值。在安裝過程中沒有可用的變量可用,所以你需要的任何東西都必須在這裏設置。

在頂級CMakeLists.txt中,在執行了所有先前的add_subdirectory命令之後,添加如下所示的內容。

# 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() 

現在我們有變量和屬性轉換爲在安裝後可用的變量。

接下來我們需要安裝postinstall目錄中的CMakeLists.txt文件。 Cmake將在構建結束時執行該文件。那時我們安裝了一個SCRIPT,可以在安裝後進行工作。

# 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") 

現在我們將在安裝後在ProgramPrefix.cmake中獲得控制權。 CMake會添加我們之前設置的變量。

# 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() 

實際執行程序前綴還有一點工作要做,但是這個框架可以讓你在安裝好所有東西之後執行cmake命令。

+0

我不明白關於程序前綴的東西。這是相關的嗎?或者只是一個隨機代碼示例,說明如何在安裝後運行腳本? – Joakim 2016-04-02 00:18:56

+0

我想在一個支持autoconf和cmake構建的樹中添加一個像autoconf這樣的程序前綴函數。程序前綴就是例子。 cmake post安裝步驟可以用於任何事情。 – rickfoosusa 2016-04-02 00:25:15

相關問題