2011-05-11 180 views
10

我需要找出哪些翻译单元需要重新编译以提高编译时间,我如何使用cmake为我的翻译单元获得编译时间?cmake:编译统计

+0

正如我一直认为'cmake'只为本机构建系统(make,nmake等)生成conf文件。所以cmake实际上并没有涉及编译/链接过程。也许你应该在你的本地构建系统中寻找这样的选项。 – beduin 2011-05-11 11:06:37

+0

这是一个相当常见的用例。但是,如果你知道如何为标准的linux制作,那将是最有帮助的。 – 2011-05-11 12:24:07

+2

不幸的是,我不知道有任何制作选项可以实现这一点。我想到的第一个解决方案是修改'Makefiles'来为每个'gcc'命令调用'time'。 – beduin 2011-05-11 13:18:12

回答

8

我希望用'time original-cmd'代替编译器(和/或连接器)。使用简单的'make',我会说:

make CC="time gcc" 

'时间'程序将运行命令并报告所花费的时间。等效机制将与'cmake'一起工作。如果你需要捕获命令和时间,那么你可以编写你自己的类似于时间的命令(一个shell脚本会这样做),以你想要的方式记录你想要的数据。

+0

通常'时间'是内置命令。要使用详细模式,需要键入'make CC =“/ usr/bin/time -v gcc”'命令。 – Orient 2015-12-07 11:49:32

+0

您不能通过编译器以这种方式为CMake生成的make文件传递编译器。通常它不起作用。 – usr1234567 2017-06-29 14:54:33

4

要在以前的答案扩大,这里就是我刚写了一个具体的解决方案 - 这是说,在实践中肯定工程,不仅在理论上,而且大约三分钟已经使用仅由一人,所以它可能有一些不足之处。

#!/bin/bash 
{ time clang "[email protected]"; } 2> >(cat <(echo "clang [email protected]") - >> /tmp/results.txt) 

我把/tmp/time-clang上述两行,然后跑

chmod +x /tmp/time-clang 
cmake .. -DCMAKE_C_COMPILER=/tmp/time-clang 
make 

您可以使用-DCMAKE_CXX_COMPILER=挂钩C++编译器在完全相同的方式。

  • 我没有使用make -j8,因为我不想要的结果,以怪异的方式获得交错。

  • 我不得不在我的脚本上放置一个明确的hashbang #!/bin/bash,因为Ubuntu 12.04上的默认shell(dash,我想?)对这些重定向操作符不满意。

+0

这对我很好,谢谢!然而,我试图(并且挣扎)只从'time'中提取'real'输出,并将它和clang命令*一起打印到* results.txt中? – 2017-06-28 22:13:33

11

以下属性可以用来实时编译器和链接器调用:

,这些属性可以全局设置,每个目录和每个目标。这样你就只能有一部分目标(比如测试)受到这个属性的影响。你也可以为每个目标有不同的“发射器”,这也可能是有用的。

请记住,在使用“时间”并不能直接移植,因为这个实用程序不可由CMake的支持的所有平台。但是,CMake在其command-line tool mode中提供了“时间”功能。例如:

# Set global property (all targets are impacted) 
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CMAKE_COMMAND} -E time") 
# Set property for my_target only 
set_property(TARGET my_target PROPERTY RULE_LAUNCH_COMPILE "${CMAKE_COMMAND} -E time") 

例CMake的输出:

[ 65%] Built target my_target 
[ 67%] Linking C executable my_target 
Elapsed time: 0 s. (time), 0.000672 s. (clock) 

注意,作为CMake的3.4的仅生成文件和忍发电机支持此性质。

还要注意,因为CMake的3.4 cmake -E time的具有内部参数的空间问题。例如:

cmake -E time cmake "-GUnix" "Makefiles" 

我提交patch修复此问题:

cmake -E time cmake "-GUnix Makefiles" 

会被解释。

+0

接受的答案对我来说没有任何作用,但是这个做了。 – fpnick 2017-01-16 20:36:48

+0

这有另一个问题:'$ {CMAKE_COMMAND}'在窗口上有空格,并且不会按建议工作 – Pavel 2017-03-05 21:34:59

+0

@Pavel你可以加引号:'set_property(TARGET my_target PROPERTY RULE_LAUNCH_COMPILE“\”$ {CMAKE_COMMAND} \“-E time “)' – 865719 2017-11-10 17:12:01