老親介護に悩む30~60代の方へ
老親介護ねっと[老人ホーム編]
トップ 老人ホームの選び方 介護関連ニュース 新規オープンホーム情報 老人ホーム取材レポート お問い合わせ リンク集 Q&A

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

拡張子が一意でないときの makeコマンドの使い方

XMLファイルをmsxsl.exeコマンドを使用して変換する操作を、自動化したいと考えています
更新したものだけを対象とするために、makeコマンドを使おうと Makefile を書いていますが、てこずっています。

目的として、XML1.xml、XML2.xml、XML3.xmlを、HTML化するスタイルシートHTML.xslがあり、

msxsl XML1.xml HTML.xsl -o XML1.html

として変換します。
また、3つのXMLファイルを結合したKetsugouXML.xml、そこからある種の集計XMLファイル化するスタイルシートmatome.xslがあり、

msxsl KetsugouXML.xml matome.xsl -o matome.xml

として変換します。

これらの自動化のために以下のようなMakefileを書きました。

XML = XML1.xml XML2.xml XML3.xml

MATOME_XML = matome.xml
HTML = $(XML:%.xml=%.html)
HTML_ALL = $(XML:%.xml=%.html) $(MATOME_XML)

all: $(HTML_ALL)

$(HTML) : $(XML)
msxsl $< HTML.xsl -o $@
#↑1個めのファイル名しか得られない
#msxsl $(@:%.html=%.xml) HTML.xsl -o $@
#↑更新したXMLファイル以外も全て実行されてしまう

$(MATOME_XML) : $(XML)
msxsl KetsugouXML.xml matome.xsl -o $@

問題は、上のコメント行に書いた通りですが、

msxsl $< HTML.xsl -o $@

と書いた場合、実行結果が、

msxsl XML1.xml HTML.xsl -o XML1.html
msxsl XML1.xml HTML.xsl -o XML2.html
msxsl XML1.xml HTML.xsl -o XML3.html

となり、入力ファイル名が変わりません。
次に、

msxsl $(@:%.html=%.xml) HTML.xsl -o $@

とした場合、

msxsl XML1.xml HTML.xsl -o XML1.html
msxsl XML2.xml HTML.xsl -o XML2.html
msxsl XML3.xml HTML.xsl -o XML3.html

と期待の結果かと思ったのですが、
ソース1個を更新しただけでも全ての変換がかかってしまいます。
(ちなみに、集計XMLファイルの生成は正常にできています)

このような場合、どのように Makefile を記述すべきでしょうか?

補足:
自分の経験としては、C言語やTeXで make を使ったことはありましたが、
この場合C言語と異なり、一意に .c → .o とはならないこと、
同じソース(.xml)からでもスタイルシートを変えることで、異なる変換結果ファイル(.htmlだったり、.xmlだったり)になるところの記述方法の不理解が原因であろうと
思っています。

環境は Windows10、GNU Make4.1 を使っています。

投稿日時 - 2018-02-26 20:48:31

QNo.9433009

困ってます

質問者が選んだベストアンサー

>できれば複数の変換パターンがある場合についても
>おしえていただけませんでしょうか?

補足に書かれているように.xmlから.htmlへの変換パターンが複数ある場合ですよね?
元になるファイルのあるディレクトリや出力先ディレクトリが異なるなど区別できるものがあればできなくはないですが、
そうでないなら静的型ルールやサフィックスルールで行うのは無理です
(あなただってXML1.xml,XML2.xml,XML3.xmlにはHTML.xslを使って、XML11.xml,XML12.xml,XML13.xmlにはHTML2.xslを使って変換するという事を知らなかったらできないですよね?)。

ですので、やるとするなら
・上にもあげているようにルール毎にファイルを置く場所を変えるなど区別できる何かを用意する
・静的型ルールなどを用いずに変換するルールを全て書く(ただしユーザー定義関数を用いることで簡略化することはできる)
あたりになります。

投稿日時 - 2018-02-27 21:03:44

お礼

早速のご回答、ありがとうございました。
そのままでは無理なのですね。
「ルールをすべて書く」方法(及びその簡略化)について
試してみることにします。

投稿日時 - 2018-02-27 21:25:31

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

all: XML1.html XML2.html XML3.html matome.xml

%.html: %.xml
<tab>msxsl $< HTML.xsl -o $@

XML1.html: XML1.xml
XML2.html: XML2.xml
XML3.html: XML3.xml

matome.xml: KetsugouXML.xml
<tab>msxsl $< matome.xsl -o $@

でできませんか?(変数使うようにするのはご自分でどうぞ)

投稿日時 - 2018-02-26 21:07:23

補足

これに加え、別のスタイルシートで変換するグループXML11.xml、XML12.xml、XML13.xmlがある場合はどうすればよいでしょうか?

msxsl XML11.xml HTML2.xsl -o XML11.html

投稿日時 - 2018-02-27 18:27:39

お礼

ありがとうございます。できました!
できれば複数の変換パターンがある場合についても
おしえていただけませんでしょうか?

投稿日時 - 2018-02-27 18:27:31