1 :
デフォルトの名無しさん :
02/08/18 00:51
2 :
デフォルトの名無しさん :02/08/18 00:52
HSP使えば?
問答無用のウンコスレ
Antがアリます。
Antだけに
Antツバキは恋の花
あんと〜あん〜と〜 クソスレだけどスレタイ気に入った。
make love
>>7 ありがとうございます。
日本人相手なら早口言葉としても使えます(多分)
MMMP と覚えてください。
10 :
デフォルトの名無しさん :02/08/18 01:33
HSP使えばいいのに
11 :
デフォルトの名無しさん :02/08/18 01:33
make(・∀・)キター。 結構期待してたわん。
gmakeで統一しろよ そうすりゃ方言なんて気にしなくていいだろ。
13 :
デフォルトの名無しさん :02/08/18 02:52
ここはmake叩きスレというわけではないよな? VC++のメニューに メイクファイルのエクスポート ってのがあることを思い出した。 あれはイイもの?普通?クソ? (自分が使う機会があるかどうか微妙だけどとりあえず聞いてみる)
>>11 ,
>>13 どちらかというと make を語るスレです。
なんか一個も make のスレが無かったので立てました。
15 :
デフォルトの名無しさん :02/08/18 03:16
automake使えば、makeがgmakeか、gじゃないmakeか判定して、 よきにはからってくれたようなきがする。 automakeで生成したMakefileがHI-UXのmakeでも通ったし。
automake・・・・ なんでmakeごときがあんなに複雑(そう)になるのかね?
本に載っているアルゴリズムのプログラムを打ち込んでコンパイルして勉強中です。 するとディレクトリの中に短く単発のソースとバイナリがいっぱいできます。 Makeを使って、Makefile内にソース名を打ち込まないで、 ソースと同名のバイナリをコンパイルすることはできませんか? 具体的には、ディレクトリの中が seive.cpp shellsort.cpp tree.cpp quicksort.cpp みたいになってるんです。それを >make 一発で seive.cpp seive.exe shellsort.cpp shellsort.exe tree.cpp tree.exe quicksort.cpp quicksort.exe になるようにできませんか? この後もどんどん細かいソースが増えるので、Makefileを書き直すのが面倒です。 でも特徴として、1ソース1バイナリになっているので可能な気がします。
Makefileを書き換えずにやるのは無理じゃないか? 新しいファイルがディレクトリにあった場合Makefileを更新するツールを スクリプト言語で書いた方が手っ取り早いだろう。
SOURCE:=$(wildcard *.cpp)
Antよりmakeの方が簡単
なるほど。
22 :
デフォルトの名無しさん :02/08/18 23:57
ascii の FTP に、GNU Make のマニュアル日本語版があるよ。
>>1 のページに書いてあるようなことは卒業した人にお勧め。
>>16 システムの全ての必要な要素について、
それがあるか?、またそのバージョンは?
って調べていくんだから、そりゃ大変な作業だろ。
Windowsみたいにまとまってねーんだよ。UNIXは。
微妙な差異がものすごくめんどくさい。
>>23 Windowsだってまとまってねーんだよ。
NTと95は全くの別物。
>>23 いや、それは Autoconf と突っ込んでみる。
Makefile より Makefile.am の方が簡単だと思うし、
自分のところで動けばいいなら autoscan した後、
$ mv configure.scan configure.ac
して、
- AC_CONFIG_HEADER([config.h])
+ AM_INIT_AUTOMAKE([foreign])
- AC_CONFIG_FILES([])
+ AC_CONFIG_FILES([Makefile])
するだけで結構うまくいったりするが、どうよ。
高度な事すると結構面倒だけどね。
26 :
デフォルトの名無しさん :02/08/19 23:27
Minix のころは make から cc よぶメモリが足りなかったら make -n > hoge; sh hoge とかできたもんだ... あの頃は simpleだったのう。
Antじゃダメなん? うちの会社、ソースはC++だけどAntでビルドしてるけど、それって異端?
>>27 Javaならね。
UNIXはMakeの資産があるからAntが使われることはないと思う。
(´-`).。oO(うちの会社は異端かぁ)
>>27 実行形式がJavaってだけで、動かないプラットフォームがでてくるし。
研究室の古株のDigitalUNIX(not Tru64)、IRIXの古いの、HI-UX、HP-UXあたり。
ライセンスとかハードウェアの関係で最新OSにすることはできないことが多い。
逆にJavaの開発でmake使ってる人っているんか?
何だってこんな糞ツールがここまで普及したんだろう? UNIXの連中ってアフォばっかりだな
UNIXはもっとLispに学ぶべきだ
>>29 (´-`).。oO(そんな会社にいたんかぁ)
>>32 融通効くからじゃない?行頭のTabを忘れなければ…。
ビルドの為に手間をかけるのが面倒だったからかもしれんし。
>>33 Lispでmakeに相当するもの…ですか?
>>27 C++だとmakedependしたいからやっぱりmake
>>36 make depend って、私はいつも gcc -MM でやってるんですが、
他に何か定石的なやり方ってあります?
本来makeの機能ってコンパイラ自身が持っておくべきだと思うんだけどな。 んでpre/postな処理はsh/perlあたりでやればすっきりするはずだよ。 makeって機能が貧弱なわりに(そのせいでか?)人によって 書き方がかなり変わってきてメンテしづらいんだよな。
変態的なマクロとか 環境変数との関係とか make依存の痴漢ルールとか そのへんがイヤン
元となる C言語が貧弱すぎたからな。あと、リンカも貧弱すぎたのかも。 だから makeで外部的に一生懸命書く必要があった。 まあ、逆に Cが貧弱だから、あの程度の仕組みで分割コンパイルの 恩恵にあずかれたのかも。 C++なんか、分割コンパイルをまともに働かせるようにするの 大変そうだし。
別にmakeはCのためだけにあるわけではない。
>>41 とはいえUNIX的ミニマリズムはいい加減古びつつあるような。
PerlやApacheなんかは単体のツールとしてどんどん複雑になっていくように
他のツールも高機能化・複雑化していくのは自然な流れでしょう。
>>42 それがよくない
make setupなんてやるなら
bash setupにしてくれよ。
>>40 サンクスです。makedepend ってツールの名前だったのね。
ちょっと使ってみたけど、たしかに速い。
あと、gcc -MM みたいに、< > で囲んだやつは無視して
くれるともっとよかったけど。
45 :
デフォルトの名無しさん :02/08/24 18:28
>>43 自分でツールを作りながら処理するような場合は、やっぱり
makeの枠組で出来た方が有難い。
46 :
デフォルトの名無しさん :02/08/24 18:37
んだんだ。makeとコンパイラはやっぱり分かれてた方がいい。 勝手にされたらされたで不満がでるはず。
>>43 make setupなんて見たことないぞ。
48 :
デフォルトの名無しさん :02/08/29 04:16
age
VC系の超貧弱makeのことを書いているヤシがいるような あれはmakeと呼ぶのもおこがましいが...
vc系って何? makeと呼べる基準って何?
|-- mona | |-- Makefile | |-- sample.xml | |-- mona.c | `-- mona.h |-- 2ch.so ↑のようなディレクトリ構成の時、 既にある2ch.soを用いてmonaディレクトリでmakeして、 monaってsoつくりたいんですけど、どーやればいいんでしょうか? 誰か助けてください。
あ、monaっていう実行ファイルでした^^;
>>52 $CFLAGSで出力先を変えればいいだけじゃないの?
-o オプションかね。
>54 んーっと、 |-- mona | |-- Makefile | |-- sample.xml | |-- mona.c | |-- 2ch.so | `-- mona.h 2ch.soの生成をこうスレって話ですか(? 上の階層のアドインみたいな形にしたいんですけど、毎度コンパイル しないと駄目なんすかね? (既にあるのでそれを活用したい)2ch.so生成するルールがねーぞ、 ゴルァってでまふ。
>>55 あなたの日本語が理解できないのだが、
-o やら -L やらで簡単に解決する話のような気がする。
57 :
デフォルトの名無しさん :02/08/30 19:17
>>55 > (既にあるのでそれを活用したい)2ch.so生成するルールがねーぞ、
> ゴルァってでまふ。
ライブラリパスの設定するだけかも。
2ch.soを作成するのは?ってことならlibtoolでも使ってくれ。
パス設定して、でけたー さんくすこ>56-57
make makes a massive mess. ってのを思いついた。そんだけ sage
60 :
デフォルトの名無しさん :02/08/31 12:59
make makes me mad. はどう?つーか、いま FreeBSDの kernel buildでエラーでたから makeをおってるんだけど、さっぱりわかんねー。kmod.mk が動くときの cwdはどこなんだ?
make makes macro maze.
make makes me mad.
make makes more money. だったらいいなぁ
>>38 web pageの更新にもmakeを使ってるから、
C compilerに統合されたら困るよぉ。
ところで、
>>17 には
>>19 で通じたんだろうか?
MS製品のVC++、FrontPage(HTMLエディタ)ともに make的な機能が統合されてるよ。 思うにUNIXにOOPLが普及してmakeクラスがあればもっと使いやすくなるのでは。
66 :
デフォルトの名無しさん :02/09/04 10:53
MSのmakeはNanchatte make
俺思うんだけど, コマンドラインで実用に耐えるコマンドがUnix系OSに比べて遥かに少ない Windowsで, makeなんて使いモノになるの? Windowsで仕事したことないから分からんのだけど, だれかおせーれ.
>>68 > Windowsで, makeなんて使いモノになるの?
libtiffをVC++6で利用するためにnmakeを利用したけど、
自分でhoge.makを書く気にはならんかった。
>>69 やっぱりそうだよね.
>>70 cygwin使うくらいならWindowsなんて使わんよ(笑). 仕事でWin触ることはあり得ないからイイっす.
72 :
デフォルトの名無しさん :02/09/07 02:14
そもそもWindowsがCUIのためのOSじゃないってことなんだろうな。 だからcygwinは イイ(・∀・)!! わけで。 CUIが好きなのにWindowsを使う人はmake犬。
>>66 UNIXの欠点はすべてのコマンドがプロセス毎に独立してしまっていて
通信手段は貧弱なパイプしかない。
そこでmake, sort, grep等のコマンドをすべてクラス化してしまって
同一プロセス内で使えるようにすればもっと使いやすくなるのではと推測してみる。
疎結合から密結合へ退化ですな
UNIXは疎に過ぎる。 パイプとソケットだけではもうまともなアプリは作れないよ。 プロセス・ネット越しにオブジェクト間でお話できないとね。
76 :
デフォルトの名無しさん :02/09/07 02:59
あのー質問です。gnu make 使っているんですけど make を起動した後でどこかのディレクトリに潜って(depして) 元のディレクトリの内容を変更したんですが 正しくディレクトリの変更が反映されていないみたいなんです。 元の gmake にもう一度ディレクトリ内のファイルの依存関係を 読み込ませるにはどう指示すべきでしょうか?
>>75 pipe とかの上でも、HTTP とかの protocol を使えば、お話自体はできるはずなんだけど…
誰かがそんな library 作って広めない限り、話しかけても相手にされないんだよね…
PID か何かを元に、それぞれが互いに話しかけたりできればいいんだけど…
PascalのUNIT方式ならメイクに必要な情報はソース中に書いてコンパイラが処理してくれるのに。 C使うとソースとは別にmake書かなきゃならないんで「なんでこれくらいのことやってくれないんだ」とイライラしてくる。 そのくせコンパイル速度も遅いし。
コンパイル速度と言えば、gccってpch (precompiled header)みたいなのないの? VC++にあるけど、あれがあれば開発中にコンパイル速度に悩むことは無いと思うが。
makefileなんて小規模なのならチョイチョイっとやるだけで済むし、 大規模ならautoconf,automakeで済ませればいいから体した手間ではないと思うのだが…。
>>76 もうちょっと具体的に書いてくれないと答えられないよ。
automakeが面倒なんだが
83 :
デフォルトの名無しさん :02/09/10 05:00
意外とデフォルトのルールだけでうまくいったりして ...
>>83 > 意外とデフォルトのルールだけでうまくいったりして ...
ライブラリとかあると,なかなかそういうわけにはいかないよね.
85 :
デフォルトの名無しさん :02/09/10 20:29
検索するとautomake/autoconfサイトいっぱい出てくるんだけど どのサイトが一番いいの?
あ、そうだ。 死のうっと。
automake win32(非cygwin)で動かしたいんだけど、互換ソフト無いですか? シェルスクリプトみたいなので、そのままじゃ動かないですよね
>>78 > PascalのUNIT方式ならメイクに必要な情報はソース中に書いてコンパイラが処理してくれるのに。
#if 0
cc -o hoge hoge.c
exit 0;
#endif
#include <stdio.h>
int main(void) { printf("hoge\n"); }
このソースに実行権限をつけて実行するとexit以下は実行せず
かつ#がコメント化する事を利用したハック
コンパイルする場合は#if 0 で囲んであるのでコンパイラは無視する。
ツールレベルの小さなプログラムが多数ある場合、
makefileとソースの管理がウザイんでこの手を使うこともある。
>>78 PascalにUNITなんてものは規定されていない罠。
90 :
デフォルトの名無しさん :02/09/13 14:08
せめてデフォルトで用意されているマクロくらいは make 間で統一されてればなーと思いませんか ?
>>90 あー、それは確かに思うね。普段はGNU make使ってるから気にならないけど、他のmake使うと途端に困る…w
92 :
デフォルトの名無しさん :02/09/13 16:40
automakeってヘッダの依存まで調べてくれるの?
あと, つい数日前まで恥ずかしながら知らなかったことなんですが, Solaris 6 (7 かも) の /usr/ccs/bin/make の suffix rule って, 例えば .c.o : rule っていう感じなんですね. .c.o : rule ではだめみたい. 特定の make に依存しないように, デフォルトのマクロの挙動に 気を使って Makefile を書いてたけど, その努力は意外なところから破綻してしました ...
>>92 > automakeってヘッダの依存まで調べてくれるの?
$ gcc -M hoge.c
で出力される程度には調べてくれます。depcompが調べてくれたと思います。
>>95 > ちょほいと勉強しようと思ったけど長すぎて読んでられないよ
texinfo-4.2を使っているなら、それぞれソースを持ってきて
$ makeinfo --html auto*.texi
すると分割されるが、って、全体の長さは変わらないけどね。
GNUjdoc (
ttp://openlab.ring.gr.jp/gnujdoc/ )には日本語訳も
あるみたい。
98 :
デフォルトの名無しさん :02/09/14 22:32
以下のようなディレクトリ構成の場合にちゃんとビルドするには どうしたらいいでしょうか?gmake か MS の make か borland の make でお願いします。 一応、ディレクトリ分けしない状態ならうまくいった(ボーランドのmake)のですが… +project |-------makefile |-------+bin | |-------app.exe |-------+obj | |-------abc.obj | |-------def.obj |-------+src | |-------abc.cpp | |-------def.cpp |-------+include |-------abc.h |-------def.h ●ディレクトリ分けしなかった時の makefile CPP_FLAGS = -c -GX -GR CPP_COMPILE = cl LINK = link OBJS = abc.obj def.obj app.exe: $(OBJS) $(LINK) $(OBJS) .cpp.obj: $(CPP_COMPILE) $(CPP_FLAGS) $< .h.cpp: よろしくお願いします。
99 :
デフォルトの名無しさん :02/09/14 22:38
お前ら自慢の手書きmakefileのテンプレ晒して下さい。
>>98 なんかmakefile以前の問題のような。
望むような動作をバッチファイルで書ける?
>>100 望む動作をバッチファイルで実現できたら make は使いませんが…
普通にコンパイルする方法を知っているのか?という意味だと受け取ったので
「それくらいわかってるよ!」という事を証明しておきます。
cl -c -GX -GR -Fo.\obj\abc.obj .\src\abc.cpp
cl -c -GX -GR -Fo.\obj\def.obj .\src\def.cpp
link -out:.\bin\app.exe .\obj\abc.obj .\obj\def.obj
これを是非 makefile にしたいです。
>>101 makefile :
bin/app.exe:
cl -c -GX -GR -Fo.\obj\abc.obj .\src\abc.cpp
cl -c -GX -GR -Fo.\obj\def.obj .\src\def.cpp
link -out:.\bin\app.exe .\obj\abc.obj .\obj\def.obj
clean:
del /s /q . > nul
rmdir /s /q .
>>98 もっと具体的に書いてくれないとわかんないよ。
>>102 いやーお兄さん一本取られちゃったな。
> 望む動作をバッチファイルで実現できたら make は使いませんが…
を優先ですか、さすが!
っていうか、マジレスキボンヌです。
ちゃんと依存関係を調べて make できる makefile の書き方を教えてください。
よろしくお願いします。
>>103 src 内に .c や .cpp ファイルがあって、
include 内に .h があって
これらのファイルをコンパイルして
最後にリンクして、できあがったファイルを bin の中に入れたいのです。
よろしくお願いします。
>>105 それだけではどんな統合環境でもメイクできないのでは。
リンクしてできあがるファイルが何なのかさえわからないじゃん。
>>98 暗黙のルールに依存しないで
すべてのソースを明示的にコンパイルすりゃできるけど
そんなの面倒だから全部同じディレクトリにしとけ。
んでmake installでバイナリだけコピーすりゃいいよ。
>>107 いや、ファイルの種類や、取り扱いに使うコマンドはどうでもいいのです。
make の書式について知りたいのです。
とりあえず上記例でも出しているのでコマンド等は下記のように仮定してもらっても結構です。
できあがるファイルの種類 *.exe
ソースの種類 *.cpp
ソースが依存しているファイルの種類 *.h
コンパイルに使用するコマンド cl.exe
リンクに使うコマンド link.exe、
コンパイル時に常に引き渡すオプション -c -GX -GR
リンク時に常に引き渡すオプション なし
cl.exe に出力ファイルを指定する為のオプション -Fo
link.exe に出力ファイルを指定する為のオプション -out:
よろしくお願いします。
もう一声. 知りたい make の書式とはどんなやつのこと ?
>>108 まともなレスありがとうございます。
暗黙のルールの中にはディレクトリは指定できないという事でしょうか?
>>110 えっと…、「書き方」です。
.cpp ファイルが src というディレクトリ内にあって、
.h ファイルが include というディレクトリ内にあって、
.obj ファイルが obj というディレクトリ内にあるんだよ。という事を
make に教える方法というか…。
>>109 手っ取り早いのは vpath でサーチするディレクトリを追加じゃない?
bin に ふつーに Makefile を書いて vpath で include や src を追加したら
それらのディレクトリも見てくれる。
厳密にやりたいなら、スクリプトの助けがいりそう。
おいらは素人なので偉い人ならもっとスマートにできるかもしれないけど。
suffix rule はカレントディレクトリしか検索しないと思います. で, 113 の言うとおり VPATH で指定すればいいんですけど, お使いの make にその機能はありますか ?
CPP_FLAGS = -c -GX -GR
CPP_COMPILE = cl
LINK = link
>>110 ちなみに、下記は擬似例ですが、雰囲気は伝わるでしょうか?
. が拡張子の意味とカレントディレクトリの意味でかぶっていて見づらいとは思うのですが
>>98 ,
>>112 とあわせて見てもらえると、私が何を求めているのか
理解して頂けるような気がするのですが…
OBJS = ./obj/abc.obj ./obj/def.obj
./bin/app.exe: $(OBJS)
$(LINK) $(OBJS)
./src/.cpp ./obj/.obj:
$(CPP_COMPILE) $(CPP_FLAGS) -fo ./obj/$<.obj ./src/$<
./include/.h ./src/.cpp:
失礼しました、上の方に謎な文がくっついてしまいました。
# Mozilla 1.0 ってちょっとバギーですよね…。
# .9.x の頃のがしっかりしてたな…。
>>113-114 無学なもので vpath という物を知らないのですが、
独立したコマンドでしょうか? make のオプションでしょうか?
>>113 具体的に言うと shell でディレクトリに潜って ls でリストを変数にいれて
addprefix で bin/ なり src/ なり include/ obj/ なりを付け加えて
それを Makefile.hogera で出力して $(MAKE) -f Makefile.hogera
ってする。
>>116 GNU Make にあるコマンド。addprefix もそう。
>>117 なるほど、そういう技巧を使わないとできないんですね。
>>108 さんの方法でお茶を濁そうかと思います。
みなさんありがとうございました。
別に技巧ってほどのものじゃないしスマートじゃないけどね…。 やっぱ偉い人がツッコミいれてくれないとイマイチだな…。
make自体スマートじゃないからどうしようもない。 それに凝ったmakefile書く奴ってく非生産的なのが多いので makefileはシンプルに。つかVC使えよ。
VC厨までが出てきたか もう寝るよ
↑もう起きて来なくていいよ。
>>120 低レベルなム板で頑張っても無意味。unix板に帰ろう。
>>98 こんなところだろう。
SRCDIR=src
OBJDIR=obj
INCDIR=include
BINDIR=bin
DIRS=$(OBJDIR) $(BINDIR)
CPP_COMPILE=cl
CPP_FLAGS=-c -GX -GR -Fo$(OBJDIR)\ -I$(INCDIR)
LINK=link
LINK_FLAGS=
OBJS=$(OBJDIR)\abc.obj $(OBJDIR)\def.obj
TARGET=$(BINDIR)\app.exe
all: $(DIRS) $(TARGET)
$(DIRS):
@if not exist $@\nul mkdir $@
$(TARGET): $(OBJS)
$(LINK) -out:$@ $(LINK_FLAGS) $(OBJS)
{$(SRCDIR)\}.cpp{$(OBJDIR)\}.obj:
$(CPP_COMPILE) $(CPP_FLAGS) -c $<
$(OBJDIR)\abc.obj: $(INCDIR)\abc.h
$(OBJDIR)\def.obj: $(INCDIR)\def.h
>>125 >$(LINK) -out:$@ $(LINK_FLAGS) $(OBJS)
-out:が思いっきり依存しちゃってるので、CPP_COMPILEとか定義する意味がない
>$(OBJDIR)\abc.obj: $(INCDIR)\abc.h
>$(OBJDIR)\def.obj: $(INCDIR)\def.h
これがかなりイマイチと感じる。
127 :
デフォルトの名無しさん :02/09/15 12:04
>>125 その Makefile まともに動かないような気がするんですが,
MS か Borland の make ではちゃんと動くんですか ?
GNU make では意図したとおりに動かないですよねえ ...
気のせいかな.
ほれ。検証しとらんがこんなもんだろ。gmake 版ね。 BINDIR = bin OBJDIR = obj SRCDIR = src INCDIR = include COMPILER = cl TARGET = $(BINDIR)/app.exe OBJS = $(addprefix $(OBJDIR)/, abc.obj def.obj) all: $(TARGET) $(TARGET): $(OBJS) <TAB> $(COMPILER) $(LDFLAGS) $^ -o $@ $(OBJDIR)/%.obj: $(SRCDIR)/%.cpp <TAB> $(COMPILER) $(CFLAGS) -c $< -o $@
>>128 検証しました。
makefile 的にはあっている模様ですが、当方の cl.exe (VC6SP5)が
-c オプション(コンパイルオンリー) を指定した場合、
-o でディレクトリを指定しても無視されて、全部カレントに吐き出す為
だめぽになっています。
あと
TOUCH = touch
で
$(SRCDIR)/%.cpp: $(INCDIR)/%.h
<タブ> $(TOUCH) $@
は書き忘れでしょうかね。
なるほど pattern rule は suffix rule と違って, ディレクトリ指定が できるのがいいですね. いままで使用する make にかなり依存するので避けてたんですが. ちなみに Linux の GNU make, Solaris の make では OK, IRIX, FreeBSD の make ではだめでした.
ちゃうわ、cl.exe の出力ファイル指定オプションは -Fo やった。 これで VC + gmake 使いの皆さんはハッピーになれますか? BINDIR = bin OBJDIR = obj SRCDIR = src INCDIR = include COMPILER = cl TOUCH = touch TARGET = $(BINDIR)/app.exe OBJS = $(addprefix $(OBJDIR)/, abc.obj def.obj) all: $(TARGET) $(TARGET): $(OBJS) <豚>$(COMPILER) $(LDFLAGS) $^ -o $@ $(OBJDIR)/%.obj: $(SRCDIR)/%.cpp <豚>$(COMPILER) $(CFLAGS) -c $< -Fo./$@ $(SRCDIR)/%.cpp: $(INCDIR)/%.h <豚>$(TOUCH) $@
>>130 > IRIX, FreeBSD の make ではだめでした.
gmake は入ってませんか? なけりゃインストールしちゃいましょう。
わたしゃ、もう、gmake 以外は使えない体になってしまいますた。
>>131 > $(SRCDIR)/%.cpp: $(INCDIR)/%.h
> <豚>$(TOUCH) $@
あまり見かけないやりかたですね。cl には gcc の -M オプションみたいのは
ないのかな?
134 :
デフォルトの名無しさん :02/09/15 21:12
cygwin を使っているのですが、makefile 中で cd Dir pwd と書いたとき、pwd が Dir に移動していない時のディレクトリを返してきます。 これは通常動作なのでしょうか?
通常動作。各行は、(おそらく) system によって実行されている。
通常動作です. make は 1 行ごとにコマンド行を解釈して shell を呼び出すような 動作をします. hoge : fuga <tab>cd Dir; \ <tab>pwd でお望みの動作が得られると思います.
>>135-136 なるほど、各行で独立して実行されるイメージなのですね。
ありがとうございました。
Makefile中でヒアドキュメントを使えますか? cat <<EOF any message EOF ってのをMakefileでやりたいのですが、tabをいれたりとかいろいろやってもうまくいきませんでした。 1行ずつechoするしかないんでしょうか。
\
>>139 それがうまくいかないんです。多分使い方が間違っていると思うんですけど。
target:
[TAB]cat <<EOF \
[TAB] hoge hoge \
[TAB]EOF
target:
[TAB]cat <<EOF
[TAB] hoge hoge \
[TAB]EOF
こんなのは試しました。
depend: makedepend -- $(FLAGS) -- $(ALL_C_FILES)
ヒアドキュメントはあまり使わないので詳しくないのですが. もし sh 上で 1 行でヒアドキュメントが使えれば, make でも使えるかも しれません ... が, 私にはできないように思います.
<<EOFが不要なんじゃ target: [TAB]cat \ [TAB] hoge hoge
>>143 here documentって知ってる?
>>145 返事が遅れてゴメンなさい。
all:
[TAB]cat <<EOF;\
[TAB]hoge hoge \
[TAB]EOF
として試してみましたが、
/bin/sh: hoge: command not found
と出ました。
# 仕方無いのでechoで頑張りますた。
Eiffel イイ!!
あげちゃったわけでつか。 あげちゃったわけでつか。 あげちゃったわけでつか。 あげちゃったわけでつか。 あげちゃったわけでつか。 あげちゃったわけでつか。 あげちゃったわけでつか。 あげちゃったわけでつか。 氏ねよ、クソが。
150 :
デフォルトの名無しさん :02/10/23 16:26
下のコメントのようなことがしたくて悩んでいるんですが、 どうすればいいでしょうか? お知恵を貸してください DATAFILES1 = a.dat b.dat DATAFILES2 = c.dat d.dat OFILES = $(DATAFILES1:.dat=.o) $(DATAFILES2:.dat=.o) %.o : %.dat # DATAFILE1のファイルは, objcopy -XXXX $< $@ # DATAFILE2のファイルは, objcopy -YYYY $< $@
OFILES1 = $(DATAFILES1:.dat=.o) OFILES2 = $(DATAFILES2:.dat=.o) # DATAFILE1のファイルは, objcopy -XXXX $< $@ $(OFILES1): %.o : %.dat objcopy -XXXX $< $@ # DATAFILE2のファイルは, objcopy -YYYY $< $@ $(OFILES2): %.o : %.dat objcopy -YYYY $< $@
>>151 そんな記述ができるんですね。
すごく勉強になります。
ありがとうございます。
>>151 それ知らなかった。info make見ても見つけられなかったんだが、どこに書い
てある?
static pattern rules のところに書いて歩けど。
あ、もちろん GNU Make の話ね。
>>154 ほんとだ。tnx
ふしあなさんだったよ。
HSP使えばいいのに
VB のためなら死ねる!!
static pattern rules のところに書いて歩けど。
■『C と C++ とが混在した Makefile で makedepend を使うには?』[1/2]
初めまして。宜しく御願い致します。
まず,私は Makefile に関してはかなり未熟者のレベルです。
必要に応じてウェブ上で検索しては知識を付けている段階です。
さて,止むを得ない事情で,
*.h *.c *.cpp という,C と C++ とが混在した Makefile でプログラム開発中です。
makedepend を導入したいと思い,
ウェブ上で検索した幾つかの入門ページを参考にしつつ,――
TOP = /usr/local/test
INCDIR = $(TOP)/../common/include -I$(TOP)/include
SRCS = aaa.c bbb.c
SRCSXX = xxx.cpp yyy.cpp
OBJS = $(SRCS:.c=.o)
OBJSXX = $(SRCSXX:.cpp=.o)
CFLAGS = -O3 -Wa,-al -fno-common -G0
CXXFLAGS = -O3 -Wall -Werror -Wa,-al -fno-exceptions -fno-common -G0 -ansi
.SUFFIXES: .o .s .dsm .c .cc .cpp
depend:
makedepend -I$(INCDIR) -- $(CFLAGS) -- $(SRCS) 2>/dev/null
makedepend -a -I$(INCDIR) -- $(CXXFLAGS2) -- $(SRCSXX) 2>/dev/null
――(一部抜粋 & ファイル名は例示用)の様に Makefile を書き直し,
途中までは意外と(?)順調に導入が進んだのですが…。
(▼
>>161 に続く…… ▼)
161 :
デフォルトの名無しさん :02/11/25 15:21
make!
■『C と C++ とが混在した Makefile で makedepend を使うには?』[2/2]
(▲ ……
>>160 からの続き ▲)
(※ 先に
>>161 に割り込まれてしまいました…。スミマセン…。)
やっと,導入完了と思って make depend と実行してみたところ,
Makefile 中には――
# DO NOT DELETE
aaa.o: def4c.h aaa.h
bbb.o: def4c.h bbb.h
xxx.c.o: def4cpp.h xxx.h
yyy.c.o: def4cpp.h yyy.h
――の様に自動生成されてしまいました。
勿論,正しくは――
# DO NOT DELETE
aaa.o: def4c.h aaa.h
bbb.o: def4c.h bbb.h
xxx.o: def4cpp.h xxx.h
yyy.o: def4cpp.h yyy.h
――となって欲しいところなのですが,
ウェブ上で検索して出てくる典型的なサンプルは *.c しか前提にしてない様で,
一体どうやれば良いのかさっぱりわかりません。
もしかして,makedepend 自体が C++ には対応してないのでしょうか…?
どうぞ御教授下さい。
正解そのものが無理なら,より適切な調べ方(検索方法)だけでも,御願い致します。
※ 以上で情報不足の場合は,
例えば Makefile の一部抜粋等々,今後追加書き込み致します。
使ってる makedepend が腐ってるんじゃないのかなぁ? 1) 新しいやつをインストールしてみるか 2) gcc/g++ -MM オブションを使うか 3) | sed -e 's/\.c\.o/\.o/' をかますか してみては。
>>163 さん,早速レス有り難う御座います。
周りの人に訊いても,自力で色々検索しても,サッパリわかんなかったんで,
こうして何かレス頂けると,ホント嬉しいです。
makedepend が腐ってるっスか…。う〜ん…。
man 見ても,makedepend のバージョン表示する為のオプションって
見当たらないですよねぇ。(困)
えぇと…,取り敢えず「3) | sed -e 's/\.c\.o/\.o/' をかます」って,
具体的にどこにどう記述すればいいんでしょうか?
>>160 > .SUFFIXES: .o .s .dsm .c .cc .cpp
この行消してみるとどうなる?
「かなり適当」こと
>>165 さん,只今やってみましたが――
――やっぱりダメでした…。
自動生成内容に,何も変化は起こりませんでした。
そういえば,自分で試行錯誤してた際も,この行を色々と書き換えてみたけど,
結果に何等変化が無かった記憶が…。
てゆーか,そもそもこの行,そんなに必要な行なんですかねぇ…??
一応,サンプルなぞを真似つつ,取り敢えず付けてあるだけな感じなんですけど。
仮に全く無くしたりすると,具体的にどんな不都合が…?
そうか、makedepend って、Makefile を直接書き換えちゃうのか。 とすると、makedepend をした後に、 sed -e 's/\.c\.o/\.o/' Makefile > Makefile.new mv Makefile Makefile.bak mv Makefile.new Makefile とかやってみては。 ちなみに、オレだったら、GNUMakeが前提だけど depend: makedepend -fdepend.mf -I$(INCDIR) -- $(CFLAGS) -- $(SRCS) makedepend -f- -I$(INCDIR) -- $(CXXFLAGS2) -- $(SRCSXX) | sed 's/\.c\.o/\.o/' >> depend.mf -include depend.mf とやるかな。つまり、依存関係は別ファイルに書き出して、それを Makefile にインクルードさせる。
度々アドバイス有り難う御座います。>
>>163 (=
>>167 )さん
いや,
>>163 で書いてあった「3)」の,(パイプで)「かます」っていうのが,
Makefile 中のどこにどんな風に記述したらいいのか謎だったんです。
取り敢えず,
>>167 前半のやり方で,一応目的の内容の Makefile は得られますね。
もしかしたら,もっとスマートなやり方が有るのかも知れませんけど。
(コマンドライン複数行分を何等かのスクリプトファイルにしちゃうとか…?)
>>167 後半のやり方は,今から早速勉強させて頂きます。
某 Visual 何たらの統合環境の“全自動”に甘やかされて育つと,
いざという時に弱々だなーと,思い知らされてるトコでして…。
今回は,色々と教えて下さって,有り難う御座います。
もしかしたら,今後また別件でマヌケな質問してしまうかも知れませんけど。(汗)
普通のmakeだったら.dependってファイルに依存関係吐き出しとけば 勝手に読み込んだりしないかな?FreeBSDのmakeはそうだったけど。 .dependをつくるmkdepなんてコマンドもある。 -aオプションをつけると追加書き込みもしてくれるみたい。
170 :
デフォルトの名無しさん :02/11/26 14:17
どこのmakedependだか知らないけど、Xに付いてるやつなら、 大昔からC++には対応しているはずだけどなあ。 どうせそんなmakedependなら、sedで逃げても、まともに C++の構文読んでくれなかったり、__cplusplusが定義されて いなかったりするんじゃないのか? まともなmakedepend入れた方がいいよ。 gccmakedepなら-MMとか使えるし。
>>170 さん
gccmakedep なんて在ったんですね。知りませんでした…。
で,
>>160 の makedepend を単に gccmakedep に置換してみたところ,
あっさり,*.c.o の問題は解決しました!
まずは,有り難う御座います。>
>>170 さん
ところが,別の問題が…。
makedepend の生成してくれた依存関係は,
ホントに漏れ無く書き出してある感じだったんですけど,
gccmakedep の生成してくれる依存関係は,
パッと見ただけで,明らかに不足気味なんですよ。
例えば,何十個も在るソースファイル中に,
test1.cpp test2.cpp test3.cpp というのが在ったとすると,
当然,test1.o test2.o test3.o それぞれに
依存関係の在るヘッダファイル *.h を書き出してあるべきですけど,
gccmakedep の生成する依存関係って,
例えば test1.o と test3.o とに関しては書き出してあっても
なぜか test2.o に関しては何も書き出してなかったりとか。
勿論,test2.cpp から何も #include してないなんて事はありません。
う〜ん,まさに一難去ってまた一難。
ifdefの関係でincludeされないようになっているとか。 -DXXXは基本的にコンパイル時と同じように設定しないとダメ。 あと、インクルードパスが通っていないのかも。多分C++の 標準インクルードパス(/usr/include/g++とか)は自分で追加 する必要があると思う。 それでダメなら、根本的に環境がおかしいのかなあ。gccmakedep が入っているからにはXが入っているんだろうけど、X11R5だったり、 gccがegcsよりさらに昔のだったりしないか?あるいは、gcc向け でなく、別のコンパイラ向けにソースを書いているのに、gccmakedep を使おうとしているとか。
>>173 さん
前半で御指摘の「includeされない」「パスが通っていない」云々は,
まず無いと思うのですけど…。
理由は,
>>172 に書いた通り,
「
>>160 の makedepend を単に gccmakedep に置換してみた」だけだからです。
つまり,makedepend の方を使えば,当初の謎だった「*.c.o の問題」以外は,
全てうまくいってました。
また,もし #ifdef がらみで #include されてなかったとすると,
宣言無しで暗黙に使おうとした云々と,コンパイル時にエラーが出ると思います。
やはり後半で御指摘の「根本的に環境がおかしい」んですかねぇ…。(困)
OS は RedHatLinux 7.1,コンパイラは GNUC 2.96(= GNUC++ 2.96),
makedepend も gccmakedep も /usr/X11R6/bin/ というパスに在ります。
じゃあ、処理速度は遅くなるけど、gcc/g++ の -M(または-MM)オプションを
使ってみたらどうかな。こいつは依存関係を標準出力に出すので、
リダイレクトしてファイルに落とす。そして、
>>167 みたいに
-include でインクルードしてやればよい。Linux ということは gmake を
使ってるわけだよね?
>>174 > やはり後半で御指摘の「根本的に環境がおかしい」んですかねぇ…。(困)
> OS は RedHatLinux 7.1,コンパイラは GNUC 2.96(= GNUC++ 2.96),
> makedepend も gccmakedep も /usr/X11R6/bin/ というパスに在ります。
rpm -qf /usr/X11R6/bin/{makedepend,gccmakedep}
の結果は?
>>175 さん
私も,
>>167 さんが後半で書かれてた方法が一番良さそうに思えたんで,
gcc の man とか色んな関連ウェブページとか見ながら,習得中です。
(スミマセン。発展途上なもんでして…。)
ちなみに,make も gmake も /usr/bin/ というパスに在って,
使ってるのは一応 gmake の方なんですけど,試しに make の方に変えてみても,
(少なくとも気付いた範囲内では)結果は何も変わらない様です。
>>176 さん
rpm -qf /usr/X11R6/bin/{makedepend,gccmakedep} してみたら,――
XFree86-devel-4.0.3-5
XFree86-devel-4.0.3-5
――と出てきました。
ゴメンナサイ。rpm というモノ自体,
>>176 を読んで今初めて知った次第で…。(汗
なるほど,「rpm is a powerful package manager」ですか。
でも,その前に使う人が powerful に成長しないと,宝の持ち腐れですね…。(自嘲
>>177 > XFree86-devel-4.0.3-5
もう4.2.1とか出てるのでバージョンを上げてみては。
全部上げるのがいやなら、
rpm -Uvh --excludepath /usr/X11R6/lib --excludepath /usr/X11R6/include \
--excludepath /usr/X11R6/man ${XFree86develRPM}
とか、
cd /
rpm2cpio ${XFree86develRPM} | cpio -i usr/X11R6/bin/{makedepend,gccmakedep}
とか。
179 :
デフォルトの名無しさん :02/11/28 00:42
>>178 さん
[mina@localhost mina]$ rpm -Uvh --excludepath /usr/X11R6/lib --excludepath /usr/X11R6/include --excludepath /usr/X11R6/man ${XFree86develRPM}
rpm: インストールのためのパッケージがありません
[mina@localhost mina]$ cd /
[mina@localhost /]$ rpm2cpio ${XFree86develRPM} | cpio -i usr/X11R6/bin/{makedepend,gccmakedep}
error: read failed: Success (0)
error reading header from package
cpio: premature end of archive
[mina@localhost /]$
――な感じでした。だめぽ…?
いや,そもそもシス管に訊けとかインストールした人に頼めとか,
心中でツッコみながら私の書き込み読んでる方々も少なくないと思うんですけど,
この環境構築した人自体が,雑誌とか入門書とかと首っ引きで何とか構築したとゆー,
ある意味“発展途上”な人なもんで…。(勿論,私よりは“上”ですけど。)
>>164 で「周りの人に訊いても――(中略)――サッパリわかんなかったんで」
と書いたのは,そんな訳だったんです。(類は友を呼ぶ…?)
>>179 さん
あっ,その "autodep" って,色々 Google 検索してた中で見た記憶が…。
リンク先あちこち紫色になってるし。
コレって,一企業(株式会社ハッピーサイズ)が御厚意で無償提供して下さってる,
一フリーソフトですよね?
ですから,あまり標準的・一般的じゃないユニークなモノに
最初っから頼りきっちゃうと,後々何かマズいかなーとか,
(折角習熟してもツブシが利かないとか…?)
何と無く思ってしまって,初めて見た時はそのまま流してしまってました。
やっぱ,いいですか。"autodep"。
後でダウンロードして,ちょっと試してみますね。
情報,有り難う御座います。
>>180 > [mina@localhost mina]$ rpm -Uvh --excludepath /usr/X11R6/lib --excludepath /usr/X11R6/include --excludepath /usr/X11R6/man ${XFree86develRPM}
> rpm: インストールのためのパッケージがありません
> [mina@localhost mina]$ cd /
> [mina@localhost /]$ rpm2cpio ${XFree86develRPM} | cpio -i usr/X11R6/bin/{makedepend,gccmakedep}
> error: read failed: Success (0)
> error reading header from package
> cpio: premature end of archive
${XFree86develRPM}はDLしてきたXFree86-develのRPMパッケージのパス名。
(余裕ができたら)UNIX関連の入門書を嫁。
gcc -MMしろ
186 :
デフォルトの名無しさん :02/12/10 16:07
下のように、複数のターゲットがある依存関係でコマンドに引数が必要な場合 どう記述したらよいのでしょうか? $(AFILES) file1.a file2.a file3.a $(BFILES) $(AFILES:.a=.b) $(CFILES) $(AFILES:.a=.c) %.b %.c : %.a $(CMD) -o1 file1.b -o2 file1.c file1.a $(CMD) -o1 file2.b -o2 file2.c file2.a …
>>1 中身はまだ読んでないけど、スレタイ気に入った。w
書き忘れましたが、GnuMakeです。
189 :
デフォルトの名無しさん :02/12/10 16:12
.,, \ヽ--___ \ 丶---ヽ___ .゙\ ク ~~> クソスレに認定されました \ ソ / .\ ノ \ / .\/ .\ \ .\ ,,\ .″ ゙》 __., イ,, 》li,_ ill! i;l;lllllz,lll;lllllll;lllllly .:llllllll;llllllllllll;;ll;||llllllllll} .il||l|lllllllllllllll|《lllll|lly《アlz .、 zz,、 ._ノレ;llllllll|;llllllliilllllllllllllllllllllyuyll;ミミ″ .''゙゙∨ 」lllllllllllllllllllllllllllllllllllllllllll ゙巛,厶yyv》llll! {lllllllll厂lllllllll|》lllllllllllllllly、 ,illllllllllllllllli;;ll|y .、.,,_ 《;|《llllll;lllli;llllllll;|lllllllllllllllllll|lli. .zllllllll;《lll|《lllllllllllllllizy,lllz. _yyyyr|》 ,u,,_ .rlllllllllllllllllllllllllllllll厂リllllリlll!,」llllll「リll;lllllll;;llllllllllllllllllll;||lllllllllllllll;lllllllll l;lll;l;yu.,,lllz:.;..:villlllllllllllllllllll|》llllllll| uilllll|illlllノ|ll|゙」zyllllll;ll|;lllllllllll;l|リllllllllllll;llllllllllllllllllll lll|!illlllllllll|ll|i;llllllllllllllllllllllllllllilllllllllllllllllllllllllllllll|lllll|,|lllllllllllllll|》;ll《|「.vuilllll|《liiilll|フ《llllllll lllllllllllllllllllllllll|《lllllllllll;;llllllllllllllll;llllllllllllllllllllll|)|《;lllllllllllllllllllllllllllllllll;lll;lllll;》([;lllllllllllllllllll
make makes me mad.
IP記録実験
http://qb.2ch.net/test/read.cgi/accuse/1042013605/ 1 名前:ひろゆき ◆3SHRUNYAXA @どうやら管理人 ★ 投稿日:03/01/08 17:13 ID:???
そんなわけで、qbサーバでIPの記録実験をはじめましたー。
27 名前:心得をよく読みましょう 投稿日:03/01/08 17:20 ID:yL/kYdMc
SETTING.TXT管轄でないということは全鯖導入を視野に、か?
38 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:22 ID:rLfxQ17l
>>27 鋭いです。
73 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:27 ID:rLfxQ17l
>ところで、IPが抜かれて何か今までと変わることってあるのでしょうか?
・今までより、サーバが重くなる。
・裁判所や警察からの照会があった場合にはIPを提出することがある。
>>598 訴えられても「誣告ですよ」と返せる様にソース固めて叩きゃ良いじゃん。
荒らさなきゃ良いじゃん。
職場、学校、座敷牢から気兼ねなく書き込みでける ってゆってたのにー プンスカ!!
197 :
デフォルトの名無しさん :03/01/09 14:50
最高裁への上告は認められなくなったから、これで事実上判決確定だよ。
逆転も何もないって。
勢いで上告なんかしても一発で上告却下(門前払い)だよ。
二審も一審を支持。これに対して上告しようにも、
刑事訴訟と同様、自由に上告できるってもんでもないのです。
民事訴訟法312条 (上告の理由) 1項
「上告は、判決に憲法の解釈の誤りがあること
その他憲法の違反があることを理由とするときに、することができる。」
http://www.m-net.ne.jp/~doba/goto/hon.htm ようするに上告しても今の制度では100%無駄。 これで完全終了ってことか。
======2==C==H======================================================
2ちゃんねるのお勧めな話題と
ネットでの面白い出来事を配送したいと思ってます。。。
===============================読者数: 138720人 発行日:2003/1/9
年末年始ボケがそろそろ収まり始めた今日このごろのひろゆきです。
そんなわけで、年末に予告したIP記録ですが実験を開始しています。
「2ちゃんねる20030107」
こんな感じで各掲示板の最下部に日付が入ってるんですが、
20030107以降になってるところはログ記録実験中ですー。
んじゃ!
────────────────────────Age2ch─
■この書き込みは、Age2chを使って配信されています。
────────────────────────────
Keep your thread alive !
http://pc3.2ch.net/test/read.cgi/software/1041952901/l50 ────────────────────────────
>736 らしいね ID:WcTtLBwB も少しまとめてレスする癖付けれ
マンコとかきまくれるのは2chだけ!!ということに変わりはない
色々、俺を過大評価してる様ですが (現時点で全世界規模のインテリ層に私がシンパいるとか 笑 ありえないって。) 俺一人で突き進む事が基本なんですが(てか十分。命だけ足りないけど。) そういった事は、貴方方には大きいけど俺には小さいです。 「人生」ってありますね。 私が直接的な報復手段を選ばずに我慢したのもそういった理性があるからです。 「目先で」シャレにならない、からです。 大体察しているでしょう。 では5分後か昼に掛けます。
メルマガまだ?
最高裁への上告は認められなくなったから、これで事実上判決確定だよ。
逆転も何もないって。
勢いで上告なんかしても一発で上告却下(門前払い)だよ。
二審も一審を支持。これに対して上告しようにも、
刑事訴訟と同様、自由に上告できるってもんでもないのです。
民事訴訟法312条 (上告の理由) 1項
「上告は、判決に憲法の解釈の誤りがあること
その他憲法の違反があることを理由とするときに、することができる。」
http://www.m-net.ne.jp/~doba/goto/hon.htm ようするに上告しても今の制度では100%無駄。
これで完全終了ってことか。
(;´(Å)`) <・・・。
電気店のパソコン売り場から2ちゃんにカキコする奴が増えるんだろうなあ
(・∀・)クスクス
何が変わるんですか。
>書き込みの質があがるんでつか 質の低い書きこみが減って、結果的に質の平均があがるのではないかと、、、
実験
我ながら好き勝手にほざいてしまいますた・・(汗 もし実現しても回線細そうですしね。。。
公人と私人の違いってやつ 俺は嫌いだけどねこの分け方
======2==C==H======================================================
2ちゃんねるのお勧めな話題と
ネットでの面白い出来事を配送したいと思ってます。。。
===============================読者数: 139038人 発行日:2003/1/10
なにやら、連日メルマガだしてるひろゆきです。
そんなわけで、ログ記録実験ですが、いちいちサーバ指定するのが面倒なので、
全部のサーバに入れてみました。
重くなって落ちたりしてもご愛嬌ってことで。。。
んじゃ!
────────────────────────Age2ch─
■この書き込みは、Age2chを使って配信されています。
────────────────────────────
Keep your thread alive !
http://pc3.2ch.net/test/read.cgi/software/1041952901/l50 ────────────────────────────
ひろゆきが嫌韓に否定的なのを忘れているようで。 IPを総連に売られたら、どうなると思う?
死ねよ馬鹿ども
まぁお前、素人は無難な書き込みしてなさいってこった。
人生をゲームにしちまったひろゆきはオレより3倍バカ バカになりきるのは(人間として)難しい
2ちゃん閉鎖したら、他のインターネット掲示板が荒れたり、DQNな事件が増える
逆に立てて欲しくなかったんだが(w
おう、おめーら。 まあな、今年は俺の年なわけだがどうよ? っていうかなぁ、俺の毛毟り取るのはまあ、許してやるよ。 メシくわせてもらってるからな。 でもな、紙とか食わせるのはマジで勘弁してくれよ。 俺ァな、山羊じゃねぇんだよ。 あんなひつじの出来そこないと一緒にしないでくれよ。 だって山羊だぜ、山羊。 俺なんか十二星座ってだけじゃなくて干支でもあるんだよな。 だけど、山羊見ろよ、山羊。 黄金聖闘士(ゴールドセイント)止まりだぜ? あんなのと一緒にしてもらいたかぁーねーよな。 っていうか、俺を殺せるもんならやってみろよ。 俺はいつどこでも誰の挑戦でも受けるぞ?
日本人・日本在住・男・童貞 ここまではIPから特定しますた。
ななも殺人教唆で逮(ry
どこがどう恥ずかしいんだい? それを説明しないお前は説得力ゼロだが。 加えて君の無能さも証明しているな。
それは単に業者への制裁措置じゃ?
通ることもあるわな。 「見なかった」といわれて終わるのは証明の問題であって実体の問題ではない。
あった
(^^)
ワラタ
(^^)
(^^)
あ、もちろん GNU Make の話ね。
232 :
デフォルトの名無しさん :03/01/31 20:12
make age
頼むからMakefileにmake love仕込んでソース収めるのやめて。
235 :
デフォルトの名無しさん :03/02/07 23:40
たくさんサブディレクトリがあるとしてのお話です。 DIR_LIST:=たくさんサブディレクトリ ARC_LIST:=$(addsuffix /lib.a,$(DIR_LIST)) さて、このARC_LISTを、それぞれのディレクトリ内のすべての.oファイルから作るとして、 はじめに思いついたのが、 $(ARC_LIST) : %/lib.c : $(wildcard %/*.o) というやつだったのですが、このwildcardの中の%がどうやら展開されないようです。 foo/lib.c : $(wildcard foo/*.o) こうすれば一応依存関係は作れるんですが、DIR_LISTはmakeが起動されるまでわかりません。 なんか解決法はないですか?
236 :
デフォルトの名無しさん :03/02/08 01:49
>>235 ARC_RULE:=$(DIR_LIST:%=.%.arc_rule)
.%.arc_rule:
@echo '$*/lib.a: $$(wildcard $*/*.o)' > $@
@echo ' $$(AR) $$(ARFLAGS) $$@ $$?' >> $@
clean::
rm -f $(ARC_RULE)
include $(ARC_RULE)
237 :
デフォルトの名無しさん :03/02/08 01:57
>>235 まちがいがあったので修正版。
ARC_RULE:=$(DIR_LIST:%=.%.arc_rule)
.%.arc_rule:
@echo '$*/lib.a: $$(wildcard $*/*.o)' > $@
@echo ' $$(AR) $$(ARFLAGS) $$@ $$?' >> $@
clean::
rm -f $(ARC_RULE)
ifneq ($(MAKECMDGOALS),clean)
include $(ARC_RULE)
endif
>>236 あーいっこづつ別のファイルに出せばいいんですね。
そういうやつを一個のファイルに出してみて、「いける?」とか思って、
「あーでもこのファイル更新するタイミングがわからん」とか思ってあきらめてました。
いけそうですね。まだ試せないけど。ありがとーデス。
>>235 期待通りの動作になるかもしれませんが、wildcardで
全部アーカイブにするのは作り方としてよくないとおもいます。
(ソースコードを生成するためのプログラムのオブジェクトまで
拾ってしまう可能性がある。)
lib.aにするところまでサブディレクトリのMakefileで記述したほうが
いいとおもいます。
>>239 > (ソースコードを生成するためのプログラムのオブジェクトまで
> 拾ってしまう可能性がある。)
それはまた別のディレクトリにすべきなんじゃないの?
> lib.aにするところまでサブディレクトリのMakefileで記述したほうが
> いいとおもいます。
ともあれこれには同意。
> lib.aにするところまでサブディレクトリのMakefileで記述
そうした場合には、ディレクトリの数だけ無条件でmakeを起動してしまうわけですよね。
実は、なんとかそれを避けれないかということで、いろいろやって
>>235 のようになったのですよ。
>そうした場合には、ディレクトリの数だけ無条件でmakeを起動してしまうわけですよね。
>実は、なんとかそれを避けれないかということで、いろいろやって
>>235 のようになったのですよ。
ライブラリの元になるオブジェクトはいつ作るのでしょうか?
wildcardでマッチさせようとしているので、makeを起動する前にすでに
オブジェクトができているはずです。だとしたけ結局makeを
複数回起動しているのでは?
>>242 あ、すんません、実際にwildcardをかけるのは.cとかなんですよ。
foo/lib.c : $(patsubst %.c,%.o,$(wildcard foo/*.o))
ってな感じです。wildcardが適用されない問題に絞るために端折ってました。
235で$(wildcard foo/*.o)の部分は$(wildcard foo/*.c)でしょうね。 237の一部差し替え。 .%.arc_rule: @echo '$*_SRC:=$$(wildcard $*/*.c)' > $@ @echo '$*_OBJ:=$$($*_SRC:%.c=%.o)' >> $@ @echo '$*/lib.a: $$(*_OBJ)' >> $@ @echo ' $$(AR) $$(ARFLAGS) $$@ $$?' >> $@
しまった。また間違いがありました。 .%.arc_rule: @echo '$*_SRC:=$$(wildcard $*/*.c)' > $@ @echo '$*_OBJ:=$$($*_SRC:%.c=%.o)' >> $@ @echo '$*/lib.a: $$($*_OBJ)' >> $@ @echo ' $$(AR) $$(ARFLAGS) $$@ $$?' >> $@ @echo 'clean::' >> $@ @echo ' rm -f $$($*_OBJ)' >> $@
>>236 質問!
> ARC_RULE:=$(DIR_LIST:%=.%.arc_rule)
っていったい何をやっているの?
上手くいきましたよ。
さて、後はソースファイルが削除されたときの・・・。
>>247 ARC_RULE:=$(patsubst %,.%.arc_rule,$(DIR_LIST))
↑の、ちょっと短く書ける書式。
>>248 あ、そっか。ふだんはこの書き方を使わないから悩んじゃったよ。ありがと。
>>248 こんなんでどうよ。
.%.arc_rule:
@echo '$*_SRC:=$(wildcard $*/*.c)' > $@
@echo '$*_OBJ:=$$($*_SRC:.c=.o)' >> $@
@echo '$*/lib.a: $$($*_OBJ)' >> $@
@echo ' $$(AR) $$(ARFLAGS) $$@ $$?' >> $@
@echo 'ifneq($*_SRC,$$(wildcard $*/*.c))' >> $@
@echo '$@: .force' >> $@
@echo 'endif' >> $@
@echo 'clean::' >> $@
@echo ' rm -f $$($*_OBJ)' >> $@
.PHONY: .force
>>250 > ifneq($*_SRC,$(wildcard $*/*.c))
ぱっと見、これが常に偽になりそうです・・・。
> $@ : .force
これは、$*/lib.a : .force ですかね。
ちょっと修正して、こんな感じになるかなぁ?(↓見やすくするための擬似表記です)
$*_SRC:=$(wildcard $*/*.c)
$*_OBJ:=$($*_SRC:.c=.o)
$*/lib.a : $($*_OBJ)
ifneq($*_OBJ,$(wildcard $*/*.o))
$*/lib.a : .force
endif
だめだ、対応するソースの無くなった.oを消さなきゃ。
253 :
デフォルトの名無しさん :03/02/12 00:38
>>251 > > ifneq($*_SRC,$(wildcard $*/*.c))
> ぱっと見、これが常に偽になりそうです・・・。
なんで? $*_SRCと右の$(wildcard $*/*.c)はワイルドカードが展開されるタイ
ミングが違うはずだが。
> > $@ : .force
> これは、$*/lib.a : .force ですかね。
ちがう。ソースが追加/削除されたら.arc_ruleを書き換えたいんだろ?
>>254 ごめんなさい。完全に勘違いしてました。
試させてもらいました。
ソースを削除したとき、.arc_ruleは更新されますが、
lib.aの中に削除されたソースから生成した.oが含まれたままになってしまい、
リンク時に有効な.oファイルとして認識されてしまいます。
削除されたソースファイル名を認識して、対応する.oファイルを削除し、
lib.aからも削除するようにしないいといけないのですが、
既に存在しないファイルに対してmakeがアクションをおこすような指示をどう書けばいいのかが
思いつきません。
>>255 そうなるとたしかに$*/lib.aは強制的に作り直さなきゃだな。
@{ \
echo '$*_SRC:=$(wildcard $*/*.c)'; \
echo '$*_OBJ:=$$($*_SRC:.c=.o)'; \
echo '$*/lib.a: $$($*_OBJ)'; \
echo ' @rm -f $$@'; \
echo ' $$(AR) $$(ARFLAGS) $$@ $$?'; \
echo ' $$(RANLIB) $$@'; \
echo 'ifneq($*_SRC,$$(wildcard $*/*.c))'; \
echo '$@ $*/lib.a: .force'; \
echo 'endif'; \
} > $@
>>256 そいつだと、%.arc_ruleが作り直された段階で
$*/lib.a: .force の関係がキャンセルされてしまうみたいです。
なので、%.arc_ruleの出力時に$*/lib.aを削除するようにしました。
最終的にはこのようになりまして、(↓全角スペースがタブのかわり)
.PHONY : .force_update
$(ARC_LIST) : %/lib.a :
$(AR) $(ARFLAGS) $@ $?
ARC_RULES:=$(addsuffix /.arc_rule,$(DIR_LIST))
$(ARC_RULES) : %/arc_rule :
@{ \
echo '.$*_SRC:=$(wildcard $*/*.c)' ;\
echo '.$*_OBJ:=$$(.$*_SRC:.c=.o)' ;\
echo '$*/lib.a : $$(.$*_OBJ)' ;\
echo 'ifneq ($$(.$*_SRC),$$(wildcard $*/*.c))' ;\
echo '$@ : .force_update' ;\
echo 'endif' ;\
} >@ ;\
$(RM) -f $*/lib.a
include $(ARC_RULES)
動作は良好です。
ソースの追加、削除、引越しを完全に追跡してくれます。
快適です。
助言くださったみなさま、ありがとうございました。
優良スレage
258 :
デフォルトの名無しさん :03/02/14 01:32
SRCS=`find *.c` INCS=`find *.h`
>>257 >
>>256 > そいつだと、%.arc_ruleが作り直された段階で
> $*/lib.a: .force の関係がキャンセルされてしまうみたいです。
> なので、%.arc_ruleの出力時に$*/lib.aを削除するようにしました。
$*/lib.aを%.arc_ruleに依存するようにするのはどうよ。
>>259 対応するソースの無くなったオブジェクトがlib.aに残る問題を考えると、
あのタイミングで削除してしまったほうが効率もよく、すっきりします。
261 :
デフォルトの名無しさん :03/02/23 00:46
Makefileを手書きしたいのですがSolaris, Linux(Redhat, Debian), CygwinをMakefile内で自動判別する方法はないですか?
環境変数OSTYPEはだめか?
>>262 OSTYPEでうまくいきそうですがLinuxは両方linux-gnuになってしまいます。
setやenvにはディストリビューションの情報はなさそうです。
両者の区別は可能ですか?
>>263 サポートしているモノのうちのひとつを引数で受け取る仕様に汁。
Linux,CygwinではGNUmakefileをつくって、その中で SYSTEM := $(...) # ディストリビューションを見分けるプログラムを呼ぶ。 include Makefile
>>265 > SYSTEM := $(...) # ディストリビューションを見分けるプログラムを呼ぶ。
しまった。$(shell ...)ね。
(^^)
∧_∧ ( ^^ )< ぬるぽ(^^)
269 :
デフォルトの名無しさん :03/05/26 21:53
GNU make 3.79 使ってます。 make の本(GNU make の本ではありません)に .SUFFIXES: と書くとサフィックスに関するデフォルトの設定をクリアできると書いてありましたが、 GNU make でやってみると何かデフォルトの設定も使われているようなんですね。 -r オプションは使わないとすると、 GNU make では Makefile にどう書けばいいんでしょうか? 実際に問題が発生した例) debug.cpp と debug ターゲットがある場合、 make debug とやると .cpp: サフィックスルールも適用されてしまう。
unameじゃだめなの?
あ、ごめん。なんでもない
>>272 できました!
ありがとうございました。
∧_∧ ピュ.ー ( ^^ ) <これからも僕を応援して下さいね(^^)。 =〔~∪ ̄ ̄〕 = ◎――◎ 山崎渉
あげ
276 :
デフォルトの名無しさん :03/06/20 09:07
cygwinのmakeで、コマンドラインが長すぎるときにエラーが出てしまいます。 同じコマンドラインでも、Windows98上ではエラーにならず、Windows2000では エラーになります。 エラーメッセージは make: *** [target] Error 255 というもので原因や対策がはっきりわかりません。 検索すると、よく知られた問題のようですが、根本的な解決方法は見つかりませんでした。 というわけで、 おしえて、えろいひと。
>>276 解決法: コマンドラインの引数を少なくする
……しかないんじゃないの?
>>277 すでに動いていた環境でファイル数が増えたからエラーになったのです。
そんなわけで、簡単に引数は少なくできません。
cygwinスレにでも逝ってみます。
__∧_∧_ |( ^^ )| <寝るぽ(^^) |\⌒⌒⌒\ \ |⌒⌒⌒~| 山崎渉 ~ ̄ ̄ ̄ ̄
__∧_∧_ |( ^^ )| <寝るぽ(^^) |\⌒⌒⌒\ \ |⌒⌒⌒~| 山崎渉 ~ ̄ ̄ ̄ ̄
最近、Linux、Solarisの開発を始めた者です。 gmakeの質問させてください。 Linux上で $(DEPDIR)/%.d: $(SRCDIR)/%.cpp <tab>@[-e $(DEPDIR)] || mkdir $(DEPDIR) <tab>@$(CXX) -なんとか… って感じで動かしてたんですが、 Solaris8に移植してgmakeかけようとしたら /bin/sh: test: 引数が足りません。 とか言われてしまいます。 [-e $(DEPDIR)] でなんでつまづくかわかりません。 ご存知の方がいたら、教えてもらえないでしょうか
>>281 自己レスです
[がシェルコマンドとは気づかなかった
Solarisのbin/shだと [-eが使えなかった模様
すいませんでした。
>>283 いれてません。
bin/shで-eオプションがないようです。
bin/ksh じゃないと駄目みたいなんですが、
GUN makeってbin/shじゃないと駄目ってのはありませんでしたっけ?
>>283 誤解を招くので追記(汗
全角スペースの意味でとりました。
半角は入ってます
じゃ[ -d $(DEPDIR) ]は?
>>286 「-d filename
ファイル filename が存在し、ディレクトリであれ ば真。」
あぅ、こーいうものがあったんですね。
試してみます、ありがとうございました。
288 :
デフォルトの名無しさん :03/07/27 19:15
clean: (TAB)rm *.o (TAB)rm *.a って書いたら *.o がない時点でエラーになっちゃって *.a が消されません みなさんはこういう時ってどうしますか? rm *.o *.a とかでしょうか?
-rm rm -f *.o *.a
(^^)
(⌒V⌒) │ ^ ^ │<これからも僕を応援して下さいね(^^)。 ⊂| |つ (_)(_) 山崎パン
293 :
デフォルトの名無しさん :03/08/24 13:10
大きいプロジェクトをmakeしていると、今どの程度makeが終わったのか分からなくて不安になるんですが 進捗を表示しつつmakeする方法ってありませんか?
echo
希望が「完成率 30%」とかの表示だと、難しそうな気がする…
297 :
デフォルトの名無しさん :03/09/14 13:55
砂時計を使う。
>>293 大きいプロジェクトならmakefile分割しなよ。
そうすれば望みもかなうし管理も楽になるから。
299 :
デフォルトの名無しさん :03/09/14 14:51
date;make 後は、現在時刻と表示された時刻を見比べて、「どの程度」なのかを推測しろ。 できるよな? な?
この偉大なスレの300が数日間も放置されていようとはな。
出来れば300日間放置してほしかった
302 :
デフォルトの名無しさん :03/09/18 17:58
すみません。FreeBSD の make で使える .for n in $(NAMES) .for v in $(VALUES) result-$(v)-$(n): foobar data-$(n) ./foobar $(v) < data-$(n) > result-$(v)-$(n) .endfor .endfor こういう構文を GNU make で書くにはどうすればいいんでしょうか? ループが一重なら % を使って書けるのですが、2つ変化する部分があると どう書いたらいいものか...
makeの次がantとはね・・・ この中間にある書きやすくて読みやすくて高機能なビルド支援ツールってないのかね。
>>303 おお、ありがと。
しかし、自分用の makefile ならいいけど、配布用だとまだ使うのは早いかな...
>>305 eval使わない場合は、 -include のファイルが更新対象になるのを利用して、
NAMES:=a b c
VALUES:=1 2 3
RULE_FILE:=.rules
$(RULE_FILE) : $(MAKEFILE)
{ \
$(foreach n,$(NAMES),$(foreach v,$(VALUES), \
echo 'result-$(v)-$(n) : foobar data-$(n)' ;\
echo ' ./foobar $(v) < data-$(n) > result-$(v)-$(n)' ;\
)) \
}>$@
-include $(RULE_FILE)
と書けるみたい。(全角スペースはタブね)
>>306 おお、makefile を更新したら、ちゃんとルールファイルを更新してから
include するんですね。これは使えそうです。どうも、ありがと。
# $(MAKEFILE) は自分で値を設定しておかないといけないみたいですね。
ant
giant-ant
ム板の板歌 パスカルに逢わせてくれてありがとう〜♪
311 :
デフォルトの名無しさん :03/10/25 04:51
どなたか教えてください。(SunOS) Makefile -------------------- FILE_1 = a.tmp FILE_2 = ${FILES_1:.tmp=.tmp2} FILE_3 = *.tmp FILE_4 = ${FILES_3:.tmp=.tmp2} all:: @echo ${FILES_1} @echo ${FILES_2} @echo ${FILES_3} @echo ${FILES_4} -------------------- 実行結果 > make a.tmp a.tmp2 a.tmp *.tmp2 FILES_4 でFILES_2 と同じ結果を得たいのですが、 思ったようにできません。 make のみで FILES_2 と同じ内容を FILES_4 に 設定することは可能でしょうか?
さわやかSUN組
313 :
デフォルトの名無しさん :03/11/04 03:00
GNU make の $(error ...) ってどのバージョンから使えるんですか?
314 :
デフォルトの名無しさん :03/11/16 00:07
makeのスレなんて流行らないよ。 makeなんて初心者虐め、他文化虐め、異端者排除の大好きなUN*X厨の道具だもの。 その証拠にこのスレでは幾多の質問が無かった事のように流されてきたじゃない?
makeを使うのに、 makefileを書く必要はないんです。 ただ単に、hello.cをコンパイルしたければ 「make hello」とか「make hellow.exe」と打つだけです。 何が難しいんですか? ...makefileを書かねばならんのは、 分割コンパイルをや非標準のライブラリの導入をする 中級者以上だけです。
316 :
いなむらきよし :03/11/16 01:04
キケー!
makefileもかけないでプログラマ気取りですか?
俺はMakefileしか書かないよ。
俺はGNUmakefileしか書かないよ。
そのうち #!/usr/bin/make なんてスクリプトが書かれるのかな。嫌だな。
書いたことあるよ。
make って微妙に挙動が違うから, GNU make 専用に Makefile を書くか, いろんな make で扱えるように Makefile を書くかで, 面倒くささが 変わってきて, ちょっといや.
make って微妙に挙動が違うから, GNU make 専用に Makefile を書くか, いろんな make で扱えるように Makefile を書くかで, 面倒くささが 変わってきて, ちょっといや.
gmake,pmake,nmake 他には?
余計なこと書きすぎるとポータビリティーがないのよ。 7行プログラムじゃないけど、必要最小限、極力簡潔に書くの。
俺はgmakeで統一。 Windowsでもcygwin/binにパス通して使ってる。 nmakeは名前違うからいいけどBorlandのはまんまmakeで激しく迷惑だな。
>>326 同位。
あんな変態的なのがmakeを名乗るな。
しょうがないのでこういうスクリプトをbmakeとつけて使ってる。
#!/bin/sh
bccdir=`type bcc32`
bccdir="${bccdir#bcc32 is }"
bccdir="${bccdir%/*}"
if [ -z "$bccdir" ]; then
echo "$0: bcc32 not found" 1>&2
exit 1
fi
if [ "x$1" = x-C ]; then
cd "$2"
shift 2
fi
PATH="$bccdir:$PATH" exec make "$@"
WideStudioのmingw(GCC WIN32版)とC++Builder6も衝突。 makeをgmake.exeにリネームするとmakeを起動するmakefileが 通らんので、環境変数からmingw32-make.exeのあるディレクトリを 検索し、PATHの中身を並べ替えてexecvp("make.exe"...する wmake.exeを書かされた。 void rebuild(std::vector<std::string> &buff, const char *name, char slash = '\\') { for (std::vector<std::string>::iterator it = buff.begin(); it != buff.end(); it++) { struct stat st; if (stat((*it + slash + name).c_str(), &st)) { ; /* ignore:win32-execvpは存在しないディレクトリもPATHに書いていい */ } else { std::string s = *it; buff.erase(it); buff.insert(buff.begin(), s); return; } } throw std::runtime_error(std::strerror(ENOENT)); }
書かされたって仕事でWideStudio使ってるのか?
>>329 仕事じゃないよ。でも後で使うつもり。
低機能だけどMFCやVCLよりシンプルで使うのがラクだからね。
windowsでmakefileなんか書くなバカ
>>331 5年ほど前、100m離れた自席とマシン室の間往復するのが面倒で、
自席のPCにCygwin入れてマシン室のサーバ機からtelnetでログイン、
nmake叩いてコンパイル、できたファイルをFTP GETとかやってた。
あの頃はTerminal Serviceがまだ標準じゃ無かったんで、nmake
マンセーだったよ。
いまはリモート接続とかあるけどね
334 :
デフォルトの名無しさん :03/11/30 07:18
Cygwinのmakeで OSTYPE=$(shell echo $$OSTYPE) とやってもOSTYPEが空のままなんだけどどうすればいいの? bashでecho $OSTYPEだとcygwinって表示されるし linuxでは普通にOSTYPE=linux-gnuがセットされるのに。
javaならxmlで記述するからな〜。makeかぁ、懐かしいね〜隔世の感・・・
>>335 お前みたいなのがJavaの品格を貶めているんだよ?わかってる?
>>328 > makeをgmake.exeにリネームするとmakeを起動するmakefileが通らんので、
Makefileの書き方が悪い。$(MAKE)を使うべき。
make allとかやったときサブのmakefileにall渡すのはどのマクロ?
>>338 普通にターゲットだから $@ の模様。
GNU Make だと MAKECMDGOALS つーのもあるが
>>311 > FILE_3 = *.tmp
これも GNU Make だと
FILE_3 := $(wildcard *.tmp)
かな? キモは ":=" を使って、その場で展開しておくこと。
>>340 > キモは ":=" を使って、その場で展開しておくこと。
ををっ、腹ショー!!
make debugってやったらターミナルだとgdb,Xが起動していたらGUIデバッガを起動する。 というのをやりたいんですが、どうやって判別すればいいですか?
>>342 X 上で走っているターミナルの場合はどうすんねん、ってのは揚げ足とりだよなぁ。
とりあえず環境変数 DISPLAY が設定されているか否かで判別すれば?
DEBUGGER := $(if $(DISPLAY),xxgdb,gdb) debug:; $(DEBUGGER) $(TARGET)
前から思ってたんだけど、makeなんて新しいプログラム用意するんじゃなくて、 シェルスクリプトのライブラリという形で提供すれば良かったんじゃないの? 当時の貧弱な計算機環境だと、巨大なシェルスクリプトが重荷になったのかも しれないけどさ。新しく文法覚えてツールを使うっていうのは、当時の利用技能の 高いユーザにとっても面倒なことだったと思うけどなあ。
>>8 make: don't know how to make love
348 :
デフォルトの名無しさん :04/02/14 01:54
make は好きなんで age てみたり. ところで, Makefile で使う変数名で慣用的なものってどんなのがありますか. CC, CXX, CFLAGS, LDFLAGS, LIBS あたりはみんな普通に使うんじゃないかと 思うのですが.
mingwのgmakeはUNIX同様に実行ファイルにサフィックス無しを デフォルトにしてるんで、ターゲットの日付を見てくれましぇん。 なんでこんな変な仕様にしたんだろ。 おきて破りで環境変数MAKEFILES=C:/gcc/etc/make.defsをやってる。 .SUFFIXES:.exe .a .ln .o .c .cc .C .cpp .p .f .F .r .y .l .s .S \ .mod .sym .def .h .w .ch .web .sh STDLDFLAGS = -Wl,-LC:/gcc/lib .c.exe: $(CC) $(CFLAGS) -o $@ $< $(STDLDFLAGS) $(LIBS) .cc.exe: $(CXX) $(CXXFLAGS) -o $@ $< $(STDLDFLAGS) $(LIBS)
makeはわかるけどconfigureの書き方がわからない
352 :
デフォルトの名無しさん :04/03/25 02:35
ルールのコマンドを実行するシェルの環境変数をmakefile内で設定することはできますか? 設定したい環境変数は複数あって、それらをすべてのルールのコマンドに反映させたいです。
>>348 make -np | grep "="
354 :
デフォルトの名無しさん :04/03/30 17:50
MSYS + MinGW なんですが、 コンパイルにかかった時間を簡単に計るのは、どうやったらいいですか? 今は、 all: date target.exe date: date target.exe: target.cpp コンパイル date みたいにしてます。
>>356 bin の中を探してたんで、そんなのがあるのを知りませんでした。
>>355 最初は使ってましたが、一分以上待つのはつらいです。
ありがとうございました。
358 :
デフォルトの名無しさん :04/04/23 09:26
ターゲット、依存ファイル、文字列関数の扱う文字列など、 スペース区切りのリストの中にスペースを含む文字列(ファイル名)を 一つの要素として入れるにはどうしたらいいんでしょうか?
my\ document みたいに\でエスケープする。
>>359 ありがとうございます。
ターゲット、依存ファイルには置けるようになりました。
ですが、文字列関数にわたすと複数の要素に分割されてしまいました。
このエスケープはどんな仕様で動作しているのでしょうか?
マニュアルに書いてあります?
最近、環境を移行する作業してました。 かなり昔に作られたmakeファイルや、誰が作ったのかわからないmakeファイルを 新環境用に「感」で直しつつ作業してました。 ある程度manで調べたりしたけど、本当・・・難しい。 まともな日本語の本ってないんですかね?1にも書いてありますが。
>>360 言語もわからんのに答えられるわけねーだろボケ!
>>362 言語?あ・・・。
すいません。GNU makeです。
364 :
デフォルトの名無しさん :04/05/11 13:36
SRCS=$(shell ls *.c) とやると.cのファイルが全く無い場合 >そのようなディレクトリやファイルはありません。 というエラーメッセージが表示されてしまいます。 メッセージを出力しないようにするにはどうすればいいですか?
>>364 SRCS=$(shell ls *.c 2>/dev/null) は使いたくないか?
ふつうは、$(shell echo *.c) か $(wildcard *.c) だろ
makefileって難しいです 質問ですが、 LINUXでg++でコンパイルするmakefileを 作ったんですが、 エンディアンをビッグ<−>リトルを 切り替えられるような方法を教えてほしいのですが CFLAGに設定するようなものなのでしょうか?
>>367 もし,Makefileを手で書いてるなら,g++のオプション-Dを使って,
DEFS = -DWORDS_BIGENDIAN
hoge.o: hoge.cpp
g++ $(DEFS) hoge.cpp
で,ソースの中でプリプロセッサ使ってディスパッチすればいいと思います.
autoheader,autoconf,automake辺りを導入すると更に自動化できて,
例えば,configure.acに,
AC_C_BIGENDIAN
と書いてconfigureを作っておくと,
./configureした環境に合わせてWORDS_BIGENDIANってのを
勝手にdefineしたりしなかったりしたヘッダを自動で作ってくれたりしてくれて
なかなか,便利です.
autoheader,autoconf,automakeの使い方は複雑なのでググッて調べて下さい.
>>368 ふええ 懇切丁寧にありがとうございます
いくらググッても なかなか出てこなくて困惑していたんです
ありがとうございます
タブ入んないんですね.
>>368 DEFS = -DWORDS_BIGENDIAN
hoge.o: hoge.cpp
- g++ $(DEFS) hoge.cpp
+ <TAB>g++ $(DEFS) hoge.cpp
>>367 そもそもエンディアンに依存したコードを書こうとするのが良くない。
ビットシフトとか何とか使って最初からエンディアンに依存しない実装に汁。
>372 >371 は至極当然のことを言ってると思うんだけど、問題になるのは性能なの?
makeなんてバッドノウハウの塊だ・・・階層化するともうめちゃくちゃ
make嫌いや 環境変数LIBを上書きして定義してて2日も悩んでた。orz あほだ
376 :
デフォルトの名無しさん :04/06/23 16:50
ソースとオブジェクトファイルが混ざらないように、 オブジェクトファイルの出力先を変えたいんですが、 %.o : %.cpp $(CXX) $(CXXFLAGS) -c $< -o $(OUTDIR)$@ とか書いてしまうと毎回オブジェクトファイルが生成しなおされてしまいます。 なんかうまい手ないでしょうか?
>>376 オブジェクトファイルの出力先にMakefileを書いて試してみたけど,
依存ファイルのところの記述(:のあと)で親ディレクトリに遡れないみたいで,
これでもうまくいかないですねぇ.
>>376 $(OUTDIR)/%.o : %.cpp
$(CXX) $(CXXFLAGS) -c $< -o $(OUTDIR)$@
なんだ。makeが好きなの俺だけか・・・。 他になんか便利なビルドツールあったらおしえちくり
Antぐらいかな
bjam
>>378 $(OUTDIR)/%.o : %.cpp
$(CXX) $(CXXFLAGS) -c $< -o $@
>>378 ,
>>382 GNU Make 3.80使ってるんだが、
$(OUTDIR)/%.o : %.cpp
だと条件にひっかからね。
ふつー、OUTDIRにMakefileを作って VPATH = $(SRCDIR)
386 :
デフォルトの名無しさん :04/06/24 19:10
gnu makeの最新日本語リファレンスってないの?
>>384 んなわけねー
$(OUTDIR)%.o : %.cpp
ってオチか?
VC++(NMAKE)で作ったmakeファイルって Linuxで使用できるんですか?? おせーてくだされ。
>>390 VC++の自動生成で作ったmakは、nmake方言をバリバリ使用
しているので無理。
つーかそもそもVC++系のcl.exe/link.exeがLinuxには無いし、
各コマンドのオプションもgccとは全然違うんだから、流用しよう
なんて考えが無謀だろ。
nmake方言を極力使わないようにして書いた手作りmakなら、
CC/LD辺りのマクロを変えるだけで動く可能性はあるが。
>>391 上級者様、ありがとうございまっす!
自分の望んだ以上のお答えでありました!
VC++で出来るだけデバッグして、Linuxに持って行って
makeファイルでコンパイルをたくらんでいるのですが、
VC++で作ったmakeファイルではダメですか…
手書きで書かないとダメなんすかねぇ…
総入れ歯、むかし居た会社で nmake を「ナマケ」て呼んでた '`,、('∀`)'`,、
394 :
デフォルトの名無しさん :04/07/23 19:51
誘導されてきました Makefileの中に引数で条件分岐できるif文書きたいんだけど どうしたらいいでしか?
395 :
デフォルトの名無しさん :04/07/23 19:53
Make makes make making many problems.
make make make!
そんなまともな日本語のドキュメントがあったのか。
399 :
デフォルトの名無しさん :04/07/26 00:12
再帰的makeする時、上の階層のMakefileで定義した変数 を下位階層のMakefileに継承させたいのですが、どうすればよいでしょうか。
POSIX標準のmakeってどうして作れないの? shみたいになんとかしてほしいよ。automakeはよく分らんし。
gnu makeでいいじゃん。 自分のreadmeには必須と書いてあるよw
perlみたいに商用UNIXにも標準搭載してくれりゃ構わんけどな。
automake,autoconf使えばいいじゃん。あれこそ最高のハックだよ。
UNIXプログラマ必須のツールだと思うけどね。だからNetBSDみたいに、
GNUツールの全てのMakefileを自前のmake用に新規に書くのは嫌い。
もちろんビルド時間の節約にかなり貢献してるのは認めるけど。。。。
>>403 gmakeは他のGNU系列のパッケージには依存してないよな。gmake必須と
するのは、別にGNU原理主義とも関係ないと思う。
automake, autoconf使ってるのでもGNU make依存してるのとかあった ような。(まぁそいつの使い方がなってなかっただけかもしれんが)
406 :
デフォルトの名無しさん :04/10/08 17:12:14
あげ
cookってのはどうなんですか 使ったことないんで使い勝手がわからんばい
boost が好きなんですが、make の替わりに、bjam を使うのはどうなんでしょう?
>>409 どっちが君の言いたいことか曖昧な気がするので両方答えてみる。
q1) boostがmakeの代わりにbjam使ってるのってどうよ?
a1) いいんじゃない? ある意味makeよりポータブルだし。
q2) 漏れもbjam使いたいけど、いいの?
a2) チーム開発ならリーダー以下チーム全員に合意を取り付けないと。
個人なら好きなのを使って問題なし。
>>410 言われてみれば、とってもあいまいでした。
q2) の方を訊いてみたかった個人開発の者です。
今は前に書いた makefile を使いまわして、それなりに満足していますが、
あの boost があえて使う bjam は、どんな感じなんだろうかと思ったんです。
けど、ポータブルなところで選ばれてる気がしてきました。
実際に使ってる人の意見も聞いてみたいです。
412 :
デフォルトの名無しさん :04/10/30 22:36:17
413 :
デフォルトの名無しさん :04/10/30 23:12:19
うちの会社の人バッチファイルで全部コンパイルしてるよ。 だから一部だけ修正しても全モジュールリビルドしてリリースしてる。
一行変えたら全部コンパイルやり直しなんてやってられないな...
自分はmake使ってるけどC++のヘッダにコード書きまくるんで結構遅い・・・
>>415 いったい何を書いてるの?
そういう漏れは、Pimpl Idiom 教団に入信しちゃった。
VC++でプリコンパイルヘッダガンガン使うようになってからは、 iostreamの代わりにiosfwdをインクルードとかそういう事を考える必要も無くなったな。
ガンガンっていうかあまりにあたりまえの機能過ぎて gccに付いてないのを知ってびびった。 3.xには付いてるんだっけ?
>>418 3.4 からです。
何年も待って、やっとキター。と思ったら、3.4 はびみょーな出来栄えだったのな。
プリコンパイル済みヘッダて変な日本語だよな
別に
頭痛が痛いみたいな
precompil"ed" headerなんだから、特に変だとは思わないけど。
むしろ「済み」だけ日本語にするバランス感覚が受け入れ難い。
プリコンパイル済み は 事前にコンパイルが済んでいる だろ。どこがおかしいのやら。
>>425 それなら「事前コンパイル済みヘッダ」になるだろ。
なぜ「プリコンパイルドヘッダ」ではないのだろうか?
どうやらMSの翻訳が元のようだが。
>>426 普通カタカナに直す時に「ド」なんて書かない。あなた日本人?
へぇ(嘲笑)
なら、プリコンパイルヘッダでいいじゃん。済みなんて入れる必要もない。
↑論点ずれてる
いまさらMS翻訳にケチつけるなよ。 いったいなにがしたいんだ。
432 :
デフォルトの名無しさん :04/11/12 08:38:43
>>427 > 普通カタカナに直す時に「ド」なんて書かない。
よくあるがこれは変な習慣だよなあ。そもそも、なんで抜くのかが疑問だ。コレMSが始めたのか?
434 :
M.B. :04/11/12 11:33:11
全部読んだが make を自分で書いたアフォは漏れだけだった…… orz
>434 (;´Д`) 漏れも、なんか make をうまく使いこなせなくて 癇癪起こしちゃって自分で書こうとした事があるよ……
Java のプログラムを Win 上で開発しているのだが、 昔アスキーで出してたような、.exe 形式の make が見当たんなくてさ、 GNU make のソースを Cygwin 上でコンパイルして .exe 形式にすりゃあいいと思ったんだが結局ソースが見つからず、 ええい面倒臭え、と思って Java で書いた。 非常にチャチなものだが便利に使ってる。
>>437 GNU make のソースが見つからないって、アフォか。
てか、cygwinにGNU makeのバイナリがあるだろが。
javaならant使えよ・・・
ぶかあああああああああああああああああああああああああああああああああ
ワロタ
443 :
M.B. :04/11/13 23:13:39
ぶかー。
makefile書くまでもないような処理をバッチファイルで ftimecomp source target && ( sourceからtargetを作る処理 ) とかはたまにやるけど。ftimecompは自作ツール。
445 :
M.B. :04/11/13 23:23:45
自作せんとね、使い方忘れるのよ。 いらんものいろいろ作ったなぁ。
その自作ツールの使い方を忘れるんで、 Makefileに書いておくんだけどな、おれ
447 :
M.B. :04/11/14 00:18:42
漏れも自分ちの電話番号とか忘れるんで紙に書いてしまっとくんだが、 どこにしまったか忘れる。
ここでも言われた _| ̄|○
450 :
デフォルトの名無しさん :04/11/19 22:59:34
2重コロンの意味がわかんね よく単一ターゲットに使われるみたいだけど どういう意味なの?
よんだけどわかんなかったんだよぅOTL
>>452 カードキャぷたーさくらってマジ面白いよな。
>>452 > よんだけどわかんなかったんだよぅOTL
同志よ、俺もわからん。
でも、普通に依存関係書いている分には必要ないような気がする。
>>454 少し調べてみた。
all:target.txt
target.txt::source1.txt
@echo do task 1
@echo source is $^
target.txt::source2.txt
@echo do task 2
@echo source is $^
source1.txt source2.txt:
source1.txtが更新されると、「do task 1」が表示され、source2.txtが更新されると「do task 2」が更新される。
両方更新されると、両方表示される。
コロンをひとつにすると、同じターゲットに対するコマンドが二つあると警告が出て、両方更新された場合にも一方のコマンドしか実行されなくなる。
マニュアルにある通り、どのソースが変更されたかによって実行するコマンドを切り替えるための方法だと思う。
456 :
make に代わる次世代標準 :04/11/21 21:03:13
make ってそろそろ引退してほしい。 make に代わる次世代標準はありませんか? ちなみに Ant は処理系が Java で書かれているし XML 記法だからやだ。
make が sh と結びついている時点で最悪なんだよ。 perl か python と結びついてほしい。 たいていの UNIX には perl や python は入っているだろうし。
458 :
デフォルトの名無しさん :04/11/21 21:05:18
>Ant は処理系が Java で書かれているし インスコすれば、そんなことは誰もわからない。
463 :
デフォルトの名無しさん :04/11/22 09:26:18
MinGWのmakeで処理していますが、 a.hpp : b.hpp の依存関係の解決方法を教えていただけないでしょうか?
いろいろ調べていた時に、サイトで使われていた表現ですが、 間違っていたのでしたら申し訳ありません。 a.hppにおいて、 #include "b.hpp" となっているとして、 b.hppを編集した場合、a.hppをインクルードしている各々のobj(cpp)ファイルが その都度コンパイルされて欲しい、ということです。
>>466 gcc -MM
makedepend
このへん調べれ。>408のリンク先もけっこういいな。
ヘッダの依存関係のチェックやビルド後のリリース用スクリプト (どっかにコピーするとか)の記述なんかもサポートしたMakefileの フレームワークというかお手本みたいなのってどっかにないの? 0から手書きするのめんどくさ過ぎ。かといってAutoなんたらとか使いたくないし。
>>468 >ヘッダの依存関係のチェックやビルド後のリリース用スクリプト
>(どっかにコピーするとか)の記述なんかもサポートしたMakefileの
>フレームワーク
Autoなんたらはそのためにあるのだが....
466(464)=470です。すいません。
>>464 自分も最近makeを使い始めたんですが、ヘッダファイルをターゲットとして指定するのがそもそも間違いでは??
ターゲットはあくまで、その下の行のコマンドによって作成されるターゲットであるはずです。
つまり
>>466 の場合では、a.hppは、b.hppから”作成"されるわけではないので(ただインクルードされているだけ)、
a.hpp : b.hpp とa.hppをターゲットとして書くのはおかしい気がします。
(ターゲットにヘッダファイルが指定された時にmakeがどのような動作をするのかわかりませんでしたが)
こういう場合は、
オブジェクトファイル: ヘッダファイル1 ヘッダファイル2
もしくは、
ソースファイル: ヘッダファイル1 ヘッダファイル2
とスペースで区切って並べて書いた方がいいかもしれません。こうする事で少なくとも、
ターゲットのオブジェクトファイルやソースファイルと、複数のヘッダファイルとの依存関係は維持出来るはずです。
しかしこれでは、ファイルが増えて来た時に大変そうなので、他にもっと良い方法があるのかも知れませんが…。
> もしくは、 > > ソースファイル: ヘッダファイル1 ヘッダファイル2 ああ、すいませんこれは間違ってますね。 オブジェクトファイルをターゲットとするべきだと思います。
474 :
デフォルトの名無しさん :04/12/22 18:34:39
外部コマンドを実行するときに hoge.h : hoge.list hmaker.exe --prefix=hoge hoge.list みたいなふうにしたんですが、この=が原因でこの文がマクロ変数に 代入してる式みたいなふうに認識されてしまい升。nmake.exeです。 どうすればいいんでしょうか。
475 :
デフォルトの名無しさん :04/12/23 03:08:59
make makes make make many problems.
cmake使ってる人いる?
477 :
デフォルトの名無しさん :05/03/02 02:16:06
ソースツリーの中から必要な.h,.cファイルを抜き出すために、 .cのファイルのリスト(SRC)を元にgcc -MMで出力される依存関係を出力し、 それをパースして、必要な.cと.hファイルを出力するperlスクリプトを書いてみました。 files.txt: gcc -MM $(CFLAGS) $(SRCS) | parse.pl > $@ みたいな感じです。 で、生成されたファイルの中身は、 ../src/a.h ../src/dir/b.h のようにファイルが羅列されており、 これらのパスの"../src"を"package/src"に置き換えたパスにコピーしたいと思っています。 そのルールを書きたいのですが、 srcpackage: files.txt srcpackage: DSTFILES=$(subst ../,package/src,$(shell cat files.txt)) srcpackage: $(DSTFILES); ../package/%.h : ../src/%.h cp $^ $@ ../package/%.c : ../src/%.c cp $^ $@ と書いてみたところ、下二つのルールにひっかからず、コピーできないでいます。 他に、 %.c: cp $@ $(subst package/src, ../ , $@) というのも試してみましたが、 srcpackageがsrcpackage.cとひっかかってしまい、うまくコピーができません。 どなたかご教示いただけないでしょうか?
>>477 > srcpackage: files.txt
> srcpackage: DSTFILES=$(subst ../,package/src,$(shell cat files.txt))
> srcpackage: $(DSTFILES);
これの意味を自分で(日本語で)説明できるか?
できないなら、マニュアル見直せ。
ほかにも問題がありそうだが、まずはそこから。
>>478 1行目:srcpackageを作るにはまずファイルのリスト(files.txt)への依存を定義
2行目:ファイルのリストのテキストを読み込み、コピー先のパスに書き換え、変数に代入
3行目:コピー先のファイルへの依存を定義
ということをやりたかったのですが、
srcpackage: file.txt;
%.c :
コピー処理
%.h :
コピー処理
のようにすると、file.txtの生成前に後のcat file.txtなどが実行され、
困っていました。
ご指摘の通りあまり理解せずに進めていました。
とりあえずMakefileには
srcpackage: file.txt
make -f Makefile.copy copy
と書き、別のファイル(Makefile.copy)で、
copy: $(subst ../src, package/src, $(shell cat file.txt|./parse.pl | sort | uniq));
%.c:
コピー処理
%.h:
コピー処理
としてみました。
>>479 srcpackage: file.txt
を「srcpackageを作るためにはfile.txtが必要」と読め。
>>479 やっぱりマニュアル読んで出直せ。
> srcpackage: DSTFILES=$(subst ../,package/src,$(shell cat files.txt))
この構文は、 srcpackage をターゲットとするコマンド内でのみ有効な変数の代入。
グローバルな変数への代入なら "srcpackage: " を削除しろ。
> srcpackage: $(DSTFILES);
これは
srcpackage:
$(DSTFILES)
と同じ意味。
srcpackage を $(DSTFILES) に依存させるのであれば最後のセミコロンを削除しろ。
>>477 # ここらへんで SRCS を定義しておくこと。
ASSIGNMENT_OF_USEDFILES:=assignment_of_USEDFILES.mak
$(ASSIGNMENT_OF_USEDFILES) : $(SRCS)
echo 'DSTFILES:=' `gcc -MM $(CFLAGS) $(SRCS) | parse.pl` >$@
-include $(ASSIGNMENT_OF_USEDFILES)
DSTFILES:=$(patsubst ../src/%,package/src/%,$(USEDFILES))
$(DSTFILES) : package/src/% : ../src/%
cp $< $@
.PHONY : srcpackage
srcpackage : $(DSTFILES)
# 動作未確認
>>480 すみません。以後気をつけます。
>>481 > > srcpackage: DSTFILES=$(subst ../,package/src,$(shell cat files.txt))
>この構文は、 srcpackage をターゲットとするコマンド内でのみ有効な変数の代入。
srcpackageが必要とするファイルを生成する別のルールにも
適当されるものだと勘違いしておりました。
ありがとうございます。
>>482 ありがとうございます。
こちらで試してみます。
> srcpackageが必要とするファイルを生成する別のルールにも > 適当されるものだと勘違いしておりました。 適用されるよ。ルールじゃなくてコマンドに、だけど。
485 :
デフォルトの名無しさん :05/03/11 01:03:30
GNU make を使っています。
ルールでのファイル指定や、文字列操作関数なんかでは、
要素の区切りがスペースになってるんですけど、
スペースを含む文字列を一つの要素として扱いたい場合はどうすればいいんでしょうか?
$(TARGET_DIR)/target : ...
...
という Makefile に対して、
$ make TARGET_DIR='dirname with spaces'
とされた場合の対処に困っています。
とおもったら、
>>358-360 で少し似た話がでていたようですね。
文字列操作関数の問題が解決してないのか。
486 :
デフォルトの名無しさん :2005/04/27(水) 22:07:37
nmakeの使い方を教えてください
MSのnmakeって「this is Not gMAKE」の略称だっけ?
GNU make で、複数のターゲットを更新するアクションの カコイイ書き方教えれ。 例) トークン表とパーサ表を吐く、Bisonに対するアクション指定
491 :
490 :2005/06/08(水) 13:15:14
「コマンド連鎖の缶詰を定義する」の章に載ってた 分かりづらいよマニュアル......orz......
識者の方、知恵をお貸しください。 ソースファイル(*.f90)が、ファイル数200超あります。 詳しいコンパイルオプションは省きますが、 最終的には下記のように実行モジュールを作成したいのです。 $(TARGET) : $(OBJS) $(FC) -o $@ $(OBJS) ところが、OBJSとして指定する(*.o)ファイルが200超あり OBJS = a1.o a2.o ,,,,, a200.o と書いていくのが大変です。 Linuxでは SRCS = $(SHELL *.f90) OBJS = $(SRCS:.f90=.o) とすることで、簡単なMakefileを作れたのですが、 GNUのmakeが入っていないマシンで使うこともあり そこではSHELLが使えませんでした。 ”SHELLを使わない”という条件で この部分を簡単に作成するいい方法はないでしょうか? ヨロシクお願いします。
493 :
492 :2005/06/12(日) 00:28:58
> $(TARGET) : $(OBJS) > $(FC) -o $@ $(OBJS) 訂正です。 $(TARGET) : $(OBJS) <---Tab--->$(FC) -o $@ $(OBJS) です。
494 :
492 :2005/06/12(日) 00:31:30
更に訂正っす。 > SRCS = $(SHELL *.f90) > OBJS = $(SRCS:.f90=.o) SRCS = $(SHELL ls *.f90) OBJS = $(SRCS:.f90=.o) の間違いです。 何度もすいません。
496 :
492 :2005/06/12(日) 14:51:16
レスありがとうございました。 $(wildcard *.f90) 先ほど試してみましたが、これも存在してませんでした。 他に何か手法があればご紹介お願いいたします。
497 :
495 :2005/06/12(日) 14:59:24
>>496 GNU make が使えない環境か。読み間違えてたよゴメン。
>492 Makefile を修正するシェルスクリプトを作成してそれを実行するようにすれば?
>>498 そしてconfigureにたどりつきAutomakeがワイルドカードに未対応に気付くとか
500 :
492 :2005/06/12(日) 16:12:12
>>498 そうですね。最終的にはそうなってしまう可能性もあります。
別途
echo "SRCS = \" > list.mk
ls *.f90 >> list.mk
のようにしてから(正確には.「f90」を「.f90 \」への置換もしてますが)
Include list.mk
とすることでうまくいくことは可能なんですが、
Makefile単体で何とか出来ればなぁ、と思ったので
ご相談しました。
もし何かアイデアあればご教授ください。
なければ、こんな手法でやるしかないっすね。
antなbuild.xmlをMakefileに移植してるんですが、 ディレクトリ移って作業するにはどうしたらよいんでしょう。 cd hoge; だと、その行のコマンドしか駄目ですし。 移るディレクトリにまた、Makefile作っておいて、 さらにmake呼ぶのがmake流なんでしょうか
503 :
デフォルトの名無しさん :2005/07/21(木) 13:57:08
ageます
>>502 >移るディレクトリにまた、Makefile作っておいて、
>さらにmake呼ぶのがmake流なんでしょうか
automakeでmakeファイル作るときは
そんな風にするのが一般的だと思う
「make流か」と言われれば
?
ん?cdで移動しても問題ないだろ
>>502 cd hoge; \
do_something; \
do_anotherthing
507 :
デフォルトの名無しさん :2005/08/14(日) 18:17:10
mingwのmake.exeについて質問です。 include に渡すファイル名に半角スペースが入ってた場合、 ¥マークでエスケープしないとダメっぽいんですが、 makeの変数に半角スペースの前に¥マークを置く方法ないでしょうか? ↓これをやってみたんですが無理でした。 $(subst \ ,\\\ , $(VALUE)) または include に半角スペースを含むファイルパスを渡す方法が無いでしょうか? ちなみに "" で囲ってみたんですがダメでした。
半角スペースを含むパスを使わない。
超ダサっ!
INCLUDE=-I"path 1" -I"path 2" ふつうにできるょ?
511 :
507 :2005/08/17(水) 23:01:21
>>511 > 今から僕のコンパイル作業ディレクトリを変えるのはちょっと・・・
includeされる側のディレクトリとは関係ないんじゃないの?
相対パスで指定するとかsymlink張ってみるとか、なんか工夫してみ。
>>507 mingwのmakeってcygwin使わないんだっけ?
cygwinのmakeならこんなんで逃げれるけど。
-include $(shell cygpath -m $$(cygpath -d $(VALUE)))
514 :
507 :2005/08/18(木) 23:29:14
www.ecoop.net死んじゃったか(´∀`;)
makeの解説よかったのに…勿体無い。
>>512 winなんでsymlinkは無理っす。
相対パスは切実にしたいんだけど、makeの組込定数の$(CURDIR)を使いたいもので、
これが絶対パスを返すので相対パスにできないんですよね・・・。
>>513 cygwinはいれてないなぁ(´∀`;)
まあ、なんとかしてみます。
>>512-513 ありがとう。
515 :
507 :2005/08/18(木) 23:39:30
というかマイドキュメント(C:\Documents and Settings\xxxx)の配下でコンパイルするのがいけないのか・・・。 いや、でもあきらめたくない。
windowsだと短い名前とか使えなかったっけ? DOCUME~1 みたいなやつ。たしかdir /xで見れたような。 あるいはsubstを使ってみるとか。
517 :
516 :2005/08/19(金) 02:20:34
substはシェルのコマンドのsubstね
>>514 WinNT移行でNTFSならシンボリックリンクできるよ。
「ジャンクション」或いは"symlink-1.02.zip"で検索して味噌。
NTFSの仕様は糞だよな
520 :
507 :2005/08/21(日) 01:39:22
>>516 短い名前かぁ。盲点ですた。
>>518 まじっすか
>>519 シンボリックリンクに慣れるとねぇ。あれは便利すぎ。
でも、NTFSにもシンボリックリンクは実装してないだけで、
データ構造の中には予約としてあるっぽいよ
521 :
507 :2005/08/21(日) 01:40:59
やば。age設定になってた。ゴメス(^ω^;)
>>520 だからね、ディレクトリに関してはジャンクションはディフォルトで使えるんですよ。
ファイルに対するジャンクションが意図的に禁止してあるだけで。
生半可な知識で語るくらいなら>518に書かれているツールの作者のページを読んできな。
絶対パスで格納するうんこ仕様
524 :
デフォルトの名無しさん :2005/08/28(日) 19:09:51
makeでsrcディレクトリのソースを binディレクトリに展開するにはどうしたらよいですか?
525 :
デフォルトの名無しさん :2005/08/28(日) 19:19:06
間違えた srcディレクトリのソースをコンパイルして 生成物をbinディレクトリに展開したいんです
展開ってどういう意味?
配置って意味でそ
コピーしたいだけなら、普通に copy とか、cp とかすりゃいいんじゃねーの?
>>524 「cd bin」でbinディレクトリに移動してからコンパイルすればいい。
../srcディレクトリをVPATH等で指定してやれば問題はないはず。
パスと%使ったらうまくできた。 これでターゲットファイル名とソースファイル名のみを書いてやるだけで 自動でオブジェクトファイルだのを別ディレクトリに展開してくれるようになった。 お騒がせして申し訳ない。
同じディレクトリで2つのmakeファイルを作成する方法はないですか? 1つめのプログラムをmakeのち実行した後に、2つめのプログラムをmakeのち実行をしたいのですが。 ちなみにcを使っています。
532 :
デフォルトの名無しさん :2005/10/24(月) 15:09:47
ageさせていただきます。
ミャケでございます。 質問でございます。 SRCS = \ xxx/yyy/zzz/aiueo.cpp \ qqq/rrr/kakikueyo.cpp \ nnn/ooo/sashimidesu.cpp \ OBJS = $(patsubst %.cpp,obj/%.o,$(SRCS)) このようにしているのですが OBJSの中身が obj/xxx/yyy/zzz/aiueo.o obj/qqq/rrr/kakikueyo.o obj/nnn/ooo/sashimidesu.o のようになってしまい、ディレクトリ毎にルールを設定しないと No rule to make target obj/xxx/yyy/zzz/aiueo.o のようなエラーが出てしまいます。 *.cppから*.oへの変形途中に obj/aiueo.o obj/kakikueyo.o obj/sashimidesu.o のように変形させる方法はありませんでしょうか? gmake 3.80です。宜しくお願いします。
>>531 make -f 使えばいいんじゃないの?
>>535 ありがとうございます。うまくいきました。
537 :
デフォルトの名無しさん :2005/11/04(金) 08:43:29
$(CC) $(CFLAGS) -o $@ $< を $(CC) $(CFLAGS) -o $< $< って書き間違えた…… ヘッダ以外全て消え去ったよ svnで管理してたから古い状態で復活できたけど、 10個近く新しいファイルを作ってた。 復活できたファイルも変更点がかなりあった……
>>537 デフォルトの規則をそのまま使えばいいのに…
>>538 VPath使ってたら明示せざるを得なくなった
+
コンパイラの切り替えとか含めててディフォルトルールじゃ対応しきれなくなってた
下記のような makefile で make X.a を実行した場合に,x.b y.b z.b が表示 されて欲しいのですが,表示されません. 調べて見た感じでは,「%.a: $($(basename $@))」の $@ が空になってしまう みたいなのですが,これを動くようにする方法はありますか? エッセンスだけを取り出したのでやや不自然な記述になってしまっていますが, 要は型ルールの依存ファイルに,マッチした語幹を使用したいってことです. ただし,実際には X.b に相当する記述がたくさんあるので,下記のような記述 は避けたいと考えています.また,$(eval ) バグがあるので $(eval ) の使用 も避けたいと考えています.
541 :
540 :2005/11/12(土) 21:11:08
(続き) > X.b: x.b y.b z.b > %.a: %.b > @# dummy 環境は GNU Make 3.80 です. アドバイスお願いします. ---------------------------------- X.b := x.b y.b z.b %.a: $($(basename $@).b) @# dummy %.b: @echo $@ .SUFFIXES: .a .b 書き忘れましたが,下記のような記述もなんかださいので避けたいです.現状, こうするしかないかなーと考えていますが...注文が多くてすみません. %.a: @$(MAKE) $($(basename $@).b)
>>17 にある質問と同じ内容なのですが
1ソースファイルから1実行ファイルを作るだけの処理を
一気にまとめてやるにはどういう風にmakeをかけば良いでしょうか?
ALL: ari.exe ori.exe haberi.exe imasokari.exe
>>543 ありがとうございます。
環境の違いを書くのを忘れ申し訳ありません。
とりあえずallで指定しておくんだなと思って、こう書くことにしました。
とりあえず動いていますが、なんかおかしいところがあればご指摘ください。
CC = gcc
TARGET := $(patsubst %.c,%,$(wildcard *.c))
all : $(TARGET)
% : %.c
$(CC) -o $* $<
追加。。。 環境はFedora Core 4、gcc 4.0.1、GNU Make 3.80でCのプログラムです。
546 :
デフォルトの名無しさん :2005/12/27(火) 13:12:32
オライリーからmake3版でたお
この間、第2版買ったばかりの俺に対するイジメだな。
548 :
デフォルトの名無しさん :2005/12/28(水) 15:47:52
makefileで # ---------------------------------------- SRCS = SrcDir/test.cpp\ SrcDir/Mod1/test2.cpp SrcDir/Mod2/test3.cpp depend: g++ -MM -MG $(SRCS) > dep.txt # ---------------------------------------- こうすると 出力が test.o: SrcDir/test.cpp test2.o: SrcDir/test2.cpp test3.o: SrcDir/test3.cpp こうなってしまいます。 期待しているのは SrcDir/test.o: SrcDir/test.cpp SrcDir/Mod1/test2.o: SrcDir/test2.cpp SrcDir/Mod2/test3.o: SrcDir/test3.cpp この形です。 何かdependターゲット内の記述でうまく期待した出力をさせるようにできないでしょうか?
>>548 試してないが、これでどうかね?
OBJS = $(SRCS:.cpp=.o)
DEPENDS = $(addsuffix .d, $(OBJS))
$(OBJS) : %.o : %.cpp
g++ -c $< -o $@ -MD -MP
-include $(DEPENDS)
これなら明示的に make depend しなくても、
コンパイルが成功するたびに最新の依存関係に更新されて便利。
550 :
548 :2005/12/29(木) 19:06:14
>>549 依存関係を更新しないと、コンパイルが必要なファイルが分からないので
コンパイルが成功した時に依存関係が更新されても、手遅れではないでしょうか?
今、それぞれに無理やりディレクトリを付与してしまおうと考えていて、
ここまで来ました。
depend:
$(foreach IT,$(SRCS),\
$(RM) $(IT).dep; echo "$(dir $(IT))" > $(IT).dep; g++ -MM $(IT) >> $(IT).dep;\
)
このあとcatか何かでファイルを纏めればいいと思うのですが、問題は
echo "$(dir $(IT))" > $(IT).dep;
の部分で、出力結果に改行が入ってしまいます。
この改行を入れない方法はないでしょうか?
VPATH
552 :
549 :2005/12/30(金) 00:17:51
>>550 一番最初は .o ファイルが存在しないから、
ヘッダの依存関係に関係なくコンパイルが必要なことがわかる。
553 :
548 :2005/12/30(金) 10:44:49
>>551 VPATHだと、SRCSにわざと含めていない、
別ディレクトリ内の同名ファイルがあると誤動作するんです。
>>552 既に .oファイルが存在する状態でソースコードを編集したら……?
あーあ、 .o よりソースのタイムスタンプが若いからコンパイル対象になるので
無問題なんですね……。
書き込みを拝見する前に力技で解決してしまいました。
力技とはこれ echoex.c
#include <stdio.h>
int main(int argc, char** argv)
{
for (int i = 1; i < argc; ++i)
{
if (i == 1) { printf("%s", argv[i]); }
else { printf(" %s", argv[i]); }
}
return 0;
}
これをコンパイルして実行パスを通しておいて
depend:
$(foreach IT,$(SRCS),\
$(RM) $(IT).dep; echoex "$(dir $(IT))" > $(IT).dep; g++ -MM $(IT) >> $(IT).dep;\
)
cat $(addsuffix .dep,$(SRCS)) > depend.inc
$(RM) $(addsuffix .dep,$(SRCS))
これで……解決?
554 :
デフォルトの名無しさん :2006/03/01(水) 23:24:01
別ディレクトリにあるファイルを関連付けする方法ってないですか? 例えば、ソースがカレントディレクトリ、出力が一つ下のディレクトリだと、 SRC = $(wildcard *.hoge) DEST = $(addprefix ../,$(SRC:.js=.mage)) .SUFFIXES: .hoge .mage all: $(DEST) .hoge.mage: @echo $@ $< では上手くいきません・・・ .hoge../.mageみたいに関連付けられないのかなあ
555 :
デフォルトの名無しさん :2006/03/01(水) 23:28:01
ちなみに、いまは、現在のディレクトリに出力して、下のディレクトリにコピーしてます。
>>554 パターンルール使え。 % 入ってるやつ。
DEST の定義で .js ってなってるのは書き込み時の間違いか?
あと ../ は一つ上のディレクトリだと思う。
557 :
デフォルトの名無しさん :2006/03/02(木) 00:42:40
>>556 SRC = $(wildcard *.hoge)
DEST = $(addprefix ../,$(SRC:.hoge=.mage))
.SUFFIXES: .hoge .mage
all: $(DEST)
../%.mage:%.hoge
@echo $@ $<
で行けましたー
>DEST の定義で .js ってなってるのは書き込み時の間違いか?
書き換えミスです。
>あと ../ は一つ上のディレクトリだと思う。
ああ、そっか、下でなくて、上ですね。
gnu makeでローカルなサッフィクスルールを作りたいのですが、 事情があって生成ファイルにhoge.foo.etcのように複数のピリオドを持たせています。 適切なやり方がありましたら教えてください。
>>558 パターンルール使え。 % 入ってるやつ。
560 :
デフォルトの名無しさん :2006/03/20(月) 17:23:30
Visual C++とC++Builderのmakeを両方とも使いたいのですが、どうやったらうまく切り替えられるでしょうか?
561 :
デフォルトの名無しさん :2006/03/20(月) 17:28:22
Outside the United States. If you acquired the software in any other country, the laws of the country where you live apply.
>>560 なにに困ってるのかサッパリわからん。
普通に使い分けられるだろ?
563 :
デフォルトの名無しさん :2006/03/21(火) 15:51:15
>>560 ん?VisualC++て、nmakeだから、Borlandのmakeとはコマンド違うくない?
g++ hoge.cpp -o hoge -O3 -fomit-frame-pointer -funroll-loops -march=opteron -ffast-math と直接コンパイルしたものと、 CC=g++ CXXFLAGS = -fomit-frame-pointer -funroll-loops -march=opteron -ffast-math hoge: というMakefileを作ってコンパイルしたもので、できあがったファイルのサイズが違うのですが なぜなのでしょうか?
コンパイルオプションが違うからwww
>>564 お前のその -O3 は一体何なんだと。
おっさん
90°傾いたウサギ風船
1つのMakefile で複数の exe に対応することってきますか? 1 cpp -> 1 exe で。 現状ほぼ同じ Makefile をコピーして指定したソースファイルの名前を編集してやっているのですが、 非常にめんどくさいです。 もし可能ならばさらに、カレントディレクトリにある cpp をワイルドカードばりに取得して、 a.cpp -> a.exe のようにコンパイルしていきたいです。 よろしくおねがいします。
てゆーか、make a.exe でデフォルトルールで作られるだろ。Makefile無くても。 違ったっけ?
572 :
569 :2006/03/26(日) 08:42:02
さぱーりわからん。 SRCS = hoge.cc mage.cc #もしくは $(wildcard *.cc) ? EXES = $(SRCS:.cpp=.exe) OBJS = $(SRCS:.cpp=.obj) ときてさてどうすれば?
574 :
569 :2006/03/26(日) 10:10:31
%.o : %.cc $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ みたいにかいてもなんにもならないYO. %.cc の値がどこからくるのかさぱーりわからん。
>>574 書いただけじゃ何も起こらないよ。
ゴールを指定して make を実行しないとね。
576 :
569 :2006/03/26(日) 10:19:29
>>575 make hoge.o
とやれってこと?
一度の make で全部一気にやりたいって質問だったんだけど。
読み直してみたら、たしかに書いてないな orz
>>576 make がどう動くのか、わかってないんじゃないか?
その状態じゃどうやっても無駄だぞ。
578 :
569 :2006/03/26(日) 11:36:59
>>577 all: hoge.exe mage.exe shoge.exe
hoge.exe: hoge.cpp
gcc $< -o $@
mage.exe: mage.cpp
gcc $< -o $@
shoge.exe: shoge.cpp
gcc $< -o $@
とかいたとき、make 一度で 1 cpp -> 1 exe を全部作れます。
それをいちいち hoge mage shoge だのかかないでやりたい。
できますか?
>>580 俺もお前が何がわからんのか、さぱーりわからん。
とりあえず
>>578 をパターンルール使って書き変えて動かなかった Makefile 晒せ。
%.exe: %.cpp と書いてやれよ からかってるんだろうけど不親切にもほどがある
>>578 SRCS=$(wildcard *.cpp)
all: $(SRCS:.cpp=.exe)
%.exe: %.cpp
gcc $< -o $@
>>582-583 必要な情報はそろっているのに、それだけのものを作れないのは何故か、
知りたかったんだ。スレ汚しスマンね。
586 :
デフォルトの名無しさん :2006/04/13(木) 01:08:07
gcc では、-Dマクロ指定が出来ますが、make 実行時に、外からマクロ指定を したいと思って、make -DAAA=aaa とかやってもエラーになります。 こういうことはできないでしょうか?
>>586 make CFLAGS="-DAAA=aaa"
だったような
ありがとうございました
makeしたら負けかなと思っている
590 :
デフォルトの名無しさん :2006/05/12(金) 02:30:57
rake使ってる人いる?
スレタイいいね。
そういう英語の言い回しがあるのかと思ったけど
>>1 のオリジナルなのか。
ダセエ名前だな なんでも頭文字にRつけりゃいいと思ってやがる
ほのぼのRake
595 :
デフォルトの名無しさん :2006/05/13(土) 21:43:16
MakefileならぬRakefileだしなw まあでもRuby信者の俺には、けっこう便利よ Rubyに集中できるし
makeとantだけでお腹いっぱいです。
597 :
デフォルトの名無しさん :2006/06/01(木) 19:07:06
質問。 hoge.txtとmoge.txtを それぞれ、xyzzyというツールで、 hoge.fooとmoge.fooに変換したいとします。 他の.txtというファイルは、別のツールで変換したいので、 .foo: .txt というサフィックスルールは使えません。 その場合、 hoge.foo: hoge.txt xyzzy $< $@ moge.foo: moge.txt xyzzy $< $@ といちいち書かなくてはいけないのでしょうか。 この xyzzy $< $@ という部分を共通化することはできないですか?
598 :
597 :2006/06/01(木) 19:13:49
どんなことがやりたいかというと、 hoge.foo moge.foo: hoge.txt moge.txt xyzzy $< $@ みたいに書くと、hoge.fooとhoge.txtが、moge.fooとmoge.txtがそれぞれ対応してくれないかなー ということです。
>>597 >.foo: .txt というサフィックスルールは使えません。
何で?
「.foo は .txt から作る」
「.hoge も .txt から作る」
でいいんじゃ…?
600 :
597 :2006/06/01(木) 22:02:56
あー、いや、 同時に、test.txtからtest.fooを、qwertyというツールで作りたかったりするんです。 # もしくは、xyzzyツールの別のオプションで、と読み替えられてもかまいません そうなると、サフィックスルールだと、hoge.txtもtest.txtも同じように扱われちゃって。 言葉足りなかったですね。
>>597 FOO_FROM_TXT=hoge.foo moge.foo
$(FOO_FROM_TXT) : %.foo : %.txt
xyzzy $< $@
602 :
597 :2006/06/02(金) 01:01:45
>>601 すげえ!
と思ったけどできませんでした orz
make: *** No rule to make target hoge.txt needed by hoge.foo
みたいに言われました。
gnu makeだと駄目?
こういう機能って、どっかに書いてありますのン?
604 :
597 :2006/06/02(金) 01:28:17
簡単なテストプロジェクト作ったら、
>>601 で、うまく動いた
んー、本プロジェクトで動かないのは、別な要因があるようです(´・ω・`)
探ってみます。
>>603 マニュアルにもちゃんとあるんですね。サンクスです。
605 :
597 :2006/06/02(金) 02:08:51
わかりました。
>>603 のは言っていたのは、正しいです。
本プロジェクトは、hoge.txtがありませんでした。馬鹿だ。
で、どうも根本的にやりたいことを勘違いしておりました orz
hoge_foo_bar.txtやmoge_foo_bar.txtを、hoge_test_bar.foo、moge_test_bar.fooにしたいのでした。
つまり、
hoge_foo_bar.txt→hoge_test_bar.txt
moge_foo_bar.foo→moge_test_bar.foo
という変換をxyzzyというツールで、行いたいのです。
うまいことできないかなー。
606 :
597 :2006/06/02(金) 02:09:33
違ってました orz hoge_foo_bar.txt→hoge_test_bar.foo moge_foo_bar.txt→moge_test_bar.foo でした。
607 :
597 :2006/06/02(金) 02:20:15
また、違った・・・ hoge_foo_bar.txt→hoge_test_bar.foo moge_foo_qwerty.txt→moge_test_qwerty.foo 真ん中のfooとtestだけ違うんです・・・。
608 :
597 :2006/06/02(金) 02:25:17
%test%.foo: %foo%.txt なんとかかんとか とすると、うまく行かないみたいです。 TARGET = hoge_bar_test.foo moge_xyzzy_test.foo で、 %test.foo: %foo.txt なんとかかんとか だとうまくいきます。 %って2回は使えない罠? 名前を変えるところ(foo→test)を最後に持ってくるしかないのだろうか。
>>608 % はいっこじゃないとだめ。いっこなら、頭でも途中でもいい。
610 :
597 :2006/06/02(金) 19:23:49
了解です。 ファイル名変更して、 %test.foo: %foo.txt で、いこうと思います。
>>1 超いまさらだけど、スレタイ、せっかくだから頭文字mで統一したら?
make makes a massive mess
とか。
>>611 語呂が悪い。
make makes many messes のほうがいいかな。
613 :
デフォルトの名無しさん :2006/08/01(火) 14:00:24
暗黙ルールを使うと ルール連鎖の中で生成された中間ファイルはmakefileにより特別扱いされる。 中間ファイルはターゲットとしては現れず、削除される。 という動作になりますが、これが明示的ルールと同様の動作になるやり方を教えてください。 つまり、 1. 中間ファイルがそのまま残る。 2. (全然別系統もしくは手動による)中途ファイルの変更があったときは、 その中間ファイルからmake処理が行われる。 というようにしたいのです。
>>613 何か勘違いしてると思うよ。
中間ファイルは削除されたんじゃなくて、もともと無かったんだよ。
>>614 makeを実行すると、こちらの書いたルール通りに実行し、
directoryに中間ファイルがたくさん作られているのが見えます。
また、最後に
rm hoge huge .........
と中途で生成された大量のファイルをrmしているのが見えます。
>>615 それは「暗黙のルール」じゃないんじゃないか?
make -pして、何が問題なのかもう一度考えてみるべし。
619 :
デフォルトの名無しさん :2006/09/03(日) 21:28:12
GNU makeで複数の拡張子に同じルールを適用したい時に何度も同じものを 書かずにすむ方法はないでしょうか。 たとえば以下の3つのルールを1つにまとめることはできないでしょうか。 %.x: %.abc command1 command2 command3 %.x: %.def command1 command2 command3 %.x: %.ghi command1 command2 command3
>>619 これじゃ駄目か?
%.x:
command1
command2
command3
>>620 それだと$<が空っぽで使えませんでした。
commandの中で$<と$@を参照してます。
>>621 じゃ、続けて
%.x: %.abc
%.x: %.def
%.x: %.ghi
って追加すると、解決できないかね?
駄目だったら define 使えばいいんだけどね。
>>622 それだと %.x: %.ghi だけルールが設定されて、
他のルールはコマンドなしのためにキャンセルされないですか?
>>623 コマンドなしのルールはキャンセルされるって、どこで仕入れたガセネタだ?
>>624 勘違いでした。暗黙のルールをキャンセル方法でした.
結局
>>622 の方法でも $< は空っぽでした。
>>625 実際の依存関係を設定してないんじゃないか?
%.x:
echo $@ $<
に続けて
a.x: a.abc
と書けば a.x a.abc が出力されるだろう。
>>626 ファイル一つ一つ書かないとダメですか?
>>627 スタティックパターンルールでもいいぞ。
$(ABC_X_FILES) : %.x : %.abc
$(DEF_X_FILES) : %.x : %.def
630 :
デフォルトの名無しさん :2006/09/04(月) 00:15:41
makeから、rakeに乗り換えた。 Ruby使いには、rakeはいいねえ。
mingw + GNU make + コマンドプロンプトを使っとる make[1]: Entering directory ... の後に表示されるディレクトリ名を絶対パスから相対パスにしたいんだがどうしたらいい? 結果が長くてうっとうしい うっとうしい以外に害は無いんだけどね
そういうパッチあてなされ
633 :
631 :2006/09/16(土) 01:52:48
>>632 やっぱ大元に手を加えないとダメか
パッチ見つからんからソース眺めてみるわ・・・
どうもありがとう
>nmake love Microsoft (R) Program Maintenance Utility Version 6.00.9782.0 Copyright (C) Microsoft Corp 1988-1998. All rights reserved. NMAKE : fatal error U1073: 'love' のビルド方法が指定されていません。 Stop. 。・゚・(ノД`)・゚・。
635 :
デフォルトの名無しさん :2006/09/17(日) 16:43:39
emacsでMakefile中でもCtr-C,Cを押したらコンパイルする技を 昔ネットで見たのですが忘れてしまいました。 どなたか教えてくれませんか?
>>635 (add-hook
'makefile-mode-hook
'(lambda ()
(local-set-key "\C-cc" 'compile)
))
>>631 そういうフィルタを書くというのは、よくやるなぁ。
ついでに注意すべき warning なんかを強調してみたりとか。
>>630 rakeの日本語の資料はどこを見ればいいのかな?
機能をmakeと対比してあるとありがたい。特に再帰処理関係で。
>>636 ありがとう。これでコンパイルが大分楽になる。
lispわかんないと一流のプログラマーにはなれないな。
がんばるよ。
641 :
デフォルトの名無しさん :2006/10/20(金) 21:26:55
lispの出来損ないみたい>>makeの文法
642 :
デフォルトの名無しさん :2006/10/21(土) 06:04:16
lisp厨乙
643 :
デフォルトの名無しさん :2006/10/27(金) 12:04:18
一応確認、まぁ誤植だと思うけど
GNU MAKE
ttp://www.amazon.co.jp/GNU-Make/dp/4873112699/ 7章 ポータブルなmakefile P129
・・・次に各プラットフォームごとにどういったツールが使えるのか明らかにし、どれを使うのか
明らかにしなくてはいけません。対象となるすべてのプラットフォームで利用可能なツールや機能だけを
使うのが究極の姿です。これは「最小公倍数方式」と呼ばれ・・・
数学しなくなってだいぶたつし、原文読んでないけど、
これって「最小公倍数」じゃなくて「最大公約数」だよな?
>>643 原文見てないけど、「最小公分母」の誤訳でしょ。
nmakeってsubstとかpatsubstに相当するものないの?
暗黙のルールで hoge.cc -> hoge.o -> hoge の順番に作りたい時、 hoge.o -> hoge のときにg++じゃなくてccになっちゃうんだけど、 これってCC=g++にしておくしかない?
648 :
646 :2006/12/04(月) 02:15:54
>>647 .cも混在してるときに、.cもg++でcompileするでしょ。
そのときに生成されるhoge.oが、
g++ -c hoge.c -o hoge.o
cc -c hoge.c -o hoge.o
で全く同じものになるのかが分からなかったので。
man gccしてみろ。
>>648 ccでリンクできてるなら、それでまったく問題ない。
g++のときは暗黙に -lstdc++ がつくだけ。
651 :
デフォルトの名無しさん :2007/01/04(木) 21:43:34
a.cpp, b.cpp, c.cpp, ... とファイルが沢山あるとき、各々のファイルに対してgrepした結果を a.log, b.log, c.log とログにしたいんだけど、どうかけばいいですか? INFO: grep COMMENT $(SRCS) > $(LOGS) みたいにやったら全部のソースを一変にgrepしようとしやがりました。 そうじゃなく個別にやりたいです。
それは make でなくシェルスクリプトの話かと。 for i in *.cpp; do grep COMMENT $i > `echo $i|sed -e 's/\.cpp/.log/'`;done とか。
654 :
デフォルトの名無しさん :2007/02/13(火) 22:23:13
rakeってC++をmakeできますか?
___/ 冫 ∧_∧ ∧_∧ _ __ (_ / (´∀` ) ( ´∀`)/ ) ) | | // \ ( ⊃/ // ∧_∧ (__(_/` | \__// ( ´∀`) _///  ̄ ∪ ̄∪ (__(__)
656 :
デフォルトの名無しさん :2007/02/15(木) 03:19:04
>>654 makeの意味わかってる?
gccでコンパイルとか言うのなら、rakeでできるよ。
Makefileがあって、それをmakeしたいのなら、rakeではできない。
makeを使おう。
makeは簡単だけどautotoolが全然わからねえ。 まじむずい。autoconf、automake、Makefile.am Makefile.in、configure.inまじややこい。
>>657 最初は手書きMakefileでいいさ。
おれもmakeはいいけどautotoolsキライ makeごと捨て去ってもいいんだけど なんか他にいいビルドツールないかな?
階層が錯綜してるときのmakeって書くのにうんざりするんだけど、 もっと楽ちんなものないのかなあ。
rakeとantくらいしかとっさには思い出せないな……
共有ライブラリを作らないんだったらautoconf, automake は大体OKだけど。共有ライブラリを作ろうとすると否応無しにで出てくるlibtoolが大嫌いなので書いてみる。 libtoolはクロスコンパイルで「共有ライブラリとそれを利用する共有ライブラリから構成されるパッケージ」を作ることを殆ど考慮してない。 クロスコンパイルだとインストール先ターゲットは/hoegeho/foo/bar とか適当なやつにならざるを得ないケースが多い。 とても/usr/* などにはしてられない。ところがそういう環境だとmake install で「パスのプリフィックスが違います」 エラーが出るわけですよ。実にくだらないんです。だってWindowsだとチェックしないんですから。非Windows環境でやってると結構はまります。 個人としては人生の無駄だし、法人としても無駄なコストです。 その嫌がらせチェックをしている3行程度をコメントアウトすれば平和になるワケだけど。 そうしないと、クロスコンパイル環境でまともに通せるようにするには、 1. 共有ライブラリをnoninst_LIBRARIESにして 2. 展開後のMakefileのルールをMakefile.am に書いてmakeさせ 3. 展開されたあとのinstall処理をMakefile.am に書いておく くことになるんです。実に馬鹿げてます。本末転倒です。 もしあなたが共有ライブラリを作成してそれをデバッグする必要があるのでしたら、普通に(automakeではなく)伝統的な手書きの makefile を作成してください。 テスト対象の共有ライブラリは -rpath オプションを使ってテストプログラムにリンクしてください。そうすればあなたは最初から共有ライブラリ内にブレークポイントを 設定できるでしょう。変なシェルスクリプトを噛ます必要は無いのです。 autotools、特にlibtoolは開発者のためのツールではないと認識することが大切です。
仕事でjam使ってます。サッパリわかりません
664 :
デフォルトの名無しさん :2007/04/24(火) 17:30:42
>>664 Makefileより見た目ゴチャゴチャしててなんかいやだな。
666 :
デフォルトの名無しさん :2007/04/24(火) 21:33:43
>>665 見た目も何もRubyプログラムそのものですからね
Ruby知ってたら、すごい楽できるよ
>>665 ゴチャゴチャしてるという印象はこのへんかね。
ターゲット(タスク)を裸で書けない(文字列かシンボルで書く)
ファイル名単独じゃなくて、いちいちfileと書く
:ではなく=>
doとかendとか付ける
外部コマンドをそのまま書けない
>>664 ダグラス・アダムズネタが混ざってるな 。
Cプログラマ向けにCの文法で書けるCakefile(ケーキファイル)なんての を妄想してみたが、Rubyだとブロックで書くところを関数に抜き出さないと いけないから書きにくいな。C++でboost使うとlambdaっぽいことができる からマシになるのかな。
lakeやらpakeが強いかも。元々適当な言語だし。
lakefileは普通のプログラムと見かけ大差なさそう。 pはperlだろうが lispつながり(?)でprologを連想。 ホーン節って依存関係定義そのものだな。
dake
やっぱ俺Makefileでいいや・・・
673 :
デフォルトの名無しさん :2007/04/25(水) 01:23:22
delake VBake make#
674 :
デフォルトの名無しさん :2007/04/25(水) 01:37:29
rakeで依存関係をgccに解決させたりしてるときにどう持ってくればいいんだ?
require 'rake/loader/makefile' file '.depend.mf' => そーす do |t| sh 'gcc -M ...' end import '.depend.mf' だろうか。
678 :
デフォルトの名無しさん :2007/04/25(水) 23:22:53
680 :
奉祝スレ5周年 :2007/08/17(金) 21:40:54
GNUmakeで--debug=のコマンドで使用できるフラグについて 資料or情報はありませんか? 片っ端からトライしたところ iajvbm の6文字が何らかの機能を 持っているようですが。 巨大makefileのデバッグに使用したいです。 > make -v GNU Make 3.81 : : This program built for i686-pc-cygwin >
普通に info に載ってるけど。 man にも簡単な説明が出てる。
682 :
デフォルトの名無しさん :2007/08/23(木) 02:41:13
このスレ見ててもグチばっかだし、ほんとにmakeって使えないと思う。 (autotools含めてバッドノウハウの塊だと思う) 何故代替品は出てこないんだろう? オープンソース界隈で普及しすぎて、デファクトになっちゃったのが原因なのかね。 マイクロソフトの独占なんかより、makeの独占を禁止してほしい。
>>682 ant, bjam, rake, SCons とかは代替品とは言わんの?
autotoolはともかくmakeは無いと困るだろ。
>>682 makeも使えない奴はたいしたコードはかけないし、
make使える奴は代替の必要を感じない
そういう意味でsubversion開発者は実に偉大だ
686 :
デフォルトの名無しさん :2007/08/26(日) 22:45:52
687 :
デフォルトの名無しさん :2007/09/05(水) 19:03:57
688 :
デフォルトの名無しさん :2007/10/03(水) 18:54:33
makeが成功した後に自動的にcleanを実行するようにすることはできませんか?
689 :
デフォルトの名無しさん :2007/10/03(水) 19:00:26
make allの最後に、make clean呼ぶようにするだけでは?
>>689 作った物消すのって何したいん?、コンパイルチェックだけ?
691 :
デフォルトの名無しさん :2007/10/03(水) 20:25:19
ただ、FreeBSDのportsシステムのmakeファイルにはうんざり
692 :
デフォルトの名無しさん :2007/10/16(火) 09:10:29
WindowsでMakefileをダブルクリックで開けるようにはできないでしょうか?
>>692 できるよ
ただし他の拡張子のついてないファイルもダブルクリックでmakeされちゃうけど
694 :
デフォルトの名無しさん :2007/10/27(土) 01:05:58
>>692 >>693 の問題があるので、俺は、適当に、batファイル書いて、クリックしてるけど
cygwinコンソール開くの面倒な時も多々あるw
Makefile.mak にすりゃいいんだ
質問させてください。 サフィックスルールで、元と後が同じ拡張子のものはかけますか? 現在画像からサムネイルを作るMakefileを作っています。 1度すべて作った後は元画像が変更されたもののみ作りなおしたいです。 現状以下のように各ファイルに対して1ルール作っています。 THUMBNAIL/001.JPG : IMG/001.JPG convert -geometry 150x150 IMG/001.JPG THUMBNAIL/001.JPG THUMBNAIL/002.JPG : IMG/002.JPG convert -geometry 150x150 IMG/002.JPG THUMBNAIL/002.JPG これをサフィックスルールで「.JPG.JPG : 」のように書きたいのですが、 元と後が同じだとうまくいきません。 どうかよろしくお願いします。
>>697 それ循環定義になるならムリだと思う。
ただ現実的な解決方法としては
jpeg と jpg にしてしまうとか。
もしくは 一旦別の拡張子のファイルを touch して
jpg -> jpg コンバートかますとかならやれそう
>>697 THUMBNAIL/%.JPG : IMG/%.JPG
convert -geometry 150x150 $< $@
700 :
697 :2007/12/24(月) 15:56:38
>>698 ありがとうございます。
>もしくは 一旦別の拡張子のファイルを touch して
初めに思いついたのがこれだったんですけど、これだと一時ファイルをとっておく必要があるんですよね・・・
>jpeg と jpg にしてしまうとか。
これがいいですかね
>>697 全然サフィックスルールじゃないけど
SRCJPG = ${shell ls IMG/*.JPG}
${SRCJPG}: TUMBNAIL/%.JPG: IMG/%.JPG:
convert -geometry 150x150 $< $@
という感じじゃダメかな。
(Windowsならlsをdirとかに変えて)
702 :
697 :2007/12/24(月) 16:14:05
>699,701 これだ!ありがとうございます! うまくいきました
703 :
デフォルトの名無しさん :2007/12/30(日) 12:19:08
makeで普通.cppを修正するとそこだけコンパイルしてくれますよね? .hを修正してもコンパイルしてくれないのですが、どうしたらいいですか? 誰か教えて
依存関係が足りないから。 $ g++ -MM で出てくる依存関係をMakefileで読み込むようにしとけ
705 :
デフォルトの名無しさん :2007/12/30(日) 13:59:11
b.x: e.x a.x: b.x c.x d.x %.z: %.x hoge $^ のようなルールを記述して make a.z を実行したときに, hoge a.x b.x c.x d.x e.x というコマンドを走らせることはかのうでしょうか? a.z: a.x b.x c.x d.x e.x というルールを記述することは避けたいです.
706 :
デフォルトの名無しさん :2007/12/31(月) 15:47:10
age
707 :
デフォルトの名無しさん :2007/12/31(月) 16:53:06
阪大外国語学部の椿原慎二くんは昔からゴム付けてくれませんよ。 なんか顔もゴリラなんだけど、あのときはまさに野獣になって、日本語もさえも通じなくなる。 まがりにも外国語学部イタリア専攻で行ってるんだけど、あれじゃ外国語とか言うよりもゴリラ語。 きっとボブサップもあんな感じなんだろうな。ただ椿原慎二のチンコはサップに比べると小さいし臭いけどね。
こ こ で も 椿 ○ 粘 着 か 年の瀬だっちゅうのに悲しくないのかね
709 :
デフォルトの名無しさん :2008/01/08(火) 20:41:34
UNIX Cシェルのmakefileで、 外部の環境変数が設定してあるファイルを makefileの中から読み込むことって出来ますか? 出来るなら方法を教えてください。
include 実例が見たければ、linux のソースなんかで使われているので grep -n include /usr/src/linux/Makefile でも汁
711 :
デフォルトの名無しさん :2008/01/10(木) 21:44:05
>>710 おお。ありがとうございます。助かりました。
働いたらmakeかな?
GNU makeなんですが、 CC=bcc32 all: ${CC} hoge.c というようなmakefileを実行する時に make -e CC=gcc として${CC}をgccに変更して実行させたいのですが、うまくいきません。 コンソールにそのまま gcc hoge.cと表示されてしまいます。 -eで書き換えた変数はサブシェル?として実行されないのでしょうか・・・?
すいません。
>>713 です。
makeよぶシェルに-nつけてました。アホでした。
715 :
デフォルトの名無しさん :2008/02/01(金) 19:39:29
gccとmakeで並列コンパイルはできますか?
>>715 makeの-jオプションのことでいい?
それとも、複数のホストで分散コンパイルするという話なら
distccでぐぐるといいかも。
717 :
デフォルトの名無しさん :2008/02/13(水) 15:12:44
nmakeが常に、すべてのソースをコンパイルしようとします。 最新のものはコンパイルしないようにするにはどのようにしたらよいのでありましょうか?
Makefileを確認したら?
>>717 依存関係の書きかたを間違えてるんじゃないの?
720 :
デフォルトの名無しさん :2008/02/19(火) 08:37:35
OSによって、gccとclを使い分けたいのですが、LinuxとWindowsによってコンパイラを変えるにはどのようにしたらよいのでしょうか?
721 :
デフォルトの名無しさん :2008/02/19(火) 09:48:35
>>720 C++ sourceで書けばいいんじゃね?
722 :
720 :2008/02/19(火) 10:18:42
もう少し詳しく教えていただけないでしょうか? ifの様な構文を使って CC=cl と CC=g++ を切り替えたいのですが
>>720 ,722
どのmakeをお使いですか?
GNU make、BSD make、nmake、それぞれやり方が違うと思われ。
724 :
720 :2008/02/19(火) 11:14:26
GNU makeとnmakeです。
725 :
デフォルトの名無しさん :2008/02/19(火) 11:27:07
つか、nmakeとGNU makeって全然違うようなキガス
そうなのですが、それに対して、同じMakefileを使えるようにする方法はないものかと思案しています
なにか方向を間違っているような気がします.
>>724 共通のMakefileではムリじゃないかなあ。
条件分岐はGNU makeだとifeq/ifdef、nmakeだと!IF/!IFDEFだし。
ふつうは、プラットフォーム毎にMakefileを用意したり生成したりする
のではないかと。
これは・・・・いったい・・
1.気の利いた洒落のつもり 2.くだ質スレだと勘違いした 3.じつは人類滅亡の予言
732 :
デフォルトの名無しさん :2008/02/19(火) 13:38:57
ヘ ,ヘ / ヽ, ::. / ::. / :::. ″<●> <●>::. | 、_,、_, ::::. | !.ノ ::::::::: / ..::::. / :::::
733 :
729 :2008/02/19(火) 13:47:30
正解は2番……_/ ̄|◯
普通は makefile.vc makefile.gcc makefile.cygwin makefile.tcc makefile.pl makefile.rb makefile.cobol のように分けますね
jオプションで並列コンパイルをしています。 これを毎回指定しないでも並列コンパイルする方法はないでしょうか? OSはFedora8、コンパイラーはintel10です。
なぜその方法を知りたいのかが知りたいなぁ。
737 :
デフォルトの名無しさん :2008/02/19(火) 18:50:15
alias make='make -j'
あなたは奇妙な感覚に包まれた -more-
>>735 GNU make自身には-jのデフォルト値を変える手段はないですね。
737みたいにエイリアスにするか、シェルスクリプトにするか。
cmakeとsconsのが綺麗でよいよな。 linuxカーネルとかbbみたいなオプション出てこないのもよい。 見た目だけでしか判断できないので。
741 :
デフォルトの名無しさん :2008/02/26(火) 23:51:30
#ifdef AAA (コード) #endif みたいなのがソース中に書いてあって、これをmake時に、define したいのですが、 $ make CFLAGS="-DAAA" とすると、もとのMakefileで指定されていたCFLAGSが 上書きされてしまいます。CFLAGS+="-DAAA" のように追加指定で make 時の コマンドライン上で指定って出来ないのでしょうか?
CFLAGSはユーザーが定義するものだから、Makefile側ではそのまま使わない。 $(CC) $(CFLAGS) $(MYCFLAGS) -o (ry
*.ppmとか*.pnmといった各種画像から*.jpgを生成したいのですが、 .pnm.jpg:; cjpeg-mmx $^ > $@ .ppm.jpg:; cjpeg-mmx $^ > $@ .pgm.jpg:; cjpeg-mmx $^ > $@ .pbm.jpg:; cjpeg-mmx $^ > $@ # 特定ファイルについて特別な変換をする場合は明示的に書く hoge.jpg: hoge.ppm convert -normalize $^ $@ のようにサフィックスルールを沢山書くのではなく、 %.jpg: $(wildcard %.pnm %.ppm %.pgm %.pbm) cjpeg-mmx $^ > $@ # 特定ファイルについて特別な変換をする場合は明示的に書く hoge.jpg: hoge.ppm convert -normalize $^ $@ のようにルールを動的に作り、コマンド列は一箇所にだけ 書けばいいようにしたいと考えています。 上の %.jpg: $(wildcard ...) は、まあ、動かないのですが、 何かうまく動かす方法はないでしょうか?
filter-out あたりをつかって別に分けるかなぁ。
要は %.jpg: $(wildcard %.pnm %.ppm %.pgm %.pbm) のルールが実行時に hoge.jpg の依存関係を調べる瞬間に 展開されてほしいわけで、 %.jpg: $(filter %.p*m,$(PNMFILES)) なども考えましたが、ルール右側で関数を呼びつつ、その引数として 左側のパターンのファイル名を渡す方法がどうもわからないのです。 makeを触るのは数年ぶりで、正直簡単なことに詰まっているだけなのか、 それとも元々難しいのか判断に迷ってここに質問してみました。
去年までUNIXでMakeをばりばりに使っていました。 # あ、プログラマじゃないよ。大規模プロジェクトの管理だけどね でもちょっと部署が変わって Windowsなどという邪悪な環境下お仕事する必要が生まれました。 Windows XPで使いたいのですが、どこからmakeをだうそ出来るですか? つまらない理由で、コンパイルさせてもらえないので、バイナリで だうそしたいです gmakeでもBSDの旧makeでも何でもいいです
>>746 日本語でOK。
考えられるのは、MS謹製のVisualStudioについてくるnmakeかCygwinのgnu-makeかね。
>>747 ありがと
でも私は日本人ですから日本語不自由ありません
人に質問するような文章なら、最低限以下の注意くらいしてもよかろう。 ・句点を忘れずに。 ・奇妙な造語は避ける。 ・読む人間の視点で冷静に読み直す。 処で、コンパイルさせて貰えないのに拾ってきたツールは使ってもいいの?
>>746 msysにバイナリのgmakeが入ってる
Current Release: msys-1.0.10 (2004-03-16 05:47)を落とすよろし
今日sconsインストールしてみたが、これ今までVC8で使ってた香具師は世界に存在しないの? IDEで指定したインクルードパスが認識されないって相当ウンコなバグだと思うんだが。
>>751 確かにウンコなバグだ!
問題箇所は鏡があればすぐに見つけられるだろう
754 :
751 :2008/05/26(月) 00:20:02
生憎鏡は洗面所にしかないので使ってないけど問題箇所はすぐに見つかったので一応報告はしておいた。
>>754 姿見くらい持った方が良いと思うんだ、でもレポート乙です。
rantというものもあるんだな・・・ 色々多すぎてどれがいいかわからん>< schemeベースのやつがあればいいんだけど
757 :
デフォルトの名無しさん :2008/06/19(木) 15:29:27
test: [tab]ls noexistent; true このMakefile、FreeBSDのmakeだとエラーで止まってしまう。 GNU make だと止まらない。 どっちが正しいのですか?それともこれは未定義ですか?
パターンルールを使って *.c → *.o の生成ルールを省略したいけど、 ソースファイルごとに違うコンパイルオプションを付加したいこともある これってどうにかしてうまくやる方法あるかなあ?
>>757 Cent OS 5にて
$ make --version
GNU Make 3.81
Copyright (C) 2006 Free Software Foundation, Inc.
これはフリーソフトウェアです. 利用許諾についてはソースを
ご覧ください.
商業性や特定の目的への適合性の如何に関わらず, 無保証です.
This program built for i686-redhat-linux-gnu
$ make
Is noexistent; true
/bin/sh: Is: command not found
止まったけど……
>>759 マジか!
あっさりできるのか!
トン
別件だけど、もしかして GNU make ならコマンドラインから make 変数に値を追加したりできる?
variable += 〜 って Makefile 内でしかできないよね?
ちなみに今は
CFLAGS = 〜 $(OPT)
みたいにあらかじめダミーの make 変数を設定しておいて
コマンドラインから OPT= で設定してる
>>761 コマンドライン引数の処理は Makefile の処理の前処理だから、追加は無理でしょ。
CFLAGS みたいにコマンドライン引数で設定される変数は Makefile 内では設定せずに、
ルールのコマンド内で最後に指定するのが、マナー(?)、じゃないか?
>>760 Isじゃなくてlsです。Isだとそこでシェル全体がエラーを返してしまいます。
てかlsなんて使わないで、例としてはこれでよかったですね。
test:
[tab]false; true
こちらのGNU make も 3.81です。
動作が違う理由は知らないけど、そういう場合はふつう false || true と書く。
765 :
757 :2008/06/20(金) 16:08:09
いや、これはあくまでも例示のためのコマンドで 実際はエラーかどうか関係なくtrueの部分にあるコマンドも実行してくれなきゃ困るので ||じゃだめです これが、FreeBSDのmake がおかしいという結論なら GNU make を使ってねというポリシーにしようかなと思っています。
むかし、たしか「Cシェルフィールドガイド」で読んだのだが、 大昔のCシェルは&&と||の動作が逆だったらしい。 (CライクなだけにCと一緒で、0が失敗だった) &&だったらどうなりますか。 あるいはSHELL=/bin/shと明記して実行してみるとどうなりますかね。 でもmakeで動くのはデフォルトで/bin/shだよなーJK
だああ、&&でも||でもなく;でしたね。
>>762 そうなん?
CFLAGS って普通はコマンドラインで指定されると仮定して
Makefile 内では設定しないものなのか…
アーキテクチャ指定とか必ず付けたいコンパイルオプションがあるのだが
昔のDOS用のmakeにも、実行行を必ず実行コマンドとして実行しようとするものと 実行(exec)不可ならばシェルを起動してそれに渡すものがあった気がする。 つまり、実行行に";"や"&&"等が含まれる場合にシェル経由になるか(或いは自身で解釈して実行するか)は 各makeに依存するんじゃないかな。 パイプやリダイレクト等も含めて。 で、必ず複数を実行する(";"でつなげる)ならば、シェルを起動するようにしてみるとか。 最後のコマンドのステータスが必要なら、別途シェルスクリプトを書いてそれを実行するとか。 いや、うまくいくかは知らないけどね。
:= ならどうよ
gcc の Makefile の変数定義で = を使うところで := とする方法もあったかと思ったのだ
776 :
デフォルトの名無しさん :2008/06/22(日) 01:31:07
>>769 なるほど、んじゃBSD make 用になにか考える方向ですかね…
shell scriptでは、 cat <<EOF > doc.txt hoge EOF とすれば、中身がhogeのdoc.txtが生成されます。 しかしMakefileの中で、 doc: cat <<EOF > doc.txt hoge EOF とやっても、 $ make doc make: hoge: Command not found となってしまいます。 どうやったら、shellと同様の操作をMakefileの中で行えますか?
1行ずつ$SHELLで解釈されるから、 [TAB]echo hoge > doc.txt [TAB]echo hoge2 >> doc.txt くらいしか思いつかね。
780 :
777 :2008/06/26(木) 13:47:45
>>778-779 ありがとうございます。
実際にはあるソフトを立ち上げて、
それにコマンドを打ち込むという作業なので、
結局shell scriptを作りました。
すみません。皆さんの力をかしてください。 makeを長い事使っているのですが、あんまり踏み込んで使った事はありません。 今回もこった事をするつもりはなかったのですが、なんか基本的なことでつまずいてしまって困っています。 以下の例のように、Makefileがあるディレクトリとは別のディレクトリに ソースコードがあり、コンパイルしてできるオブジェクトも別ディレクトリに 置きたいという状況で、暗黙のルールを使うと以下のように nothing to be done といわれてなにもコンパイルしてくれません。なぜダメなのかまったく理解できません。 srcかobjをやめたり、暗黙のルールをやめれば期待通りにコンパイルしてくれるのですが、今回それはやめられないので困っています。 暗黙のルールを使うのは、なにか別の方法で同じことができればそれでもよいのですが...make gruのアドバイスをお願いします。
$ cat /etc/redhat-release CentOS release 5 (Final) $ make -v GNU Make 3.81 This program built for i686-redhat-linux-gnu $ cat Makefile %.o: %.c cc $< -o $@ all: obj/foo.o obj/foo.o: src/foo.c $ ls -lR .: total 24 -rw-r--r-- 1 hunya hoge 83 Jun 29 05:21 Makefile drwxr-xr-x 2 hunya hoge 4096 Jun 29 05:21 obj drwxr-xr-x 2 hunya hoge 4096 Jun 29 05:22 src ./obj: total 0 ./src: total 8 -rw-r--r-- 1 hunya hoge 29 Jun 29 05:22 foo.c $ make make: Nothing to be done for `all'.
783 :
781 :2008/06/29(日) 09:31:13
自己解決しました。 パターンルール %.o: %.c は obj/foo.o: src/foo.c にマッチしないようです。 パターンを obj/%.o: src/%.c に変更すると期待の動作をするようになりました。 実際には以下のように書く事にします。 OBJDIR=obj/ VPATH=src ${OBJDIR}%.o: %.c ${CC} -c $< -o $@ {OBJDIR}foo.o: foo.c 今回も人にきちんと質問すると自己解決することがあるという典型例でした。。。 あと一晩寝ると解決するともいう。 皆さんありがとうございました。
ディレクトリを移動してmakeするようにmakefileを書けばいいと思ったらそういう解決策を見つけたか。 なるほど。
中括弧かっこいい
角括弧こそがカクイイ。
せっかくだから俺はこの中空鉤括弧を選ぶぜ
カーリーブレイス・・・ 鉄の絆・・・
builditってのもあるのか 色々あるんだなぁ
791 :
デフォルトの名無しさん :2008/07/18(金) 19:09:33
buildbotとかいうのもあったぞ 確かPython製
makeの書き方わからなくて修正できないヽ(`Д´)ノウワァァン
Makefileといわずにmakeとな
あぁMakefileだわ・・・ makeはバイナリであるね・・・
最近、コンパイルコマンドが並んだだけのスクリプト(バッチ)を 実行することをmakeと呼んでいる状況に遭遇した不運な香具師は いる?
それをビルドと呼ぶ馬鹿はいた。
runhaskell configure runhaskell build runhaskell install
> それをビルドと呼ぶ馬鹿はいた。 ? ビルドに明確な定義があるか? コンパイルとかリンクとは根本的に違うだろ
コンパイルやリンクの手順をスクリプトに書いて、それを実行する事を ビルドと呼ぶのは、とても正しい気がする。
IDE上でコンパイルするとビルド?
python setup.py --configure python setup.py --build python setup.py --install
ビルドの負荷を軽減させるためにできたのがmakeだからな
803 :
751 :2008/08/14(木) 11:45:37
scons1.0.0が出たがバグが修正されていなかった件について いいのかよそれで
誰も報告しなけりゃそのままだろうな
805 :
751 :2008/08/14(木) 21:56:59
だから報告したんだってばさ。 優先度高いから直すよって返事までもらったのに。
おぉ、それはすまなかった。
lispのdslとして実装されたMake replacementは無いんですか? rakeやsconsのscheme, common lisp版みたいなの なかったら自分で作りたいぐらいに欲しいのですが、もうあるよというならば情報おねがいします
809 :
デフォルトの名無しさん :2008/09/13(土) 17:24:02
cokeとかpepsiみたいなのの派生みたいなのでありそうだけどな
働いたらmakeだと思っています
811 :
デフォルトの名無しさん :2008/09/13(土) 22:12:55
>>749 俺は2ちゃんなどの掲示板の書き込みなら文末の句点は省略されてても気にしないがな。
それより適当な位置で改行し、適度に読点を入れて欲しい。
先輩お願いです、すっげぇでっかくなったMakefileにこっそりlove:を入れるのやめてください
815 :
デフォルトの名無しさん :2008/11/08(土) 19:25:09
最新のcygwinを使ってます。 以下の実装で以前は動いていたんですが、最近 -------------------------------------------------------- %.obj: %.cpp @echo $< @if [ ! -d dotDep ]; then mkdir dotDep; fi @$(CC) $(CFLAGS) /showIncludes /TP /c /Fo$@ $< > dotDep/$*.d0 \ || ( $(SED) -e '1{/$</d;}; /^Note: including file:/d' dotDep/$*.d0; exit 1) @$(SED) -e '1{/$</d;}' \ -e '/^Note: including file:/d' dotDep/$*.d0 @(echo '$@: \' \ && $(SED) -ne '/^Note: including file:/ { \ s|\\|/|g; \ s/^Note: including file:[ ]*//; \ s/$$/ \\/; \ s|^\(.\):| /cygdrive/\1|; \ p; \ }' dotDep/$*.d0 \ && src=`$(SED) -ne '/^#line 1 /{s/.*"\([^"][^"]*\)".*/\1/; h;}' \ -e '8{x;p;q;}; $${x;p;q;}' $<`; \ && echo "$${src:-$<}") > dotDep/$*.d1 @mv dotDep/$*.d1 dotDep/$*.d ------------------------------------------------------------------ /bin/sh: -c: line 10: syntax error near unexpected token `&&' /bin/sh: -c: line 10: ` && echo "${src:-game.cpp}") > dotDep/game.d1' 実行すると上記のエラーになります。 どこが間違ってるのでしょう?
make関係なくね
818 :
デフォルトの名無しさん :2008/11/16(日) 01:17:43
改行文字というか、エンコードをeuc-jp-unix,euc-jp-dos,shift-jis-dos,shift-jis-unix でためしても同じエラーが出る 構文かな?
うちじゃ改行文字がlfのみでもcrlfでも問題なくコンパイルするな。 $ make --version GNU Make 3.81 Copyright (C) 2006 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This program built for i686-pc-cygwin $ uname -a CYGWIN_NT-5.1 achernar 1.5.25(0.156/4/2) 2008-06-12 19:34 i686 Cygwin
あれはmakeが吐いてるエラーじゃなくて、シェルが吐いてるエラーでしょ。
>>815 make -nでコマンド行をプリントさせて、
それをshで実行してみる。そしてデバッグ。
822 :
デフォルトの名無しさん :2008/11/17(月) 17:25:51
複数のディレクトリに分けたソースから一つのDLLを生成するMakefileはどうやってかく? 例: main/sub1/ソース sub2/ソース sub3/ソース main.dll <-sub1,2,3からこの階層へdllを生成
>>822 sub1、sub2、sub3のMakefileでオブジェクト生成、mainのMakefileでそれらのmakeの起動とライブラリ化でいいんじゃね?
>>822 コンパイルオプションがバラバラならば
>>823 のようにするが、
一緒ならば単純に以下のようにする。
SRCS= ¥
main/sub1/ソース.c
sub2/ソース.c
sub3/ソース.c
vpathは使わない。
>>824 ¥ がぬけてた。
SRCS= ¥
main/sub1/ソース.c ¥
sub2/ソース.c ¥
sub3/ソース.c ¥
826 :
デフォルトの名無しさん :2008/12/11(木) 05:37:06
MAKEFILEでどうしても分からない事がありますので、 お教え願いたいのですが。 #-------------------------------------- リンカ(GUI) linkexe = $(linkopt) -Tpe -aa #-------------------------------------- リンカ(CONSOLE) linkcon = $(linkopt) -Tpe -ap #-------------------------------------- リンカ(DLL) linkdll = $(linkopt) -Tpd -aa linkconとlinkdllのマクロが使用されている箇所が、 この行以下にはありません。 しかし、linkconとlinkdllの記載を削除すると、リンク時にエラーが出ます。 $(name)T.EXE: FOO1.OBJ $(sobj) $(name)T.RES $(linkexe) @&&| $(C0GUI) FOO1 $(sobj) $(linkout)$. !if $(UseBCC) $& $(DebugLib) NOEH32 IMPORT32 CW32 !endif $&.RES | 質問 @リンクエラーでは、 $(linkexe) @&&| という部分に関係がしていると思われるのですが、 @&&| の意味が分かりません。この意味について教えて頂けませんでしょうか。 または参考になるサイトがあれば、そちらを教えて頂きたいです。 A$(linkout)$. $. の意味も分かりません。
borlandのmakeでは &&|から行頭|までがファイルに書き出されてファイル名が渡されるはず。 リンカのコマンドラインオプションに@ファイル名ってのがあるでしょ。 $.は実際に.silentとか削ってみてみれば見当つくんじゃないの。知らないけど。
828 :
826 :2008/12/11(木) 22:13:03
>>827 ご回答ありがとうございます。
しかし、linkconとlinkdllの記載を消すと、
何故エラーが出るかがまだ理解できていません。
linkconとlinkdllは定義されているだけで、
どこでも使われていない感じなのです。
OMake ってここできいていい? 最初から用意されている $(CProgram ) とかじゃなくて、自分で g++ ほげほげ と書きたいんだけど、どうやったらいいのでしょう? Windows 環境だと、Visual C++ の cl.exe が $(CProgram ) に設定されているみたいなんですよね。 mingw の g++ が使いたい。
>>830 簡単には答えられないし、いくつもの答えがありううので、>1 に紹介されているサイトで勉強した上で、分からないところを質問してくれると、より具体的な返答があると思うよ。
>>831 >1 では OMake は触れていないような。
ところで、 makefileの「コマンド行」では(マクロ)変数の代入は行えないんでしょ うか? 行っても反映されないようですが。
>>833 世の中にそれを行えるmakeがないかどうかは分かりませんが、
普通は行えないと思いますよ。
やっても反映されないとのことですが、コマンドは子プロセスのシェルで
実行されるので、Makefileの変数にはなんの影響もないはず。
>>833 ところで、make all CC=gcc みたいな話ではないのかな?
>>833 依存関係をmakeの起動時に静的に決定するために、
それは出来ません。
特定のターゲット(とそれが依存するファイル群)のみに変数を設定したい場合、GNU make なら target: CC=gcc みたいなことも可能。
ぶっちゃけ、makeは欠陥品だから、エレガンスを求めて苦しまない方が得策だよ。 その本は両方読んだけど… make: わかりやすいが、gmakeに特化していない分、他のmakeのポータビリティを 求めないなら要らない内容が多く、より便利な(ポータブルでない)内容が少ない。 GNUmake: gmake固有の便利機能や高度な使用法はいろいろ書いてあるが、いまいち 散漫な内容で網羅的でない。読後にリファレンスとしても使いにくい。 って感じ。 まぁ一つ言えることは、無理に全部makeで処理しようとしないことか? 普通にcソースをコンパイルしてリンクして…って部分はmakeにやらせてもいいが、 他の独自の複雑な処理は、よほど再ビルドに時間がかかるのでなければ、 シェルスクリプトで書いて、ビルドするたびゼロから作り直すように 割り切ってしまう方が作るのもメンテするのも楽だよ…。
makeで書くと並列処理が簡単にできるから最近#!/usr/bin/makeな スクリプトを書く機会が増えてるな・・・
841 :
デフォルトの名無しさん :2009/04/29(水) 06:55:00
Intelコンパイラを使っています Core2系とOpteron系のマシンがあるのですが、コンパイル時に それぞれのマシンに合わせてオプションを変えたいのですが、 どのようにマシンを判別すればよいのでしょうか?
小出し厨キタ
環境変数をだな
844 :
デフォルトの名無しさん :2009/04/29(水) 20:41:51
全部手動でやればおk
>>841 -axOWPTQみたいなオプションじゃダメなんか?
-xHost でいいじゃん
>>815 > -e '8{x;p;q;}; $${x;p;q;}' $<`; \
> && echo "$${src:-$<}") > dotDep/$*.d1
前の行の最後のセミコロンが余計
make hogeとやるとhoge:というターゲットに該当する箇所が実行されますが make hogeとやった時にターゲットではなく hogeという名称のファイルに対して処理をさせたい場合 どのように記述すれば良いのでしょうか 環境はGNU make 3.81です
alias make='make -f' とエイリアスをはるか、諦めてくれ
850 :
849 :2009/06/02(火) 01:15:40
質問の意図を汲めてない可能性があるので補足しとく hoge: hoge (ターゲット): (ファイル名)
>>849 ありがとう。しかし、makefileは修正しないつもりで書きました
結局環境変数を使う方法でうまくいきました
OREORE ?= defaultvalue
main:
$(OREORE)使用コード
どのように記述すれば良いのか、を聞いておいてmakefileは修正しないつもりって・・・ まぁ解決したならいいけど
853 :
デフォルトの名無しさん :2009/08/10(月) 21:49:34
age
GNU makeで以下のようなMakefileを書いたらa.cは生成されますが、a.oが生成されません。 なぜa.oが生成されないのでしょうか? #中間ファイル .INTERMEDIATE: ./sub/src/a.c a.elf : ./sub/obj/a.o ./sub/obj/b.o cat $+ > $@ #./xxx/src/.c -> ./xxx/obj/.o %.o : $(addsuffix /%.c, ../src) cp $< $@ ./sub/obj/a.o : ./sub/src/a.c ./sub/obj/b.o : ./sub/src/b.c #./xxx/blk/*.lst -> ./xxx/blk/*.c ./sub/src/a.c : ./sub/blk/a.lst cp $< $@
855 :
デフォルトの名無しさん :2009/09/04(金) 23:28:46
856 :
デフォルトの名無しさん :2009/09/23(水) 04:13:38
コンパイルしている環境(linuxなのかwindowsなのかmacなのかなど)を取得して、 それにあわせて、コンパイラやコンパイルオプションを変更する方法を教えてください。
>>856 簡単なのは arch とか uname の出力を見て(やり方はMakeの種類
ごとに異なる)条件判断の上変数をセットする。
本格的にやるなら GNU autotools というバッドノウハウの塊を使う。
858 :
856 :2009/09/23(水) 06:37:55
>>857 ありがとうございます。
どこかに簡単なので良いのでサンプルはないでしょうか?
859 :
856 :2009/09/23(水) 06:55:56
unameでやっているのですが、 OS = $(shell uname -s) と最初に書いたのですが、nmakeで旨く通りません。
all: echo set CC=cl > compile.bat echo set CFLAGS=xxxx >> compile.bat echo nmake -f main.nmk >> compile.bat echo export CC=gcc > compile echo make -f main.mk >> compile !chmod a+x compile ./compile
./compileじゃダメだね。もう一工夫必要。
>>859 nmakeって $(shell ...) 使えるん?
そもそも、SFUいれてなきゃunameが無い。
NTなら最初から%OS%って定義されてなかったっけ
> echo %os% Windows_NT
subsystem: $(MAKE) -C absolutepath Makefileからカレントの下層ではないフォルダにあるMakefileを呼び出したいと思っています。 しかし、subsystemで指定したフォルダの中にあるMakefileだけが実行されて、subsystemの記述より下に書いてあるコマンドが実行されなくなってしまいます。 どうすればいいのでしょうか?
>>866 それだけ読むと「subsystemの記述より下に書いてあるコマンド」が実行されるのに十分な
指定をしてるのかどうかわからん。
どんな Makefile を書いてどんなコマンドラインで実行したときに、そのコマンドが実行される
ことを期待しているの?
>>867 まずsubsystemでlibを作成します。
次に「subsystemの記述より下に書いてあるコマンド」ですが、libへのリンクを含むビルドです。
どちらも別々に実行すればうまくいきます。
>>868 あ、そう。でもやっぱり(以下 >867 と同文
makefileを張れないなら一昨日来やがれです〜
>>869 compiler = dmd
flag = -g -unittest
subsystem:
$(MAKE) -C C:\hoge\fuga\mylib
foo: foo.d
$(compiler) $(flag) mylib.lib $<
-fでMakefile渡してやらなきゃ。
>>872 -fで指定するというのは、make実行時?それともsubsystemの中でしょうか?
また、そこでどっちのファイル名を指定すればいいのかも分かりません。
Makefileのファイル名は2つともMakefileなので、-fで指定する必要はないと思うのですが。
make -n make -n subsystem の出力は?
>>871 それが Makefile 全体ってことでいいの?
で、コマンドラインは?
実行したときに表示されるメッセージは?
>>875 fooをビルドするためのMakefileはこれで全部です。
make -C C:\hoge\fuga\mylib
make[1]: Entering directory `C:\hoge\fuga\mylib'
/* ここでC:\hoge\fuga\mylib\Makefileが期待通りに実行される */
make[1]: Leaving directory `C:\hoge\fuga\mylib'
というメッセージが出て、C:\hoge\fuga\mylib\Makefileで期待した通り、
mylib.libは作成されますが、fooに関しては何も実行されません。
1つ勘違いしていたのですが、subsystemは予約語のような物ではないんですね。
しかし、mylib.libに変えてみても結果はかわらず・・・。
>>874 -nを付けないでやった時と同じ出力になりました。
877 :
876 :2009/09/30(水) 07:09:42
1つ忘れていました。 Makefileの実行は、コマンドプロンプトでカレントディレクトリをfoo.dがあるフォルダに変えたあと、 make と打ちました。
>>876-877 ゴールを指定してないときは、一番最初に見つかったルールのターゲットがゴールとされる。
その結果で仕様どおり。
>>876 いやいや、元のMakefileがあるところで
make subsystem
とやって欲しかったんだけど
>>878 つまり
>>871 のsubsystemとfooの順番を入れ替えるということですよね?
これも試してはみたんですが、今度はfooが作成されてmylib.libが作成されなくなってしまいます。
C:\hoge\fuga\mylib\Makefileを単独で直接実行すればmylib.libが作成されるんですが謎です。
また、fooのMakefileのカレントで
>>879 を実行すると、mylib.libが作成されてfooが作成されません。
他人が書いてくれたレスにある単語くらい調べないもんかねぇ。 ゴールが必要なのだよゴールが。
It makes a person who uses make make.
gallを狙え
>>882-883 「ゴール」が用語だとは思いませんでした。
複数のターゲットをゴールにする事ができるんですね。
今気づいた事なのですが、単純に依存の書き忘れでした。
foo: foo.d
$(compiler) $(flag) mylib.lib $<
を
foo: foo.d mylib.lib
$(compiler) $(flag) mylib.lib $<
に変えたらうまくいきました。
どうもありがとうございました。
>>866 の
> subsystemの記述より下に書いてあるコマンド
って
$(MAKE) -C absolutepath
じゃなかったんだな。。
867以降の流れを見ればそれはないだろw
サフィックスルールを使って、ソースを1つずつコンパイルしてオブジェクトファイルにするようにMakefileを書くと、 2回目以降のビルドの時、更新されたソースのみコンパイルされるようになりますよね。 更新されたソースを検知する仕組みってどうなっているんですか?
例えば*.cからは*.oが生成される(*NIXの場合)わけだが、 その両者のタイムスタンプを比べれば、*.oが生成された後に*.cが修正されたかどうか判るべ?
>>890 なるほど。
となるとcleanでオブジェクトファイル消したら意味なくなっちゃいますね。
cleanは掃除用ターゲットではあるが、全ビルドしなおしの準備でもある。
*.cよりも新しい*.oがなければ実行する、だから
>>889 の方法で更新されたソースのみコンパイルされるようにしているのですが、リリース用、デバッグ用にコンパイル引数を変えた時に困ります。
Makefileを2つ書くのは保守が面倒だし、上手い方法はないでしょうか?
>>894 生成物を置くディレクトリをリリース用、デバッグ用で分ける。
make起動時にモードを変数で指定(無指定ならデバッグモードになる、とかも)
コンパイルフラグや生成物のパスを記述するときにその変数の値を考慮する。
>>894 リリース用のオブジェクトとデバッグ用のオブジェクトをわけておけば問題ないはず。
bjam使うとその辺勝手にやってくれるよ。
レスthx
>>895 ,896
いずれにしても、make起動時に引数で渡して、パスやらファイル名を変えると言う事ですね。
>>897 ビルドツールは便利ですね。
でも、わけあって使えないんです><
>>898 > いずれにしても、make起動時に引数で渡して、パスやらファイル名を変えると言う事ですね。
なんか誤解してないか?
確かに起動時に引数を渡して切り替えるんだが、 make PATH=./debug じゃなくて、
make debug とかそういう切り替え方法だぞ。
>>899 make起動時に渡すのはマクロではなく、ターゲットと言う事ですか?
こうする事によるメリットとは何ですか?
901 :
900 :2009/10/04(日) 21:18:07
あーそれとも起動時の引数でマクロの定義だけして、Makefileの中で条件分岐するっていうこと?
>>900 > こうする事によるメリットとは何ですか?
指定が簡単で >894 のような問題が起こらない。
あと make に「マクロ」なんてものは無い。たぶん「変数」のことなんだろうけど。
> あと make に「マクロ」なんてものは無い。たぶん「変数」のことなんだろうけど。 え
make debug とできるようにするか、もしくは make MODE=debug として中で条件で設定を変える。
>>902 ,905
ターゲットで指定する方法
make debug
マクロで指定する方法
make MODE = debug
ということですよね。
私は後者を考えていました。
質問です。 makeでwarning時の処理を書きたいと思い以下のようなコードを書いています。 hoge.exe:hoge.c $(CC) $(CFLAGS) hoge.c 2>&1 | grep warning && (warning時の処理) このコードでwarningが出たときの処理はうまく動くのですが、逆にwarningがでなかったとき grepがアンマッチで1を返すことによって、なぜかmakeの処理自体がエラーとしてexitしてしまいます。 grepがアンマッチの場合でもmakeの処理を継続させるにはどのように書けばよいでしょうか? 宜しくお願いします。
|| exit 0 として前のコマンドが0以外を返したときフォローで0を返すか、 その行のアタマ(TABの次)に - を付けて失敗を無視させる。
hoge.o: hoge.c このターゲットと依存はサフィックスルールで簡単にかけますよね。 hoge.o: fuga\hoge.c では、これはサフィックスルールで書く方法ありますか?
>>909 サフィックスルールよりも広く使える、パターンルールを使う。
%.o : fuga/%.c
もう1つ。 all: fuga\hoge.o //省略 fuga\hoge.o: hoge.c //省略 をパターンルールで書くにはどうすればいいのでしょうか?
>>913 考えてはみたんですけど
all: fuga\hoge.o
によって%はfuga\hogeになりますよね。
この%をhoge.cに変える方法が分からないです。
>>916 910 を見て少し考えればわかるだろうと思った。
>>917 答えになってないな。
%にディレクトリを含むパスが渡されるのはあってる。
cfiles=$(wildcard fuga/*.c) ofiles=$(cfiles:.c=.o) all: ofiles でいいんじゃねえの? GNU make以外で通用するかは知らんが
>>919 thx
ワイルドカードを使う方法でできました。
921 :
920 :2009/10/07(水) 21:00:35
やっぱりできていなかった。 これだとソースをまとめてコンパイルする方法になっていて、 ソースを1つずつコンパイルして再コンパイルを最小にする最初の目的とは別物でした。 うーん、これ無理なのかな・・・。
いや、パターンルールでできるから、ふつうに。 とりあえずマニュアル読んで、書いてみた Makefile 見せてくれ。
>>922 #方法1
all: fuga\hoge.o
#省略
fuga\%.o: %.c
#省略
#方法2
all: fuga\hoge.o
#省略
%.o: $(notdir %.c)
#省略
どちらも
*** No rule to make target `fuga\hoge.c', needed by `fuga\hoge.o'. Stop.
というエラーになります。
そのエラーは%.cから%.oを作るルールが分からない、と言っている。 fuga\%.o: %.c $(CC) $(CFLAGS) -c &< -o $@
>>923 方法1でだいたい正解なんだが、結果が妙だね。
方法1をコピペした Makefile で make を走らせると、こうなる。
make: *** No rule to make target `fuga\hoge.o', needed by `all'. Stop.
ちょっとちがうね。
ちなみに
$ make --version
GNU Make 3.81
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
This program built for i686-pc-cygwin
で、 \ を / に置き換えて fuga/%.o のルールにコマンド部分書き足して、
hoge.c をカレントディレクトリに置いてやると、普通に成功する。
何が起こってるか調べたいなら make -d -r してみるといいかもしれない。
.PHONY: hoge hoge: prompt hoge .PHONY: fuga fuga: prompt fuga .PHONY: piyo piyo: prompt piyo hogeしか実行されません。 3つ実行するにはどうすればいいですか?
「makeとだけ実行したらhogeしか実行されなかった」という意味か。 引数なしで実行すると最初に見つけたターゲットだけ実行するから、 どのターゲットよりも前に all: hoge fuga piyo と書く、でいいんじゃね?
>>924 ,925
すみませんエラーを写し間違えていました。
> make: *** No rule to make target `fuga\hoge.o', needed by `all'. Stop.
このエラーでした。
そして\を/に変えたらエラーはでなくなりました。
ありがとうございました。。
930 :
デフォルトの名無しさん :2009/10/24(土) 07:36:43
cygwinのgnu makeでVisula C++のclを使ってコンパイルしようとしています。 gnu makeで .cpp.obj: $(CC) -c $< hoge.obj: hoge.h とすると、 make: Nothing to be done for `hoge.obj' と出てしまいます。 .cpp.o: $(CC) -c $< hoge.o: hoge.h と書くと、コンパイルはされます。(生成されるのはhoge.objですが) .cpp.obj: $(CC) -c $< hoge.obj: hoge.h でも、nmakeならコンパイルされます。 なぜgnu makeでobjと書くとうまくいかないのでしょうか? .
>>930 変にサフィックスルールを使おうとしてうまくいってない感じだね。
ちょっと前に出てるパターンルールで書いたほうがいいよ。
933 :
デフォルトの名無しさん :2009/11/02(月) 04:49:57
メイク便利過ぎワロタwwwwwwwww アニラジをwavで録音して番組毎に分割した後、 全部をoggに変換してタグ付けして Winampのメディアライブラリ管理フォルダに移して 元のwav消去まですんのすんげー怠かったけど メイクのお陰で後者の行程全自動化した うはwwwwww空いた時間でコーヒー呑むwwwwww
そんな使い方あったのか じゃあ漏れは動画のダウンローダーを作ってみる
私が使っているデジカメは、画像のタイムスタンプを閲覧時に回転させると更新してしまう。 PCに取り込んだ後に整理するのが面倒なので、新しいものだけ内部タグのタイムスタンプに戻す処理をmakeでやっている。 時限処理ならタスクでいいけど、タイムスタンプを比較するときは(色色融通が利かなくても)makeがいいね。
>>933 よくやったwwww
pythonやらrubyやらのLL言語をやるともっと幸せになれると思うが。
makeのコンパイル以外の便利な使い方を教えてください。
makeはコンパイラじゃないが
940 :
デフォルトの名無しさん :2009/11/03(火) 05:40:57
質問よく読め
変換 時間因果関係依存ファイル操作
複雑にtouchしないと解けないパズルを makeで作ることも出来るかもしれんな
make + makes + many = problems 覆面算をmakeで解いてください
5桁以下の3数の足し算が8桁になるものか。
wildcardでファイル名の一覧を取る時、下位フォルダの中のファイルもまとめて取る事ってできないでしょうか? 例えばカレントフォルダの中にhogeフォルダとfugaフォルダがあるとして、両フォルダの中のファイル名の一覧を取得しようと思うと src = $(wildcard hoge/*.c) $(wildcard fuga/*.c) のようにフォルダ毎にwildcardで取得する方法が思いつきますが、1回のwildcardで取得する方法はないでしょうか?
>>945 GNU makeだっけ?
$(wildcard hoge/*.c fuga/*.c)
とかいう話?
infoによると {hoge,huga}/*.c は不可のようだが。
$(wildcard */*.c)
レス遅れてすみません。
>>946 フォルダを入力しないといけないのが面倒くさいんですよね。保守の面でも。
>>947 *を何回も使えるのは知りませんでした。
しかし、カレントフォルダの下位フォルダも含めて.cファイルを全部取ろうとすると
$(wildcard *.c */*.c */*/*.c */*/*/*.c)
のように階層の深さだけ書かないといけないのがちょっと不満です。
一発で綺麗に書く方法はないんでしょうか?
shellでfind
>>949 make自体の機能にはないんですね。
ありそうでないんだなぁ。
>>950 考え方が逆。Unix系はいろんなツールを組み合わせて使うのが常道だから、外部ツールを使えばいいだけ。
もともと有るもの全部コンパイル。という管理はmakeにはなじまない。
もしかして $(shell ...) を知らないのか?
それだと 950 や 952 の反応がおかしいと思ったんだ。
956 :
デフォルトの名無しさん :2009/11/26(木) 10:08:53
たぶん初歩的なことだと思いますが hoge.o: hogr.h と書いてhoge.cppが変更された場合でもコンパイルされる理由がわかりません。
.c.oの暗黙のルールがあるから。 .hの依存を無視するなら、Makefile無しでもコンパイルできる。 $ ls hoge.c $ make hoge.o cc -O2 -pipe -std=gnu99 -fstack-protector -c hoge.c
.c => .cppと読み替えてくれ。
960 :
デフォルトの名無しさん :2009/11/26(木) 12:19:35
わかりやすい説明ありがとう
961 :
デフォルトの名無しさん :2010/01/07(木) 05:26:19
Windowsのコマンドライン環境下で、もしIntelコンパイラがインストールされているならiclを もしそうでないなら、clをつかうようにしたいのですが、Makefileはどのように書けばよいのでしょうか?
環境変数CCにでも入れておいたらどうよ。
nmake !if [インテルコンパイラの存在確認] == 0 CC=icl !else CC=cl !endif !ifの条件式中でコマンドを[]で囲むとexit codeに置換される。
>>963 早速の返信ありがとうございます。
インテルコンパイラの存在確認の部分がわからないのですが。
Windowsの場合どのように確認するのでしょうか?
iclを実行してみてエラーを調べる。 iclがインストールされると設定されるであろう環境変数を調べるスクリプトを書く。 アプリケーションのインストール情報読むスクリプトを書く。 インストールディレクトリ決め打ちで存在確認するバッチファイルを書く。 好きなのをどうぞ。
だからそれくらいならiccインストール時にCCをセットするだけでいいべさ。
自動判別が必要な状況でインストール時にCCが設定できるとは思えないけどな
968 :
デフォルトの名無しさん :2010/01/08(金) 02:34:25
管理者権限がないので、CCが設定できません(泣)
!if [icl -help > nul 2> nul] == 0 あたりで十分だろ。 まさか95とかMEなのでcmd.exeじゃありませんとか言わんよな。
同じく要cmd.exeだが !if [for %I in (icl.exe) do @if "%~$$PATH:I" == "" exit 1] == 0 というのも思いついた。 この例だとメリットないと思うが、-helpみたいな何もしないで正常終了させる オプションがないコマンドを調べるのには使えるかも。
intel ccってインストールするとパス通すのか? vcは通さないよな。
iclって、Win版のパラメータは /help とかじゃないのかな? ちなみに、Linux版はインストールしても環境変数設定スクリプトが着いてくるだけ。
973 :
デフォルトの名無しさん :2010/01/09(土) 08:18:53
Windows版も通常のコマンドプロンプトから使いたいなら自分で環境変数を追加売る必要がある
それじゃ、まじめにやるならインストール情報を読むスクリプト組む。 手抜きならインストールパス決め打ち。
975 :
デフォルトの名無しさん :2010/01/09(土) 10:23:38
Windowsでスクリプトって何使えばいいの?
JScriptかVBScript 理由: わざわざインストールしないで済む。
977 :
デフォルトの名無しさん :2010/01/09(土) 12:07:29
>>976 マイナーすぎてわからないので書いてください
JScript, VBScriptがマイナーというのならnmakeを使うのは諦めなさい。
IrrlichtMLをmakefileを使ってビルドしたいのですが、エラーが出てしまいます。
WindowsでMinGWを使ってるはずなのになぜ-I/usr/X11R6/includeをインクルードしてるんでしょうか・・
freetype.aをリンクさせるため、Makefileの46行目を次のように書き換えると、分離記号を欠いています出て一切動作しません。
http://etwas.wolfish.org/Irrlicht/irrlichtml.html # Next variable is for additional scene nodes etc. of customized Irrlicht versions
EXTRAOBJ = freetype.a
LINKOBJ = $(IRRMESHOBJ) $(IRROBJ) $(IRRPARTICLEOBJ) $(IRRANIMOBJ) \
$(IRRVIDEOOBJ) $(IRRSWRENDEROBJ) $(IRRIOOBJ) $(IRROTHEROBJ) \
$(IRRGUIOBJ) $(ZLIBOBJ) $(JPEGLIBOBJ) $(LIBPNGOBJ) $(EXTRAOBJ)
↓Makefileを書き換えなかった場合(freetypeのincludeは追加した。)
C:\Documents and Settings\ユーザー名\My Documents\Visual Studio 2008\Projects\irrlicht
-1.6\source\Irrlicht>make
cc -fexpensive-optimizations -O3 -DPNG_THREAD_UNSAFE_OK -DPNG_NO_MMX_CODE -DPNG_
NO_MNG_FEATURES -I../../include -Izlib -Ijpeglib -Ilibpng -Ifreetype -I/usr/X11R
6/include -DIRRLICHT_EXPORTS=1 -c -o zlib/adler32.o zlib/adler32.c
process_begin: CreateProcess(NULL, cc -fexpensive-optimizations -O3 -DPNG_THREAD
_UNSAFE_OK -DPNG_NO_MMX_CODE -DPNG_NO_MNG_FEATURES -I../../include -Izlib -Ijpeg
lib -Ilibpng -Ifreetype -I/usr/X11R6/include -DIRRLICHT_EXPORTS=1 -c -o zlib/adl
er32.o zlib/adler32.c, ...) failed.
make (e=2): 指定されたファイルが見つかりません。
make: *** [zlib/adler32.o] エラー 2
>>979 後者のメッセージを見ると、「ccコマンドが見付からない」
って言われているんじゃないか?
腐ったローカライゼーションは捨てて、オリジナルの英語のエラーメッセージを 持って来い。質問はそれからだ。
>979 おかしいと思ったのならちょっとくらい Makefile 読もうぜ。 make sharedlib_win32 staticlib_win32
983 :
デフォルトの名無しさん :2010/01/12(火) 06:08:41
>>978 nmakeじゃなくてcygwinのmakeを使っています。
もうすぐ次スレ スレタイが楽しみだわ
make makes us madがいいな