linuxBean14.04(31)GNU Make Debugger, Remake:その2

ラベル: , ,

前の関連記事:linuxBean14.04(30)GNU Make Debugger, Remake:その1


今回はremakeの対話モードを使ってデバッグします。前回と同様LibreOfficeDev5.0SDKのDevelopersGuide FirstStepsのMakefileをsetsdkenvを実行したTerminalで実行します。Makefileの文法についてはLibreOffice(20)makeについてちょっとお勉強 その1LibreOffice(21)makeについてちょっとお勉強 その2で学習しました。

step/sコマンドでルールのコマンドに入り、next/nコマンドで次のルールにいく


Makefileがあるフォルダでremake --debugger とするとremakeを対話モードで起動できます。

pq@pq-VirtualBox:/opt/libreofficedev5.0/sdk/examples/DevelopersGuide/FirstSteps$ remake --debugger
GNU Make 3.82+dbg0.9
Built for i686-pc-linux-gnu
Copyright (C) 2010  Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Reading makefiles...
Updating makefiles....
Updating goal targets....
  /opt/libreofficedev5.0/sdk/examples/DevelopersGuide/FirstSteps/Makefile:60 File `ALL' does not exist.
-> (/opt/libreofficedev5.0/sdk/examples/DevelopersGuide/FirstSteps/Makefile:86)
FirstStepsExamples: /home/pq/libreoffice5.0_sdk/LINUXexample.out/class/FirstStepsExamples/FirstUnoContact.jar /home/pq/libreoffice5.0_sdk/LINUXexample.out/class/FirstStepsExamples/FirstLoadComponent.jar /home/pq/libreoffice5.0_sdk/LINUXexample.out/class/FirstStepsExamples/HelloTextTableShape.jar
remake<0>

remakeはmakeのパッチなのでmakeのロゴが表示されています。

/opt/libreofficedev5.0/sdk/examples/DevelopersGuide/FirstStepsにあるMakefileの60行目にあるルールのターゲットALLが存在しないのを確認して、ALLの依存関係にある86行目のルールにいっったところでプロンプトを出して止まっています。

remakeの作者はbashdbと同じ人でコマンドもbashdbとちょっと似ています。(linuxBean14.04(27)Geanyとシェルスクリプトのデバッグ参照。)

step エイリアス s

ステップイン。

next エイリアス n

ステップオーバー。

continue エイリアス c

リジューム。

エイリアスはCommand Syntaxを読むと他のコマンドと区別がつく限り短くしてもよいらしいです。

コマンドを入力せずにEnterキーを押すと前回実行されたstepかnextが実行されます。

ステップインsはルールのコマンドに入っていき、ステップオーバーnは次のルールにいきました。

helpコマンドでコマンド一覧が表示されます。
  Command                  Short Name  Aliases
  ----------------------   ----------  ---------
  break [TARGET|LINENUM] [all|run|prereq|end]* (b)  L
  cd DIR                          (C)
  comment TEXT                    (#)
  continue [TARGET [all|run|prereq|end]*] (c)
  delete breakpoint numbers..     (d)
  down [AMOUNT]                   (D)
  edit                            (e)
  eval STRING                     (E)
  expand STRING                   (x)
  finish [AMOUNT]                 (F)
  frame N                         (f)
  help [COMMAND]                  (h)  ?, ??
  info [SUBCOMMAND]               (i)
  list [TARGET|LINE-NUMBER]       (l)
  next [AMOUNT]                   (n)
  print {VARIABLE [attrs...]}     (p)
  pwd                             (P)
  quit [exit-status]              (q)  exit, return
  run [ARGS]                      (R)  restart
  set OPTION {on|off|toggle}
  set variable VARIABLE VALUE     (=)
  setq VARIABLE VALUE             (")
  shell STRING                    (!)  !!
  show [SUBCOMMAND]               (S)
  source FILENAME                 (<)
  skip                            (k)
  step [AMOUNT]                   (s)
  target [TARGET-NAME] [info1 [info2...]] (t)
  up [AMOUNT]                     (u)
  where                           (T)  backtrace, bt
  write [TARGET [FILENAME]]       (w)
「Short Name」と「Aliases」の違いがよくわかりませんが、とりあえず丸括弧内の文字でそのコマンドが動くようです。

丸括弧の文字の後ろにあるのは、例えば「??」ではhelpが実行されましたが「?」はそんなコマンドがない、といわれて動きませんでした。

とりあえずnextを実行していくと次から次へとルールが実行されていくことがわかります。

remake<2> n
      /opt/libreofficedev5.0/sdk/examples/DevelopersGuide/FirstSteps/Makefile:82 File `/home/pq/libreoffice5.0_sdk/LINUXexample.out/class/FirstStepsExamples/FirstUnoContact.jar' does not exist.
