OMake 不思議時空
OMake で不思議な事のメモ。役に立つ人には役に立つだろう。
空文字列のリテラルが無い?
- 普通のクォート "" や '' は評価されても消えない
- 特殊クォート $"..." では " は消えるが、$"" と書くことは出来ない。 $""..."" と解釈されるため
- 空文字列の入った変数を定義してやればおk
- 実際、EMPTY という変数には空文字列が入っている
println(hello) println("hello") # The quotation symbols are included in the result string. println('hello') println($"hello") println($"""hello""") # How to write the empty string literal in OMake ? println("") # println($"") # FAIL: OMake considers $""something"" # println() # FAIL: OMake considers there is no argument X= println($(X)) # Actually $(EMPTY) is pre-defined println($(EMPTY))
ゼロ引数の関数は定義しないほうが良い
これは全く意味がわからない。多分バグだと思う
- F() は最後が omake で実行される echo
- omake F は問題なし
- G() は unix コマンドの echo
- $(G) でも G() でも変なエラーになる
- H() は G() と同じだが、最後、return で返す
- $(H) はおk
- H() はなぜか二回実行される!! sleep で二回寝ている
- I(x) は H() と同じだが、ダミー引数を持っている
- I(x), $(I x) どちらもおk
- J(x) は最後の return が無い。G() にダミー引数をつけたもの
- J(x), $(J x) どちらもおk なんでじゃー!
結論: OMake の関数は引数を一つでもつけておくほうがよさそう。
# function calls in build rules F()= println(F is called) echo blah blah # echo is not /bin/echo but omake's one .PHONY: F F: $(F) G()= println(G is called) /bin/echo blah blah # the real unix command # No return : returns the last command result, but what is it ? .PHONY: G G1: $(G) # Error. It tries to execute the result of G() as a command .PHONY: G2 G2: G() # Error, saying "Non digestable value" .PHONY: G3 G3: DUMMY=$(G) # Error, saying "Non digestable value" H()= println(H is called) sleep 1 /bin/echo blah blah # the real unix command return # returns nothing! .PHONY: H1 H1: $(H) # Ok, since $(H) returns nothing now .PHONY: H2 H2: H() # Executed TWICE !?!?! I(x)= println(I is called) sleep 1 /bin/echo blah blah # the real unix command return # returns nothing! .PHONY: I1 I1: $(I hoo) .PHONY: I2 I2: I(hoo) # Executed only once !!!! J(x)= println(J is called) sleep 1 /bin/echo blah blah # the real unix command .PHONY: J1 J1: $(J hoo) .PHONY: J2 J2: J(hoo) # Executed only once, and no "Non digestable value" error!!!