2012-04-03 43 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

相关问题