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!!!