如何为ExternalProject_Add的CONFIGURE_COMMAND设置工作目录?
我之前也碰到过一模一样的坑!Automake的configure脚本依赖源码目录里的相对路径资源,但ExternalProject_Add默认会在构建目录(也就是CMAKE_CURRENT_BINARY_DIR下的子目录)里运行configure,自然找不到源码目录里的文件。给你几个靠谱的解决办法:
方法1:指定configure的工作目录为源码目录
ExternalProject_Add允许你通过CONFIGURE_COMMAND手动指定configure的执行命令,同时用WORKING_DIRECTORY参数把工作目录切换到源码目录。比如你的zlib例子可以改成这样:
ExternalProject_Add(zlib SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR} CONFIGURE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/configure WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} # 其他必要参数比如BUILD_COMMAND、INSTALL_COMMAND等 )
这样configure就会在源码目录里运行,和你手动执行./configure的环境完全一致,相对路径就能正常解析了。
方法2:给configure传递绝对路径参数
如果不想改变工作目录,你可以修改configure的调用参数,把依赖的资源文件路径改成绝对路径。比如如果configure脚本里用到了--with-resource=./res/file.txt,你可以改成:
ExternalProject_Add(zlib SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR} CONFIGURE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/configure --with-resource=${CMAKE_CURRENT_SOURCE_DIR}/res/file.txt # 其他参数 )
这种方法适合只需要修改少数路径参数的情况,灵活性比较高。
方法3:修改Automake项目的configure脚本(如果有权限的话)
如果能修改目标Automake项目的configure.ac或者configure脚本,可以把里面的相对路径改成基于srcdir变量的路径——Automake生成的configure脚本里会自动设置srcdir变量指向源码目录的绝对路径。比如原来的./res/file.txt可以改成${srcdir}/res/file.txt,这样不管在哪个目录运行configure,都能正确找到资源文件。
这三种方法里,我个人最常用第一种,简单直接,能最大程度保留原项目的构建逻辑,不容易出其他问题。
内容的提问来源于stack exchange,提问作者the_storyteller

