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

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

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

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

makefile

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

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

Q&A

解決済

3回答

4947閲覧

Makefileで外部プログラムから変数を取得する方法

vega77

総合スコア17

make

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

makefile

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

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

0グッド

0クリップ

投稿2020/05/30 08:06

編集2020/06/18 00:34

前提・実現したいこと

Makefileで外部プログラムから値を取得したいです。

Makefile

1VAL := `<command>`

或いは

Makefile

1VAL := $(shell <command>)

で外部プログラムから値を取得できる事は分かっています。但し、それぞれ問題があり良い方法が見つかりません。

発生している問題

Makefile

1VAL := `<command>`

では参照される度に実行がなされてしまいます。ランダム値の様な実行する度に違う値が返ってくるプログラムなので参照する度に違う値になってしまいます。実行は一回で参照を複数回しても同じ値を参照するようにしたいです。

Makefile

1VAL := $(shell <command>)

では実行が一回で値を取り込み、何回参照しても同じ値が返ってくるのですが、別の問題として環境変数を設定しないとプログラムが実行できないというのがあります。Makefile側で持っている変数をshの環境変数として設定できればうまく行くと思うのですが。exportでは設定されませんでした。

該当のソースコード

これだとechoの度にrandom.plが実行されて全て違う値になってしまう。

Makefile

1export DIR=$HOME/my_run_directory 2VAL := `random.pl` 3 4run : 5 echo $(VAL) 6 echo $(VAL) 7 echo $(VAL)

これが実行できればechoは全て同じ値になるが、random.plを実行する際に$DIRを環境変数として設定せねばならず、別のshellとだからなのかMakefileからexportでは渡す事が出来ない。

Makefile

1export DIR=$HOME/my_run_directory 2VAL := $(shell random.pl) 3 4run : 5 echo $(VAL) 6 echo $(VAL) 7 echo $(VAL)

なにか良い方法を知っている方はぜひ教えてください。

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

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

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

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

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

guest

回答3

0

以下のようにenvコマンドでDIRを渡すのはどうでしょうか?

Makefile

1VAL := $(shell env DIR=${HOME}/my_run_directory random.pl)

投稿2020/05/30 10:05

編集2020/05/30 10:06
etsuhisa

総合スコア416

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

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

vega77

2020/06/18 00:26 編集

どうもありがとうございます。 同様にシェルコマンドのexportを使っての環境変数設定でもできました。その場合別コマンドなので;が必要です。 あと、Makefileで設定したDIRを渡したいのでexport DIR=$(DIR)の方がい良いですね。 DIR := $(HOME)/my_run_directory VAL := $(shell env DIR=$(DIR) random.pl) or DIR := $(HOME)/my_run_directory VAL := $(shell export DIR=$(DIR); random.pl) ただこの方法だと設定する環境変数が沢山になってくると一つ一つ渡さないといけないので大変になってきます。 できたら`random.pl`の方を使ってexportで設定した変数を自動でシェルの環境変数に渡したい所です。 でも下で思いついた一旦ファイルにダンプする方法が使えない場合にこちらの方法が使えそうですね。
guest

0

自己解決

自分で解決方法思いつきました。

Makefile

1export DIR=$HOME/my_run_directory 2VAL := `cat rand_val.txt` 3run : 4 random.pl > rand_val.txt 5 echo $(VAL) 6 echo $(VAL) 7 echo $(VAL)

Makefile

1export DIR=$HOME/my_run_directory 2run : 3 random.pl > rand_val.txt 4 $(eval VAL := `cat rand_val.txt`) 5 echo $(VAL) 6 echo $(VAL) 7 echo $(VAL)

Makefile

1export DIR=$HOME/my_run_directory 2run : 3 random.pl > rand_val.txt 4 $(eval VAL := $(shell cat rand_val.txt)) 5 echo $(VAL) 6 echo $(VAL) 7 echo $(VAL)

これらでできます。echoでVALを表示する前にrandom.plを実行してその結果を一旦ファイルにダンプします。そのファイルの内容をcatで表示します。上二つではそのcatコマンドをVALにマクロとして設定します。一番下のやり方では$(sehll)を使ってcatで表示した結果をVALに入れています。

random.plを実行してファイルにダンプする部分を別にして

Makefile

1export DIR=$HOME/my_run_directory 2#VAL := `cat rand_val.txt` 3 4run : get_VAL 5 echo $(VAL) 6 echo $(VAL) 7 echo $(VAL) 8 9get_VAL : rand_val.txt 10 $(eval VAL := $(shell cat $<)) 11# $(eval VAL := `cat $<`) 12 @rm -f $< 13 14rand_val.txt : 15 random.pl > $@

の様にすると分かりやすくて良いかもしれません。

あと、以下の最初にファイルにダンプする方法でも可能でした。

Makefile

1export DIR=$HOME/my_run_directory 2DUMP := `cat rand_val.txt > rand_val.txt` 3VAL := $(shell cat rand_val.txt) 4 5run : get_VAL 6 echo $(VAL) 7 echo $(VAL) 8 echo $(VAL)

もっと良い方法を思いついた人がいたら是非お願いします。引き続き回答を募集します。

投稿2020/05/30 09:34

編集2020/06/22 23:53
vega77

総合スコア17

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

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

unoSSkR

2020/06/18 02:24

At first, it sounds strange you have random number returned by the executable. Commonly return as exit code whether that executalble would end to success or fail.
vega77

2020/06/18 16:06

Thanks for your comment. It's not necessarily common. It's completely up to the program. Take the following simple C program for example. int main (int a, int b) {return (a+b); } If you compile and run this program, then, you'll get the result number of a+b, not sucess/faill exit code.
unoSSkR

2020/06/19 05:17

Viewpoint of not technique but manner.
guest

0

質問内にあるDIRの使い方を誤解しているかもしれませんが、以下でいいのでは。

make DIR=hoge run

投稿2020/05/30 08:45

KojiDoi

総合スコア13692

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

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

vega77

2020/05/30 09:27

どうもありがとうございます。そうですね。それとはちょっと問題が違います。DIRをMakefileに渡すのではなく、Makefileの中で設定されたDIRをMakefileから実行するrandom.plに渡したいです。 ``で実行されればexportで渡るのですが、$(shell )での実行だと渡らない様です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問