您可以设置CMake目标的RULE_LAUNCH_COMPILE属性,让CMake在调用gcc之前调用一个将源文件路径转换为项目相对路径的shell脚本。使用CMake功能configure_file生成一个知道您项目的PROJECT_SOURCE_DIR
和PROJECT_BINARY_DIR
的shell脚本。
在你最CMakeLists.txt
添加以下代码:
configure_file(
"${PROJECT_SOURCE_DIR}/gcc_debug_fix.sh.in"
"${PROJECT_BINARY_DIR}/gcc_debug_fix.sh"
@ONLY)
add_executable (MyExecutable ...)
set_target_properties(MyExecutable PROPERTIES
RULE_LAUNCH_COMPILE "${PROJECT_BINARY_DIR}/gcc_debug_fix.sh")
下面的模板shell脚本gcc_debug_fix.sh.in
需要去CMake的项目的根目录:
#!/bin/sh
PROJECT_BINARY_DIR="@[email protected]"
PROJECT_SOURCE_DIR="@[email protected]"
# shell script invoked with the following arguments
# $(CXX) $(CXX_DEFINES) $(CXX_FLAGS) -o OBJECT_FILE -c SOURCE_FILE
# extract parameters
SOURCE_FILE="${@: -1:1}"
OBJECT_FILE="${@: -3:1}"
COMPILER_AND_FLAGS=${@:1:$#-4}
# make source file path relative to project source dir
SOURCE_FILE_RELATIVE="${SOURCE_FILE:${#PROJECT_SOURCE_DIR} + 1}"
# make object file path absolute
OBJECT_FILE_ABSOLUTE="$PROJECT_BINARY_DIR/$OBJECT_FILE"
cd "$PROJECT_SOURCE_DIR"
# invoke compiler
exec $COMPILER_AND_FLAGS -c "${SOURCE_FILE_RELATIVE}" -o "${OBJECT_FILE_ABSOLUTE}"
shell脚本使用来自变量PROJECT_BINARY_DIR
和PROJECT_SOURCE_DIR
的信息将源文件的路径转换为相对于项目根目录的路径,并将目标文件的路径转换为绝对路径。因为gcc现在通过了一个项目相对路径,所以.debug_str
也应该使用该路径。
以下注意事项适用:
- 一定要设置的
gcc_debug_fix.sh.in
可执行位。
- 对于要工作的脚本
CMAKE_USE_RELATIVE_PATHS
必须再次设置为OFF
。
- 该脚本对命令行上文件路径的位置做出了假设。如果CMake使用不同的规则来调用编译器,这可能不起作用。更强大的解决方案是扫描
-o
和-c
标志的脚本参数。
'./../ src/mod_foo/foo.c'是一个**相对**路径... – 2012-03-07 20:14:47
是的,但不是相对于项目根目录*,尽管(它位于'./ ../ src') – drdaeman 2012-03-07 21:28:23
您遇到CMake问题,而不是gcc。 GCC正好把它作为命令行参数放入'.debug_str'中。 – sirgeorge 2012-03-07 22:16:44