-> (/opt/libreofficedev5.0/sdk/examples/DevelopersGuide/FirstSteps/??:0)
/home/pq/libreoffice5.0_sdk/LINUXexample.out/class/FirstStepsExamples/FirstUnoContact.mf: 

依存関係の記載がない69行目のルールではMakefile名と行番号が「??:0」となって、正しく表示されませんでした。

remake<4> s
        Must remake target `/home/pq/libreoffice5.0_sdk/LINUXexample.out/class/FirstStepsExamples/FirstUnoContact.mf'.
Invoking recipe from Makefile:70 to update target `/home/pq/libreoffice5.0_sdk/LINUXexample.out/class/FirstStepsExamples/FirstUnoContact.mf'.
##>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
mkdir -p /home/pq/libreoffice5.0_sdk/LINUXexample.out/class/FirstStepsExamples
##<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
++ (/opt/libreofficedev5.0/sdk/examples/DevelopersGuide/FirstSteps/Makefile:69)
/home/pq/libreoffice5.0_sdk/LINUXexample.out/class/FirstStepsExamples/FirstUnoContact.mf

ルールのコマンドの表示形式はremake -n のときと同様です。
##>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
コマンド
##<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
コマンド出力
++()の括弧内はコマンドを含むルールの場所を表しています。

where/Tコマンドで現在いるルールの相対位置を知る


whereコマンドを実行すると現在いるルールから順番に最初のルールまでを表示してくれます。

remake<6> where
=>#0  /home/pq/libreoffice5.0_sdk/LINUXexample.out/class/FirstStepsExamples/FirstUnoContact.class at /opt/libreofficedev5.0/sdk/examples/DevelopersGuide/FirstSteps/Makefile:65
  #1  /home/pq/libreoffice5.0_sdk/LINUXexample.out/class/FirstStepsExamples/FirstUnoContact.jar at /opt/libreofficedev5.0/sdk/examples/DevelopersGuide/FirstSteps/Makefile:82
  #2  FirstStepsExamples at /opt/libreofficedev5.0/sdk/examples/DevelopersGuide/FirstSteps/Makefile:86
  #3  ALL at /opt/libreofficedev5.0/sdk/examples/DevelopersGuide/FirstSteps/Makefile:60

それぞれのターゲットとMakefileの行番号が表示されます。

現在は/opt/libreofficedev5.0/sdk/examples/DevelopersGuide/FirstSteps/Makefileの65行目にある/home/pq/libreoffice5.0_sdk/LINUXexample.out/class/FirstStepsExamples/FirstUnoContact.classをターゲットとするルールを実行している場所にいることがわかります。

#0のルールのターゲットが依存関係になっているルールが#1で、そのルールのターゲットが依存関係になっているルールが#2で、そのルールのターゲットが依存関係になっているルールが#3のALLになっていることがわかります。

whereはinfo frameとしても同じ結果が表示されます。

target/tコマンドで自動変数の内容とコマンドを知る

$(OUT_APP_CLASS)/%.class : %.java
 -$(MKDIR) $(subst /,$(PS),$(@D))
 $(SDK_JAVAC) $(JAVAC_FLAGS) -classpath "$(SDK_CLASSPATH)" -d $(OUT_APP_CLASS) $<
現在この65行目のルールにいるところでtargetコマンドを実行します。

remake<7> target

/home/pq/libreoffice5.0_sdk/LINUXexample.out/class/FirstStepsExamples/FirstUnoContact.class: FirstUnoContact.java
#  Implicit rule search has been done.
#  Implicit/static pattern stem: `FirstUnoContact'
#  File is an intermediate prerequisite.
#  File does not exist.
#  File has not been updated.
#  Commands not yet started.
# automatic
# @ := /home/pq/libreoffice5.0_sdk/LINUXexample.out/class/FirstStepsExamples/FirstUnoContact.class
# automatic
# % :=
# automatic
# * := FirstUnoContact
# automatic
# + := FirstUnoContact.java
# automatic
# | :=
# automatic
# < := FirstUnoContact.java
# automatic
# ^ := FirstUnoContact.java
# automatic
# ? :=
#  commands to execute (from `Makefile', line 66):
-$(MKDIR) $(subst /,$(PS),$(@D))
$(SDK_JAVAC) $(JAVAC_FLAGS) -classpath "$(SDK_CLASSPATH)" -d $(OUT_APP_CLASS) $<

最初に表示されているのはターゲットと依存関係です。
$(OUT_APP_CLASS)/%.class : %.java
これの$(OUT_APP_CLASS)/%.classが/home/pq/libreoffice5.0_sdk/LINUXexample.out/class/FirstStepsExamples/FirstUnoContact.class、
%.javaがFirstUnoContact.javaであることがわかります。

#  Implicit/static pattern stem: `FirstUnoContact'

