GNU使用日期偏移进行编译

时间:2014-10-26 18:02:30

标签: c++ makefile gnu

我有一台运行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中。

1 个答案:

答案 0 :(得分:1)

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