2016-07-31 28 views
0

我有這個目標。它的目的是依靠輸出目錄以及源代碼。我用this用於截斷的文件名和離開目錄及其根據目錄制定目標的變量

build/%.o: src/%.cpp build/${%%/*}/ 
     $(CC) $(CFLAGS) -o [email protected] $^ 

然後創建目錄目標:

%/: 
     mkdir -p [email protected] 

的問題是,${%%/*}沒有被取代,因此僅結束了使目錄build//而不是build/folder/folder/

+0

是不是'$ {varname %% glob}'語法是shell的東西,而不是GNU make的東西?如果是這樣,它不能在模式規則中工作。 – Jens

+0

@Jens這是,我需要找到一種方法使其工作。 –

回答

2
.SECONDEXPANSION: 

build/%.o: src/%.c | $$(dir [email protected])/.dirstamp 
    echo [email protected] 

%/.dirstamp: 
    mkdir -p $(@D) 
    touch [email protected] 

應該這樣做。

請注意:

  • 使用|;唯一存在的問題,目錄郵票不是是否使用.dirstamp
  • 更可靠

你可能要標記的.dirstamp.SECONDARY。不幸的是,gnumake不支持通配符,所以你必須枚舉它們全部,或者將每個目標都視爲.SECONDARY

+0

你真的不需要'.dirstamp'。只需使用'/ .'就足夠了('$$(dir $$ @)/。'和'%/。') – MadScientist

+0

當'.SECONDARY'沒有被使用時,你需要它。否則,make可以嘗試在目錄上失敗的'rm build/dir'。 – ensc

+0

是的。在makefile的任何地方提到目錄作爲目標都可以解決這個問題。例如,一個新的假冒規則,如'makedirs:somedir /。另一個/等等。 – MadScientist