質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

make

make は、ビルド作業を自動化するツールです。さまざまなファイルの最終変更時刻を比較し、従属するファイルよりも「ターゲット」のファイルが古いことがわかったときユーザーが設定していた命令を実行する事が可能です。

makefile

make は、プログラムのビルド作業を自動化するツールです。コンパイル、リンク、インストール等のルールを記述したテキストファイルをmakefileと呼び、このルールに従ってmakeが自動的にビルドを実行する。

Q&A

解決済

1回答

5468閲覧

makefileのコマンドライン変数をshellの変数で渡す場合の動作

twmatu

総合スコア13

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

make

make は、ビルド作業を自動化するツールです。さまざまなファイルの最終変更時刻を比較し、従属するファイルよりも「ターゲット」のファイルが古いことがわかったときユーザーが設定していた命令を実行する事が可能です。

makefile

make は、プログラムのビルド作業を自動化するツールです。コンパイル、リンク、インストール等のルールを記述したテキストファイルをmakefileと呼び、このルールに従ってmakeが自動的にビルドを実行する。

0グッド

1クリップ

投稿2015/10/21 13:09

makefileからmakeを呼びたいと思っています。
その際、子makeには変数を渡しますが、渡す変数は別ファイル(options.txt)に記載されているものを与えます。
make case0 のように、ファイルに書かれたものを shellで受け取って子makeに渡すとうまく認識しないのですが、どのようにしたらよいのでしょうか。
なお、make case1のように $(shell )で一旦makefileの変数で受けて、それを子makeに渡せばうまく渡ります。

makefile

1ARG0 ?= "" 2ARG1 ?= 0 3case0: 4 @args=`cat ./options.txt | perl -ne '$$_ =~ s/\n/ /g; print $$_' `; \ 5 ${MAKE} main "$${args}" 6 7 8_ARGS = $(shell cat ./options.txt | perl -ne '$$_ =~ s/\n/ /g; print $$_') 9case1: 10 ${MAKE} main ${_ARGS} 11 12main: 13 @echo "ARG0 is ${ARG0}" 14 @echo "ARG1 is ${ARG1}" 15
  • リストoptions.txt:
ARG0="opt1=Yes opt2=No" ARG1=10
  • リストmake case0のLOG
# make[1]: Entering directory `/site/tokyo/org-seg-projects-jdcnewport-tokyo-users-matu-safe1/local/study/make01' # ARG0 is opt1=Yes opt2=No ARG1=10 // <-- ARG1までARG0として認識されてしまう # ARG1 is 0
  • リストmake case1のLOG
# /usr/bin/make main ARG0="opt1=Yes opt2=No" ARG1=10 # make[1]: Entering directory `/site/tokyo/org-seg-projects-jdcnewport-tokyo-users-matu-safe1/local/study/make01' # ARG0 is opt1=Yes opt2=No # ARG1 is 10

makeは GNU Make 3.81です
よろしくお願いします

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

まず、直接の原因は、"$${args}"と、引用符で囲んでいるので、makeには1つの引数として渡るからです。
かといって、引用符を取ると、make には、第一引数main、第二引数ARG0="opt1=Yes、第三引数opt2=No"、第四引数ARG1=10が渡って、エラーになります。

シェルの空白の位置づけと、Makefileの空白の位置づけが異なるからですね。

ちょっといまいちですが、

Makefile

1(前略) 2case0: 3 @args=`cat ./options.txt`; eval ${MAKE} main "$${args}" 4(後略)

で、どうでしょうか。
(改行を空白にするのにperl等は不要です。変数代入時点で空白に変わります。)

投稿2015/10/21 14:30

otn

総合スコア84505

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

twmatu

2015/10/29 16:11

返答おそくなりしたが、どうもありがとうございます! 「シェルの空白の位置づけと、Makefileの空白の位置づけが異なる」というくだりで腑に落ちました。 case1のほうは、常に $(shell cat ./options.txt ... が実行されるのが少しひっかかっていたのですが、他の方法と比較した結果、コレで行こうかと思いました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問