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

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

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

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

Q&A

解決済

3回答

1598閲覧

Makefileでファイルの各行を変数に連結していきたい

退会済みユーザー

退会済みユーザー

総合スコア0

makefile

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

0グッド

0クリップ

投稿2019/05/14 04:54

編集2019/05/15 00:46

前提環境

  • os: Ubuntu(16.04.3 LTS (Xenial Xerus))
  • make: GNU Make 4.1

やりたいこと

あるファイルの各行の内容を、他のコマンドに渡したい。
処理はmakeコマンドにより実施します。
そのために、

  1. 結合結果用の変数(attr)を用意
  2. whileループでファイルの内容を一行ずつ取得
  3. ループ内でattrに値を結合して格納
  4. 当該変数の内容を別のコマンドに渡す

をしようとしましたが、3.でうまくいきませんでした。

どうすればよいかご教示いただければ幸いです。

やりたいことの例

file

1# コメントは除外したい 2a 3b 4c

上記のファイル内容をmakeの中で読み込んで別のコマンド引数として実行したい。
makeの中で例えばcat a b cみたいにしたいです。

やったこと

普通にattr=で再代入しようと思いましたが、これは/bin/sh/ではできないようです。

makefile

1test: 2 attr=; 3 while read line; do \ 4 attr=$${attr}$${line}; \ 5 done < ファイル名; 6 echo ${attr} 7# 出力結果は空行

次にattr:=で実施しようと思いました。
/bin/sh/ではevalを使うとのことで実施したのですが、Syntax error: ";" unexpectedが出て失敗しました。
そこで;を外して以下のように実施しましたが、うまくいきませんでした。

makefile

1test: 2 attr=; 3 while read line; do \ 4 tmp=$${attr}; \ 5 $(eval attr=$${tmp}$${line}) \ 6 done < ファイル名; 7 echo ${attr} 8# 出力結果は空行

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

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

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

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

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

guest

回答3

0

最終的には、for文で動的に変数を変更するのではなく、シェルの実行結果を取る形で解決しました。
ので、質問タイトルと解決が若干ズレますがご容赦ください。>後から見る人
目的は、「ファイルの内容を結合してmakeの中のコマンド引数に渡す」でした。

Makefile

1attr:=`grep -v "\#" ファイル名 | xargs` 2test: 3 echo ${attr}

投稿2019/05/15 01:51

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ベストアンサー

お求めの方法はわかりませんが、示された makefile は make の変数と shell 変数とをごっちゃにしています。

makefile

1test: 2 attr=; #(1) 3 while read line; do \ 4 tmp=$${attr}; \ #(2) 5 $(eval attr=$${tmp}$${line}) \ #(3) 6 done < ファイル名; 7 echo ${attr} #(4)

(1) シェル変数。sh はこの行を実行して終了する(ので変数は消える)。
(2)-(3) シェル変数。sh は同様に連結された4行をまとめて実行して終了する。
(4) make 変数。ここにしか現れていないので何も入っていない。

何をしたいのかよくわからないのですが、ファイルの内容まるごとが必要なら、ファイル名を持ち回った方がよくないですか?

makefile

1SOMEFILE= somefile 2 3test: 4 the_4th_command `cat ${SOMEFILE}`

追記

そもそもですが、make は GNU make でよかったでしょうか? 違ったら教えてください。
GNU make のマニュアルを参考に試したら、以下でそれっぽいことができました。

makefile

1ATTR := `cat somefile` 2 3test: 4 echo ${ATTR}

投稿2019/05/14 08:44

編集2019/05/14 09:20
cugel

総合スコア220

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

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

退会済みユーザー

退会済みユーザー

2019/05/15 00:40

回答ありがとうございます。 makeはGNU Make 4.1です。本文にも追記します。 やりたいことは、例えば.gitignoreのようなファイルの各行の内容をひとつなぎに結合した文字列にして、別のコマンドに引数として渡したい、ということでした。(さらに#始まりの行は無視、とかもしたい。) そのため、ファイル名を持ちまわるだけだと「ファイルの各行の内容をひとつなぎに結合」ができない感じだと思います。
退会済みユーザー

退会済みユーザー

2019/05/15 00:50

まてよ、結合はfor文でなくシェルコマンド側でやればいいかもしれないと思い始めました。
退会済みユーザー

退会済みユーザー

2019/05/15 01:48

結合はシェルコマンドでやる形で、for文を無くして解決しました。 attr:=`grep -v "\#" ファイル名 | xargs` test: echo ${attr} ご助言から発想できました。ありがとうございました。
guest

0

Makefile

1test: 2 attr=; 3 while read line; do \ 4 attr=$${attr}$${line}; \ 5 done < ファイル名; 6 echo ${attr}

Makefileでは、一行ごとにサブプロセスが生成されます。

動作確認できていませんが、以下ではどうなるでしょうか。

Makefile

1test: 2 attr=; \ 3 while read line; do \ 4 attr=$${attr}$${line}; \ 5 done < ファイル名; \ 6 echo ${attr}

投稿2019/05/14 06:39

kazto

総合スコア7196

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

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

退会済みユーザー

退会済みユーザー

2019/05/14 08:08

ご回答ありがとうございます。 試してみましたが、同じく空行となりました。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問