make

このエントリーをはてなブックマークに追加
154名無しさん@お腹いっぱい。:2011/12/14(水) 22:33:10.45
hoge:
@FOO=1; \
echo $(FOO)
155名無しさん@お腹いっぱい。:2012/03/09(金) 00:47:54.33
マクロにカレントディレクトリ以下にある、特定の拡張子を持ったものすべて追加することはできませんか?
例えば、カレントディレクトリ以下の.pl拡張子を持つファイルのどれか一つでも修正されていたらコマンドを実行したい場合、どのように書けばいいでしょうか?

FILES = *.pl */*.pl */*/*.pl
TARGET: $(FILES)
hoge $(FILES)

のように現在書いているのですが、ディレクトリの深さが変わった場合などに変更が必要なため、スマートな方法がないかと思っています
156名無しさん@お腹いっぱい。:2012/03/09(金) 01:27:15.53
$(shell ) で find でも呼んでみるとか
157名無しさん@お腹いっぱい。:2012/03/09(金) 03:50:50.02
Makefile を外部ツールで作っちゃうなあ
158名無しさん@お腹いっぱい。:2012/03/13(火) 05:19:00.92
CMake ってなんだこれ、すげえなぁ
159名無しさん@お腹いっぱい。:2012/06/18(月) 15:45:27.74
makeのコマンドブロックの中でsedのaコマンドどうかけば良い?
-fでファイルに書いたの使ってるけど、もっとかっちょいいの教えて。
160名無しさん@お腹いっぱい。:2012/06/19(火) 11:37:05.93
自己解決しました。newlineに展開されるビルトインマクロを使用。
161名無しさん@お腹いっぱい。:2012/06/24(日) 16:56:32.30
makeの勉強をしているのですが、
*.html.txtというファイルをあるコマンドに渡して.htmlとして出力したいのですがうまくできません。

.SUFFIXES: .txt .html
.txt.html:
echo $< > $@

TEXTFILE = $(wildcard *.txt)
HTMLFILE = $(SHPAMLFILE:.txt=.html)

all: $(HTMLFILE)

とすると、hoge.html.htmlとなってしまいます。
HTMLFILE = $(SHPAMLFILE:.html.txt=.html)
とすると、"ターゲットが見つかりません"となります。ドットが2つあるとできないのでしょうか?
162名無しさん@お腹いっぱい。:2012/06/25(月) 01:28:04.11
2行目のサフィックスルールが .txt.html になってるので、*.txt から *.html の生成ルールになってる。
そのルールではhoge.html.txt からは hoge.html.htmlしか作れないのでは。

2行目を
%.html: %.html.txt
にしてみたらどうだろうか。
163名無しさん@お腹いっぱい。:2012/07/16(月) 15:53:24.42
build/foo.a: build build/foo.o
ar rcs $@ build/foo.o
build:
mkdir -p build
build/foo.o: build
touch build/foo.o
というMakefileなのですが、arを実行するとbuildディレクトリのタイムスタンプが更新されてしまうため、
makeを実行すると常にfoo.oやfoo.aが作成されてしまいます。
buildディレクトリが更新されないようにするにはどうすればいいのでしょうか。
164名無しさん@お腹いっぱい。:2012/07/17(火) 23:14:09.47
build/foo.a: build/foo.o
ar rcs $@ build/foo.o
build/foo.o:
[ -d build ] || mkdir build
touch build/foo.o
165名無しさん@お腹いっぱい。:2012/07/18(水) 00:44:42.87
buildのタイムスタンプが更新しないようにするというよりも、buildのタイムスタンプに依存しないようにするほうがいいんじゃないかな

http://www.gnu.org/software/make/manual/html_node/Prerequisite-Types.html
によると下から2行目を
build/foo.o: | build
でできそう
166名無しさん@お腹いっぱい。:2012/07/21(土) 14:05:12.64
ありがとうございました。|を使うことで解決しました。
167名無しさん@お腹いっぱい。:2012/08/16(木) 04:15:16.18
今年は大垣でmakeするの?
168名無しさん@お腹いっぱい。:2012/10/29(月) 21:57:03.15
Makefileの中に使われる
:= はどういった意味でしょうか
+=は変数に右辺を追加する意味かと思うんだけど
169名無しさん@お腹いっぱい。:2012/10/30(火) 19:35:28.31
>>168
man make

とレスしようと思ったが、環境によって書かれていないこともあるみたいなので、
勝手に FreeBSD の make の場合に限定させてもらうけど、以下 URL の変数代入の項目に記載がある。
http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&lc=1&cmd=&man=make&dir=jpman-9.0.2%2Fman§=0

GNU make の場合は、info make に記載があるっぽい。
http://quruli.ivory.ne.jp/document/make_3.79.1/make-jp_5.html#Setting
http://quruli.ivory.ne.jp/document/make_3.79.1/make-jp_5.html#Flavors
170名無しさん@お腹いっぱい。:2012/10/30(火) 21:35:09.63
レス書いたけど、マルチだったのでやめた。
171名無しさん@お腹いっぱい。:2012/11/19(月) 16:40:52.08
Makefileで処理を自動化できないかと思い、makeについて勉強しております。
以下のことを行いたいのですが、色々と検索して調べているのですが実現できずにいます。もしよろしければ、サンプルを書いていただけないでしょうか?

行いたいことは、
make testと言うコマンドでテストを一括で行いたいと考えております。
テストは単純で、テストファイルを用意しているので、"perl test.pl"になります。
make testはファイルの更新に依存せずに実行させる。

まず、Makefileのディレクトリ配下の"test.pl"を検索してtest.plの一覧を受け取る方法がわからずに悩んでおります。
また、そのリストを順番に、実行しているファイル名を出力しつつ回したいと思っているのですが、その方法がわかりません。

今は下のように考えたのですが、間違っているようで思ったとおりに動きません。

TEST_FILES = `find ./ -name "test.pl"`

all:
echo all

.PHONY: test
test:
$(foreach filename, $(TEST_FILES), $( echo $(filename)))
172名無しさん@お腹いっぱい。:2012/11/19(月) 19:01:43.87
GNU makeは人間が書くためのツールじゃないと思う。

test:
find . -name test.pl -exec sh -cx "perl {}" \;
173名無しさん@お腹いっぱい。:2013/02/08(金) 14:12:54.85
make の ワイルドカード( * ) の使い道について教えていただけませんか。

パターンの、% を使えば同じことができるように思いますし、
そもそも、ワイルドカードは、すでにファイル(オブジェクト)として存在するものにしかマッチしないようなので、
ファイル(オブジェクト)を新規作成しないで、アップデートするためにしかルールを使いたくないという
特殊な場合でしか、意味がないような気がします。。

自分でも、自分の理解が変なような気がするのですが、
どなたか教えてください。
よろしくお願いします。
174名無しさん@お腹いっぱい。:2013/04/20(土) 01:31:47.01
教えて下さい。
下記のように引数 10 を Makefile 内で、更に引数として渡してやりたいのですが
どの様にすればよいのでしょうか?

$ make hoge 10

にて

hoge:
  /PATH/TO/foo.sh 10

と渡るようにしたい。


Makefile 内にて

ARG = $(shell read -p "ARG = " arg; echo $(arg))

hoge:
  /PATH/TO/foo.sh $(ARG)

などしてみたのですが上手くできませんでした。
175名無しさん@お腹いっぱい。:2013/04/20(土) 05:46:30.94
無理。というかmakeの使い方間違ってる。
176名無しさん@お腹いっぱい。:2013/04/20(土) 07:33:37.61
>>175
ありがとうございます。
ご指摘がヒントになり、解決できました。
shell スクリプト内で read することで対応できました。

ARG=`read -p "ARG= " arg; echo $arg`

echo $ARG

↑こんな感じで。
177名無しさん@お腹いっぱい。:2013/08/01(木) NY:AN:NY.AN
めでたしめでたし
178名無しさん@お腹いっぱい。:2013/08/01(木) NY:AN:NY.AN
BSD makeとGNU make比較した時
クライアング運用ならBSD makeのが劣っている点はなんですか?
179名無しさん@お腹いっぱい。:2013/10/05(土) 08:31:25.07
質問です。

Makefileに、

HOGE = -opta

と書かれていて、これは修正しないものとします。
make時に臨時に HOGEに -optb を追加したいのですが、

$ make HOGE+=-optb

を実行すると HOGE = -optbの状態で上書きされ、Makefileの-optaが消えてしまいます。
( += の指定は環境変数HOGEに追加するという意味にしかなりません。)

これを、Makefileの記述も生かしつつ、それに追加ということを
makeのコマンドラインで指定することはできませんか?

もちろん、Makefileの下の行に HOGE+=-optb と追記すればOKですが、
最初に書いたようにMakefileを修正しないということが条件です。

以上、わかる方回答をお願いします。
180名無しさん@お腹いっぱい。:2013/10/05(土) 09:20:10.39
>>179
一時的でよいのであればそのように指定すればよいのではないでしょうか?
$ make HOGE="-opta -optb"
181名無しさん@お腹いっぱい。:2013/10/05(土) 09:29:26.75
>>180
それじゃ解決になりません。

>>179 は例として書いただけで、
実際には HOGE = -opta の部分はもっと複雑で
例えば HOGE = $(FUGA) -Oopt $(BOKE)
みたいに他の変数も参照したりしていて、何に展開されるか自明じゃないです。

そういうのに関係なく、最後に -optb の追加だけやりたいというのを
コマンドラインの make HOGE=... のような書き方で簡単にやりたいという質問です。

では、わかる方(他の方)回答をお願いします。
182名無しさん@お腹いっぱい。:2013/10/05(土) 11:14:39.83
>>181
他の方でなくて申し訳ないのですが、、、
もしHOGEが一度定義された後、変わらないのであればMakefileを一時的に以下のように変更して、
中身を取り出してはどうでしょうか。

HOGE = $(FUGA) -Oopt $(BOKE)
echo $(HOGE)
exit

そこで出てきたHOGEをmake HOGE=で指定する方法はどうでしょう。

ちなみに>>179でOKだとされたことが
echo "HOGE+=-optb" >> Makefile; make
であれば、最後にHOGEの内容を変えたあと、HOGEは参照されることはないと思われます。
183名無しさん@お腹いっぱい。:2013/10/05(土) 11:24:15.53
>>182
すみませんが、全然解決になってません。
Makefileの変更は不可です。

あと、>>182の下3行は182さんの間違いです。

Makefileでは、変数の展開だけ先にやって、
その後でルールを実行するので、
Makefileの最終行に変数代入追加を行なっても
それより上の行に書いてあるコマンドでちゃんと参照されます。

すみませんが、そのようなことは理解ずみの方のみ回答をお願いします。

ではどうぞ
184名無しさん@お腹いっぱい。:2013/10/05(土) 11:52:38.36
>>183
勉強になります。

そうであれば、
$ make -p | grep HOGE
で出てきた、値に何か追加して
$ make HOGE="..."
でどうでしょう。
185名無しさん@お腹いっぱい。:2013/10/05(土) 12:05:26.20
いや、だからそんなのじゃダメだって。
186名無しさん@お腹いっぱい。:2013/10/05(土) 23:46:35.99
っていうか、make の仕様をくつがえすようなことはできないよ。
187名無しさん@お腹いっぱい。:2013/10/06(日) 06:44:29.75
ソース書きなよ。
188名無しさん@お腹いっぱい。:2013/10/06(日) 06:55:22.69
>>179
(cat Makefile; echo HOGE+=-optb) | make -f -
189名無しさん@お腹いっぱい。:2013/10/06(日) 07:04:12.29
>>188
それでも、Makefileの中から $(MAKE) で自分を再帰呼出ししていたら
-f の指定が無意味になるのでNGだよ。残念。
190名無しさん@お腹いっぱい。:2013/10/06(日) 15:36:26.82
make を使うのが間違ってるんじゃ
191名無しさん@お腹いっぱい。:2013/10/07(月) 21:09:25.32
pmake専用
make HOGE="`make -V HOGE` -optb"
192名無しさん@お腹いっぱい。:2013/10/08(火) 07:33:24.10
CMake 凄すぎワロタwwwwwww
バカなドザの俺でも MinGW で sox を make 出来たwwwwwwww
このアイちゃんツールスゲェwwwwwwww
193名無しさん@お腹いっぱい。:2013/10/19(土) 11:50:38.99
make loveと入力しても
loveをmakeするルールがないと言われました
照れているのですか?
194名無しさん@お腹いっぱい。:2013/10/20(日) 21:18:36.55
GNU Make 4.0

Guile が組込まれただと?!
195名無しさん@お腹いっぱい。:2013/10/20(日) 22:20:22.89
これで一層移植性が悪くなるのか。なんか逆の方向に必死で走ってる。
196名無しさん@お腹いっぱい。:2013/11/23(土) 02:30:05.46
ぼく用メモ
必須項目をfindで列挙するとき-print0オプションをつけると仇となることがある
197名無しさん@お腹いっぱい。:2014/06/04(水) 00:53:10.80
Makefile で、
%.o : %.cpp
(rule)
と汎用的に書いておき、特定のソースコードはコンパイルオプションを変えてコンパイルしたい
場合、どう書けば良いですか? 上記に続けて
a.o : a.cpp
(rule)
と書いても無視されてしまう…
makefileを分割しないとダメなんですかね?
198名無しさん@お腹いっぱい。:2014/06/20(金) 22:21:58.32
順序を逆にすれば?
199名無しさん@お腹いっぱい。:2014/10/19(日) 13:11:51.98
export PATH=/usr/new/bin:/usr/localbin:$PATH
としているのですが、
makeすると /usr/local/binにある方が使われてしまいます。
makeで使われるシェルにPATHを設定するためには、どこにその記述をすればよいのでしょうか。

自分でMakefileを作ったわけではなく
具体的には、gccのmake中のものなんですが。
200名無しさん@お腹いっぱい。:2014/10/19(日) 13:36:31.37
Makefileの中で再設定されてるんだろ。
gccだったらconfigureとか黒魔術がかかってるから、素人は手出しできない。

PATH=/usr/new/bin:/usr/local/bin:$PATH ./configure hoge
で、うまくいくかも。
201名無しさん@お腹いっぱい。:2014/10/19(日) 14:09:36.84
Makefileの中でPATHかコマンドを変えてるんじゃない?
Configuerで変更できないの?
202名無しさん@お腹いっぱい。:2014/10/20(月) 13:12:31.29
>>199
MakefileでSHELL変数を設定すればいい
http://www.gnu.org/software/make/manual/make.html#Choosing-the-Shell

でもgccのビルドだとMakefileが複数あるんだっけ
自分なら、面倒そうたら一時的に/usr/local/bin/sh をリネームするかなあ
203名無しさん@お腹いっぱい。
実際の問題はconfigureが/usr/new/binからコマンドを拾ってくれないという方だったりしませんか?
/usr/new/binにある方を使わせたいコマンドとは何でしょう?