2011-04-12 158 views
2

我是cmake的新手,我发现它非常令人沮丧。我试图在构建运行时评估的文件路径中使用通配符,而不是构建生成时使用通配符。cmake中的编译时通配符安装目标

我创建了一个使用SWIG为某些C++代码生成Java包装的构建。我可以编写命令来生成本地代码,编译它并生成工作共享库,甚至可以使用INSTALL命令正确安装该共享库。我想不出如何做的是编写一个INSTALL命令,它可以将SWIG生成的所有* .java文件复制到同一个安装位置。

似乎cmake的FILE GLOB命令在执行cmake时执行globbing,而不是在构建实际运行时执行。当然,执行cmake时,SWIG尚未运行,并且Java文件不存在。

有没有办法做我想要的?我是否在做错事情?看起来这是Makefiles需要做的基本部分,我很惊讶没有找到一个简单的方法来做到这一点。

回答

11

假设Java包装都位于当前的二进制目录,你可以使用下面的install命令后的Java文件复制安装:

install(
    CODE "file(GLOB _GeneratedJavaSources \"${CMAKE_CURRENT_BINARY_DIR}/*.java\")" 
    CODE "file(INSTALL \${_GeneratedJavaSources} DESTINATION \"$ENV{HOME}\")" 
) 

install命令的CODE形式用于在运行安装目标时执行两个CMake命令。第一个收集所有生成的Java文件在辅助变量中。第二个使用file命令的INSTALL形式来复制文件。

+0

这有效!非常感谢! – 2011-04-13 13:27:01

+1

**感谢**这真的工程.. – user1036908 2014-07-24 12:54:33

+0

我已经使用这个麻烦:如果可执行权限没有复制过来。以这种方式安装程序会使程序无法运行。任何方式来安装,同时保留权限? – Gauthier 2015-06-26 11:57:22

1

您可以使用安装(SCRIPT swigInstaller.cmake)或安装(DIRECTORY)这两个在安装时支持做文件globing。你可以阅读更多关于安装命令:

http://cmake.org/cmake/help/cmake-2-8-docs.html#command:install

+3

男孩,这是如此接近。 “脚本”似乎没有帮助,因为显然,INSTALL不能包含在这样的脚本中;但是INSTALL(DIRECTORY)非常接近。唯一的问题是它坚持从源目录拷贝所有的目录树,尽管它们都是空的。任何修剪它们的方法,或者使INSTALL(DIRECTORY)只考虑直接在源目录中的文件? – 2011-04-12 20:53:27