これはルールの最初の行にある%がFirstUnoContactであることをいっています。

あとは自動変数「@」,「%」,「+」,「|」,「<」,「^」,「?」それぞれについて表示されています。(「|」も自動変数?)

最後のこのルールのコマンドが表示されています。

変数の展開はなく単にコマンドが転記されているだけです。

print/pコマンドとexpand/xコマンドで変数を展開する


print 変数名、で変数を展開できます。

printで展開した変数の中にさらに変数があり、それもすべて展開したいときはexpandコマンドを使います。

expandのエイリアスはxなので、x 変数名、で展開できます。(printはpで可)

先ほどのtagetコマンドを実行したルールのコマンドにでてくる変数を展開してみます。

#  commands to execute (from `Makefile', line 66):
-$(MKDIR) $(subst /,$(PS),$(@D))
$(SDK_JAVAC) $(JAVAC_FLAGS) -classpath "$(SDK_CLASSPATH)" -d $(OUT_APP_CLASS) $<

remake<8> p MKDIR
../../../settings/settings.mk:281 (origin: makefile) MKDIR = mkdir -p
remake<9> p PS
../../../settings/settings.mk:275 (origin: makefile) PS = /
remake<10> p SDK_JAVAC
../../../settings/std.mk:74 (origin: makefile) SDK_JAVAC = "$(OO_SDK_JAVA_HOME)/$(JAVABIN)/javac"
remake<11> p JAVAC_FLAGS
../../../settings/settings.mk:35 (origin: makefile) JAVAC_FLAGS =
remake<12> p SDK_CLASSPATH
Makefile:54 (origin: makefile) SDK_CLASSPATH = $(subst $(EMPTYSTRING) $(PATH_SEPARATOR),$(PATH_SEPARATOR),$(CLASSPATH) $(PATH_SEPARATOR)$(OUT_APP_CLASS))
remake<13> x SDK_CLASSPATH
Makefile:54 (origin: makefile) SDK_CLASSPATH := /opt/libreofficedev5.0/sdk/../program/classes/juh.jar:/opt/libreofficedev5.0/sdk/../program/classes/jurt.jar:/opt/libreofficedev5.0/sdk/../program/classes/ridl.jar:/opt/libreofficedev5.0/sdk/../program/classes/unoloader.jar:/opt/libreofficedev5.0/sdk/../program/classes/unoil.jar::/home/pq/libreoffice5.0_sdk/LINUXexample.out/class/FirstStepsExamples
remake<14> p OUT_APP_CLASS
Makefile:45 (origin: makefile) OUT_APP_CLASS = $(OUT_CLASS)/$(EXAMPLE_NAME)
remake<15> x OUT_APP_CLASS
Makefile:45 (origin: makefile) OUT_APP_CLASS := /home/pq/libreoffice5.0_sdk/LINUXexample.out/class/FirstStepsExamples

pで展開しつくしていない変数はxで展開しましたが、いつも展開した値を知りたければpを使わずxだけ使えばよいと思います。

ちなみに、自動変数もpやxで展開できましたが、「@D」などのように修飾された変数の展開は無理でした。

write/wコマンドで変数を展開してルールのコマンドを書き出す


remake<16> write
File "/tmp/FirstUnoContact.class.sh" written.

writeコマンドでルールのコマンド部分の変数がすべて展開してシェルスクリプトファイルに書き出されます。
#!/bin/sh
#/opt/libreofficedev5.0/sdk/examples/DevelopersGuide/FirstSteps/Makefile:65
#cd /opt/libreofficedev5.0/sdk/examples/DevelopersGuide/FirstSteps
mkdir -p /home/pq/libreoffice5.0_sdk/LINUXexample.out/class/FirstStepsExamples
"/usr/bin/javac"  -classpath "/opt/libreofficedev5.0/sdk/../program/classes/juh.jar:/opt/libreofficedev5.0/sdk/../program/classes/jurt.jar:/opt/libreofficedev5.0/sdk/../program/classes/ridl.jar:/opt/libreofficedev5.0/sdk/../program/classes/unoloader.jar:/opt/libreofficedev5.0/sdk/../program/classes/unoil.jar::/home/pq/libreoffice5.0_sdk/LINUXexample.out/class/FirstStepsExamples" -d /home/pq/libreoffice5.0_sdk/LINUXexample.out/class/FirstStepsExamples FirstUnoContact.java
/tmp/FirstUnoContact.class.shの内容です。

remakeはいろいろ便利に使えそうですね。

参考にしたサイト


3 gnu Remake Debugger Command Reference
remakeのコマンドリファレンス。

GNU make 日本語訳(Coop編) - 目次
makeのマニュアル。

次の関連記事:linuxBean14.04(32)GNU Make Debugger, Remake:その3

PR

0 件のコメント:

コメントを投稿