作者 主題: 如何讓 MAKEFILE 在一個 target 裡依條件決定後續動作  (閱讀 4809 次)

0 會員 與 1 訪客 正在閱讀本文。

喵喵咩咩

  • 可愛的小學生
  • *
  • 文章數: 13
    • 檢視個人資料
大家好, 我嘗試做出一個 MAKEFILE, 輸入
    $make
會印出
    Switch is off: off
而輸入
    $make on
則是印出
    Switch is on: on

寫了兩種方法都得到非預期的結果, 請問觀念哪邊出了問題, 麻煩指點一下

方法一:

SWITCH = false
TRUE = true

all: print

print:
ifneq ($(SWITCH), $(TRUE))
   @echo "Switch is off : $(SWITCH)\n"
else
   @echo "Switch is on : $(SWITCH)\n"
endif

switch_on:
SWITCH := $(TRUE)

on: switch_on print


執行結果:

$make
Switch is off: true
$make on
Switch is off: true


方法二:

SWITCH = false
TRUE = true

all: print

print:
ifneq ($(SWITCH), $(TRUE))
   @echo "Switch is off : $(SWITCH)\n"
else
   @echo "Switch is on : $(SWITCH)\n"
endif

switch_on: SWITCH := $(TRUE)
switch_on: print


on: switch_on


執行結果:

$make
Switch is off: false
$make on
Switch is off: true


發現那個 if 判斷如同虛設, 難道要用暴力法嗎?

elleryq

  • 區域板主
  • 鑽研的研究生
  • *****
  • 文章數: 908
  • 性別: 男
    • 檢視個人資料
    • Thinking more...
Makefile裡的變數,跟 target 下執行的變數是不一樣的~

所以我覺得你應該這樣寫,

代碼: [選擇]
TOPDIR:=$(shell pwd)
CONFIG:=$(TOPDIR)/.config

all: print

print:
@if [ -e $(CONFIG) ]; then source $(CONFIG); fi; echo "$$SWITCH"

switch_on:
@echo "SWITCH=true" > $(CONFIG)

switch_off:
@echo "SWITCH=false" > $(CONFIG)

on: switch_on print

off: switch_off print
Plan your work, then work your plan.
我的首頁:http://blog.elleryq.idv.tw
351899by http://counter.li.org

喵喵咩咩

  • 可愛的小學生
  • *
  • 文章數: 13
    • 檢視個人資料
哇終於有人回了, 真是感謝, 我幾乎忘了這篇了說
所以是要用不同的檔案來將變數的 scope 切開囉?

elleryq

  • 區域板主
  • 鑽研的研究生
  • *****
  • 文章數: 908
  • 性別: 男
    • 檢視個人資料
    • Thinking more...
我回很久了說....

引用
所以是要用不同的檔案來將變數的 scope 切開囉?
我是這樣解啦...
Plan your work, then work your plan.
我的首頁:http://blog.elleryq.idv.tw
351899by http://counter.li.org