2015-07-01 37 views
0

問題:我只想運行一個腳本(例如run.sh),它將決定是否應該調用make(並在需要時調用它)以及然後運行可執行文件。只有在main.c被修改時才調用腳本


我的項目只有一個文件,那就是main.c.然而,只是鏈接讓我稍微等一下,當我調試時我不喜歡這些東西,而且我非常希望程序能夠運行。我想這樣的事情到run.sh:

#!/bin/bash 
if[ main.c has changed from the last time make was called] then 
    make > compile.txt 
fi 
./a.out 

使得make只有main.c中被修改時調用。通過修改,可以認爲時間戳發生了變化(即使這可能不是實際的標準)。這是可行的嗎?


如果是這樣,我看到這個answer,這讓我覺得我每次進入if語句調用做,main.c中的拷貝將被創建,或文件的時間戳的身體將被存儲(也許在一個文件中),以便下次腳本運行時,它將恢復該信息並檢查是否條件以查看時間戳是否不同。所以,第二個問題是,怎麼做?

+1

'如果已修改'main.c'(假設下make'只會重新編譯你的程序只包含'main.c')。 「make」運行並不需要很長時間,或者它不應該。那麼,你試圖解決什麼問題?如果你沒有改變文件的內容,爲什麼'main.c'上的修改時間會改變?你有沒有在你的makefile中有一些失敗的規則,這樣即使你沒有改變任何東西,程序也會被鏈接到每一次? (見[''make'每次編譯一些程序,即使它們只是被編譯了])(http://stackoverflow.com/questions/31151069/)) –

+0

@JonathanLeffler是的,它沒有。我只是說,因爲我看到了使用觸摸的答案。我說這是爲了簡單。如果文件被修改,時間戳肯定會有所不同,這就是爲什麼我有這個想法。感謝您的評論。我將編輯。現在好多了? :) – gsamaras

+1

(1)如果您正在調試並更改代碼,則需要重新構建以查看更改後的代碼的效果。這意味着你需要重新鏈接。 (2)如果'main.c'沒有改變,那麼你的程序將不會被重新鏈接,除非你的'makefile'中有一個錯誤,當不需要時強制重新鏈接。如果(2)是你的問題,修復你的'makefile'。如果(1)是您的問題,那麼爲什麼在您準備重新編譯程序之前保存編輯。或者你爲什麼不直接運行'a.out'而不是運行腳本。基本上,你似乎有一個方法論問題;你濫用'make' ... –

回答

3

只需

#!/bin/bash 

if [ a.out -ot main.c ]; then 
    make > compile.txt 
fi 

./a.out 

-ot相當於

但是,此行爲是由使自己預期的更舊。我寧願像

CC = gcc 
CFLAGS = -Wall -W 

main: main.c 
    $(CC) $(CFLAGS) -o [email protected] $^ 

在Makefile中main規則將只運行,如果main.c之後更新的最後make

+0

請注意,儘管Bash和Korn shell在測試中支持'-ot',POSIX不需要這種支持,而POSIX兼容的shell可能無法工作。這不應該是一個問題,因爲腳本啓動'#!/ bin/bash',但是... –

+0

謝謝!但是,我可能不得不更改我的Makefile,因爲我不確定我錯過了什麼,但這是另一個問題。如果你能解釋最後兩個符號,我將不勝感激:'-o $ @ $ ^'。 – gsamaras

+0

'main:main.c'規則基本上與已經存在的(它已經使用'$(CFLAGS)'和'$(CC)')的內建'%:%.c'規則相同,所以規則定義並不是必須的,所以像這樣的單個文件C程序的makefile可以是'CFLAGS'定義(如果需要的話,也可以是'CC',但是在許多系統中'cc'默認是'gcc') 。 –

相關問題