gpt4 book ai didi

c++ - GNU make 使用日期偏移进行编译

转载 作者:行者123 更新时间:2023-11-28 06:37:20 25 4
gpt4 key购买 nike

我有一台运行 Linux 且当前时间为 Linux 的主机;

我还有一台运行 Windows 7 的虚拟机,时间不同;偏移量是过去的,所以当我生成源代码时,文件的日期比实际日期早。

我正在主机上使用 GNU make 构建源代码。

当我第一次构建时,构建没有任何问题;当我修改虚拟机中的某些文件时,它们的日期将比可执行文件的日期早,因此运行“make”不会捕获这些更改,也不会再次编译修改后的源文件。

有办法解决我的问题吗?

(也许在编译结束时运行脚本以在可执行文件中设置相同的偏移量或告诉 make 保留源的哈希值?)

编辑:作为临时解决方案,我使用由 Makefile 调用的外部 BASH 脚本:

#!/bin/bash

# Makefile: @./Compile.sh "$(CC)" "$(SWITCHES)" "$(OBJECT)" "$(SOURCEFILE)"
# $1 $2 $3 $4

# TODO:
# P1 This approach does not consider .h files changing.
# "g++ -dD -fpreprocessed -E $SOURCEFILE" and whitespace/newline removal before comparison.
# diff -uwB $(g++ -dD -fpreprocessed -E $SOURCEFILE) $(g++ -dD -fpreprocessed -E $SOURCEFILE.previous)
# Checksum on all output object not to link again.

SOURCEFILE="$4"

CHECKSUM=$(cksum < "$SOURCEFILE")

CHECKSUMDIFFERENT=true
echo $@
# If an hash is present already, we compare them.
if [ -f "${SOURCEFILE}.checksum" ]; then
OLDCHECKSUM=$(<"${SOURCEFILE}.checksum")

# If the old hash is the same as the new one, the output is up-to-date.
if [ "$OLDCHECKSUM" == "$CHECKSUM" ]; then
CHECKSUMDIFFERENT=false

fi

fi

if [ $CHECKSUMDIFFERENT == true ]; then
echo "Comparison for \"$SOURCEFILE\" failed, (re)compiling."

$1 $2 -o "$3" "$SOURCEFILE"

# Saving the new hash if the compilation has success.
if [ $? -eq 0 ]; then
echo -n "$CHECKSUM" > "$SOURCEFILE.checksum"

fi

fi

我也找到了这个 http://blog.jgc.org/2006/04/rebuilding-when-hash-has-changed-not.html但不知道如何将它应用到我的 Makefile。

最佳答案

您可以在构建之前在您的 Linux 上运行 touch,并为所有源文件设置正确日期,使用find 过滤那些在给定时间后改变的(参见 -cnewer)。

关于c++ - GNU make 使用日期偏移进行编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26576176/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com