2014-10-26 50 views
0

我有一臺運行Linux的主機,GNU make使用日期偏移編譯

我也有一個虛擬機運行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 [email protected] 
# 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

使用源代碼管理來共享文件。 – nos 2014-10-26 18:22:23

+0

修復虛擬機中的時間,使其與主機操作系統相同。 Make只通過比較修改時間戳進行操作,沒有其他替代算法。 – MadScientist 2014-10-26 19:16:53

+0

謝謝,我從未想過在機器上設置正確的日期...... – 2014-10-26 19:37:56

回答

1

您可以構建之前,你的Linux上運行touch,並設置正確日期爲所有的源文件,使用find過濾,改變給定的時間(見-cnewer)後的人。