約 2,766,795 件
https://w.atwiki.jp/astro_dust/pages/19.html
Makefile ソースコードが複数のファイルに渡って存在する場合に、それらを一度にコンパイルし、実行ファイルを生成するシステム。 Makefileが賢いのは、ソースファイルとオブジェクトファイルファイルの時間を確認し(タイムスタンプを比較)し、更新された ソースファイルだけをコンパイルする点である。 こうする事で、コンパイル時間を節約できる。 Makefileの最も基本的な構造は TARGET DEPENDENCES (tab) COMMAND である。ここで(tab)はタブ・スペースであり、タブ・スペースがないとMakefileは機能しないので重要である。 TARGETは最終的な生成物であり、またこの動作を指定する名前のような物である。 DEPENDENCESには依存ファイル、つまり互いに依存するソースコードをここに書く。 もしTARGETがDEPENDENCESよりも古ければ、COMMANDが実行され、新しいTARGETが生成されることになる。 具体例を記すと、 foo hello.f90 world.f90 (tab) gfortran hello.f90 world.f90 -o exename などのようにする。 ここでコマンドラインで make foo と打ち込むと、hello.f90 world.f90から実行ファイルexenameが生成される。 また、単に make を打ち込んだ場合、一番先頭にあるtargetが実行される。 さて、ここからはマクロを用いてMakefileをより見やすくする。 マクロとは、いってみれば変数である。 TARGET = foo EXEFNAME = jikkou SRCS = hello.f90 world.f90 FC = gfortran $(target) $(SRCS) (tab) $(FC) $(SRCS) -o $(EXEFNAME) ここで前半が変数に値を代入し、後半は各変数を用いてMakefileの基本構造を作っている。 端末で make と打ち込むと、jikkouという名前の実行ファイルが生成される。 さて、次が重要であるが、更新されたソースコードだけをコンパイルするという部分をMakefileに 書き込む。 TARGET = foo EXEFNAME = jikkou SRCS = hello.f90 world.f90 OBJS = $(SRCS .f90=.o) FC = gfortran .SUFFIXES .f90 .f90.o (tab) $(FC) -c $ $(target) $(OBJS) (tab) $(FC) $(OBJS) -o $(EXEFNAME) ここで.f90.oを書いた部分は”*.f90ファイルから*.oを作成せよ”という指令である。 このような書き方をサフィックスルールと呼ぶ。 ただ、.f90という拡張子はMakefileにはデフォルトではサフィックスルールには従わないので、 .SUFFIXES .f90とすることで、.f90をサフィックスルールに従いますよ、と宣言しておく。 ・make clean Makefileを使用するもう一つのご利益がこのcleanである。 makefileに以下を付け加える .PHONY clean clean (tab) @rm -f $(OBJS) $(OBJS .o=.mod) $(EXEFNAME) 端末で make clean とすればコンパイルによって生じたオブジェクトファイルや実行ファイル、モジュールファイルなどが消去される。 こうすることでディレクトリがスッキリとする。 ・make tarball ソースコードなどを一纏めに圧縮しておきたい場合もmakeでできる。 自分が圧縮したいと思うファイルを事前にALLFILESなどと適当なマクロを定義して、 tarball (tab) @tar zcvf $(PROGRAM).tgz $(ALLFILES) とMakefileに書き込む。端末で make tarball とすると、ALLFILESで指定されたファイル達が圧縮され、$(PROGRAM).tgzという名前で圧縮される。 最後に、私が使用しているMakefileの例を示す。 PROGRAM = result EXEFNAME = $(PROGRAM).x SRCS = test1.f90 test2.f90 INCLUDE = test3.dat LIBS = test4.a OBJS = $(SRCS .f90=.o) FC = gfortran FCFLAGS = -O2 ALLFILES = $(SRCS) Makefile .SUFFIXES .f90 all $(PROGRAM) .f90.o (tab)$(FC) $(FCFLAGS) -c $ $(FCFLAGS) -o $@ $(PROGRAM) $(OBJS) $(INCLUDE) (tab) @echo "Linking $(PROGRAM)..." (tab) @$(FD) $(FCFLAGS) -o $(EXEFNAME) $(OBJS) $(LIBS) (tab) @echo "Done." tarball (tab) @tar zcvf $(PROGRAM).tgz $(ALLFILES) .PHONY clean clean (tab) @rm -f $(OBJS) $(OBJS .o=.mod) $(EXEFNAME) 参考資料 本稿を纏めるにあたって、以下のサイトを参考にしました。 この場を借りて、お礼申し上げます。 http //lagendra.s.kanazawa-u.ac.jp/ogurisu/manuals/make-intro/macro.html http //www.atmarkit.co.jp/ait/articles/1106/10/news115.html http //d.hatena.ne.jp/rontas/20121226/1356511831 https //www.mlab.im.dendai.ac.jp/~tobe/xp-2/gmake.html
https://w.atwiki.jp/daisukem/pages/16.html
トリビアなMakefile入門 Makefile例
https://w.atwiki.jp/hereitis/pages/18.html
makefile雛形 ディレクトリ構成は以下のとおりとする /home/user/workspace/hoge ├ src │ ├ test01.c │ ├ test02.c │ └ test_common.h └ Debug ├ makefile ├ conf.mk └ src gcov/lcov対応版 makefileは以下のような感じ #------------------------------------------------------------------------------- # makefile #------------------------------------------------------------------------------- # configuration file -include conf.mk # Output object files $$(HOGE_DIR)/Debug/src/%.o $$(HOGE_DIR)/src/%.c @echo Building file $ @echo Invoking GCC C Compiler $(CC) $(INCPATH) -O0 $(DBGOP) -Wall $(CFLAGS) $(COVERAGE) -c -fmessage-length=0 -MMD -MP -MF"$(@ %.o=%.d)" -MT"$(@ %.o=%.d)" -o"$@" "$ " @echo Finished building $ @echo # All Target all hoge # Tool invocations hoge $(OBJS) $(USER_OBJS) @echo Building target $@ @echo Invoking GCC C Linker $(CC) $(LIBPATH) -o"hoge" $(OBJS) $(USER_OBJS) $(LIBS) @echo Finished building target $@ @echo # Other Targets clean -$(RM) $(OBJS)$(C_DEPS)$(LIBRARIES) hoge $(DB_OBJS)$(DB_C_DEPS) $(TEST_OBJS)$(TEST_C_DEPS) -$(RM) $(HOGE_DIR)/Debug/hoge.info -$(RM) $(HOGE_DIR)/Debug/lcov_hoge_html -$(RM) $(HOGE_DIR)/Debug/*.gcov -$(RM) $(HOGE_DIR)/Debug/src/*.g* -@echo coverage @echo coverage report $(GCOV) ./src/*.gcda -o ./src $(LCOV) . -o hoge.info $(RM) ./lcov_hoge_html $(GENHTML) -o lcov_hoge_html hoge.info @echo Finished making coverage report @echo .PHONY all clean dependents .SECONDARY conf.mkは以下のような感じ #------------------------------------------------------------------------------- # conf.mk #------------------------------------------------------------------------------- # Macro definition RM = rm -rf GCOV = gcov LCOV = lcov -c -d GENHTML = genhtml HOGE_DIR= /home/user/workspace/hoge # BUILD_TYPE Setting (0 release 1 debug) ifndef BUILD_TYPE BUILD_TYPE = 1 else BUILD_TYPE = 0 endif ifeq ($(BUILD_TYPE),0) DBGOP = LIBTYPE = release CFLAGS += \ else DBGOP = -g3 LIBTYPE = debug CFLAGS += \ endif # BUILD_TARGET Setting ifndef BUILD_TARGET BUILD_TARGET = 1 else BUILD_TARGET = 0 endif ifeq ($(BUILD_TARGET),0) TARGET = target CC = gcc else TARGET = host CC = gcc endif # COVERAGE Setting ifdef COVERAGE_ENABLE COVERAGE_ENABLE = 1 else COVERAGE_ENABLE = 0 endif ifeq ($(COVERAGE_ENABLE),1) COVERAGE = -coverage else COVERAGE = endif INCPATH = \ -I"../../include" \ LIBPATH = \ -L"../../lib/$(TARGET)/$(LIBTYPE)" \ # Add inputs and outputs to the build variables OBJS += \ $(HOGE_DIR)/Debug/src/test01.o \ $(HOGE_DIR)/Debug/src/test02.o \ C_DEPS += \ $(HOGE_DIR)/Debug/src/test01.d \ $(HOGE_DIR)/Debug/src/test02.d \ #Link library LIBS = \ -lutil lpthread makefile作成時の注意点(当たり前ですね。。。) export MACRO=・・・ :多段makeなどでその他のmakefile内にも影響を及ぼす MACRO=・・・ :当該makefile内でのみ有効
https://w.atwiki.jp/abdulladzhan/pages/26.html
makefileのメモ 1 ターゲット 依存ファイル コマンド ソースファイルfileA.cppをコンパイルして実行ファイルfileAを作る #Makefile fileA fileA.cpp g++ -o A fileA.cpp #eof ありがたみ無し。 2 1.fileA.cppはfileA.hをインクルードしている 2.fileA.cppを書き換えてmake 正常にコンパイル 3.fileA.hを書き換えてmake $make make all に対して行うべき事ではありません. 4.泣く. Makefileの修正 #Makefile .PHONY all all fileA fileA fileA.o g++ -Wall -o a.out fileA.o #fileAはfileA.oに依存している fileA.o fileA.cpp g++ -Wall -c fileA #fileA.oはfileA.cppに依存している fileA.o fileA.h #fileA.oはfileA.hに依存している .PHONY clean clean rm -rf fileA fileA.o #中間・実行ファイルの削除 #eof .PHONYとは同一フォルダ内に"all"というファイルがある場合に区別するための定義 これでfileA.hのみを書き換えた場合もmakeを行う. 3 複数のファイルを一度にコンパイルする fileA.cpp fileB.cpp fileC.cppの3つのファイルを同時にコンパイルしたい場合 #Makefile .PHONY all all file1 file2 file1 fileA.o g++ -Wall -o fileA fileA.o fileA.o fileA.cpp g++ -Wall -c fileA.cpp fileB fileB.o g++ -Wall -o fileB fileB.o fileB.o fileB.cpp g++ -Wall -c fileB.cpp fileC fileC.o g++ -Wall -o fileC fileC.o fileC.o fileC.cpp g++ -Wall -c fileC.cpp fileB.o fileB.h fileC.o fileC.h .PHONY clean clean rm -f fileA.o fileB.o fileC.o file1 file2 #eof これだと使いまわすのが面倒になっているのでマクロ #Makefile #SRC = fileA.cpp fileB.cpp fileC.cpp OBJ1 = fileA OBJ2 = fileB OBJ3 = fileC OBJS = $(SRC %.cpp=%.o) CXX = g++ CXXFLAGS = -Wall PROG = OBJ1 OBJ2 OBJ3 .PHONY all all $(PROG) .SUFFIXES .cpp .o $(OBJ1) $(OBJ1).o $(CXX) $(CXXFLAGS) -o $@ $ $(OBJ2) $(OBJ2).o $(CXX) $(CXXFLAGS) -o $@ $ $(OBJ3) $(OBJ3).o $(CXX) $(CXXFLAGS) -o $@ $ .cpp.o $(CXX) $(CXXFLAGS) -c $ $(OBJ2).o $(OBJ2).h $(OBJ3).o $(OBJ3).h .PHONY clean clean $(RM) *.o *~ $(OBJS) $(PROG) #eof とか 参考サイト SkillWiki
https://w.atwiki.jp/toyoken/pages/20.html
■ソースと同階層のMakefile #!/bin/make TARGET = Sample01 SRCS = $(shell ls *.cpp) OBJS = $(SRCS .cpp=.o) CXX = g++ CXXFLAGS = -g -O2 -Wall LDFLAGS = -lm -lrt -L/Develop/lib -lCmnFunc INCLUDE = -I../inc -I../../CmnInc DEST = ../../../bin .cpp.o $(CXX) $(CXXFLAGS) $(INCLUDE) -c $ $(TARGET) $(OBJS) $(CXX) $(LDFLAGS) -o $(TARGET) $(OBJS) cp $(TARGET) $(DEST) clean $(RM) $(TARGET) $(OBJS) $(RM) $(DEST)/$(TARGET) ◆ライブラリのmakefile #!/bin/make TARGET = libCmnFunc.so SRCS = $(shell ls *.cpp) OBJS = $(SRCS .cpp=.o) CXX = g++ CXXFLAGS = -g -O2 -Wall -fPIC LDFLAGS = -lm -lrt -shared -Wl INCLUDE = -I../../CmnInc DEST = /Develop/lib/ .cpp.o $(CXX) $(CXXFLAGS) $(INCLUDE) -c $(SRCS) $(TARGET) $(OBJS) $(CXX) $(LDFLAGS) -o $(TARGET) $(OBJS) cp $(TARGET) $(DEST) clean $(RM) $(TARGET) $(OBJS) ■上位階層のMakefile #!/bin/make MAKE = make --no-print-directory SUBDIR = $(shell find ./*/src/ -type d) all list= $(SUBDIR) ; for subdir in $$list; do \ $(MAKE) -C $$subdir; \ done clean list= $(SUBDIR) ; for subdir in $$list; do \ $(MAKE) clean -C $$subdir; \ done
https://w.atwiki.jp/nopu/pages/167.html
FrontPage Makefileによるコンパイル・リンク 書式 (生成するファイル名) (生成時に依存するファイル名) TAB (ファイルを生成するためのコマンド) Makefile target.out main.o hoge.o TAB gcc -o target main.o hoge.o -lgsl -lgslcblas -lm main.o main.c hoge.h TAB gcc -c main.c main.o hoge.c hoge.h TAB gcc -c hoge.c 変数を使うと楽 コンパイルオプションの変更とか。 CC = gcc OPT = -lm -lgsl -lgslcblas INC = -I/usr/local/include LIB = -L/usr/local/lib ALL = main.o hoge.o program $(ALL) TAB $(CC) $(LIB) -o $@.out $(ALL) $(OPT) main.o main.c hoge.c hoge.h TAB $(CC) $(INC) -c main.c hoge.o hoge.c hoge.h TAB $(CC) hoge.h 改行する度に新しい sh が呼ばれる。 同じ sh を使うには、セミコロンで命令を区切る。 cd hoge; mkdir hage = と = は大違い! = は、その場で変数を評価するので、$@などを使うことはできない。 = は、実際に使われるまで変数の評価をしないので、$@などを使うことができる。 実は、これは関数を定義していることになる! CC_HOGE = $(CC) $(LIB) -o $(DIR_BIN)/$@.out $^ $(SHLIB) とか、 TAR_FILE = $(TAR_HEAD)$(shell date `+%y%m%d`).tar.gz とかやっても、評価は呼び出すときなのでマクロ関数のようにちゃんと動く! 応用 関数的に使う方法 FUNC = @echo $(ARG) ... ARG = hoge $(FUNC) 特殊変数(自動変数) $@ ターゲット名 $^ 全ての依存ファイル名 $? ターゲットより新しい依存ファイル名 $* ターゲット名のサフィックスを抜いた部分。 シェルコマンドを呼び出して,文字列化する ${shell command } Ex. 日付を表示させる date @echo ${shell date +%y%m%d } # @ command はコマンドの実行を表示しない。 制御を含む複雑なシェルコマンドの呼び出し シェル変数の呼び出しは,通常の $hoge から $$hoge に変わる。 NG echo $hoge 修正版 echo $$hoge 複数行に渡るコマンドは,セミコロンで結んで1行にする。 NG for ... do ... done 修正版 for ... ; do ... ; done Ex. testで始まるソースファイルの拡張子を変更する for file test*cpp; do mv $$file $${file%.cpp}.ppp; done 別のディレクトリにソースとヘッダを置く ディレクトリ構造 project/ + Makefile + src/ | + hoge.cpp + include/ | + hoge.hpp + lib/ + libhage.so Makefile vpath % src include ← (1) src include のようにコロンでもおk target $(OBJ) $(CC) -o $@.out $(OBJ) -Llib -lhage ← (3) 独自ライブラリには -L も必要。 .cpp.o $(CC) -c $ -Iinclude ← (2) こっちは g++ に対する指定。無くてもおk hoge.cpp (2)で -I を指定した場合 #include hoge.hpp ← (2 ) とにかくファイル名だけでおk ... hoge.cpp (2)で -I を指定しない場合 #include ../include/hoge.hpp ← (2 ) パスを入れる。 ... (3 ) 注. 独自の共有ライブラリディレクトリを用意した場合 シェルから ./a.out で実行しようとしても、 ./a.out error while loading shared libraries libfonc.so cannot open shared object file No such file or directory と出てしまって、このままでは実行できない。 つまり、シェルに対してもパスを通してやる必要がある。 export LD_LIBRARY_PATH= lib 依存関係の自動生成 depend $(ALL) [TAB] @rm depend.inc [TAB] @for file in $^; do \ [TAB] cpp -MM $(INC) $$file \ [TAB] | sed s/[_/a-zA-Z0-9]*.cpp//g \ [TAB] depend.inc; \ [TAB] done 得られた depend.inc を、Makefileの末尾で -include depend.inc すればおk ディレクトリの一覧を取得 HOGE = $(shell for file in *; do if [ -d $$file ]; then ls -d $$file; fi; done )
https://w.atwiki.jp/abwiki/pages/373.html
makefileの書き方 基本 ターゲット 依存ファイル コマンド コマンドの前にtabを忘れないこと。 マクロ 名前=文字 で定義。使うときは $(名前) とする。 cc=gcc files=a.c b.c test $(files) c.h $(cc) $(files) 依存 ターゲットを幾つか並べ、順番を大切にしたいとき。 a b コマンド1 b c コマンド2 コマンド2が実行され、コマンドが成功(戻り値が0)したときにコマンド1が実行される。 疑似ターゲット ファイルを冠しないターゲットのこと。 clean del *.obj みたいなの。
https://w.atwiki.jp/y0sota/pages/29.html
龍谷大学 分割コンパイルの説明など http //www-tlab.math.ryukoku.ac.jp/~takataka/make/index.html#intro サンプル http //www.unixuser.org/~euske/doc/makefile/#examples http //www.gnu.org/s/hello/manual/make/index.html
https://w.atwiki.jp/kskz/pages/24.html
プログラム作成その前に makefile自体は同じ環境では、プログラム毎にはあまり変わりません。 コンパイルするファイル・プロジェクト名・タイトルくらいです。 テンプレート的なものを作ってみましたので参考にしてみてください。 [ makefile ] # プロジェクトの名前 TARGET = TEMPLATE # コンパイルするファイル(作成したいオブジェクトファイル) OBJS = template.o debug.o # インクルードファイルのパス(環境設定されてないものを追加する場合) INCDIR = # ライブラリファイルのパス(環境設定されてないものを追加する場合) LIBDIR = # Cコンパイラに渡すオプションフラグ CFLAGS = -G0 -Wall -O2 # C++コンパイラに渡すオプションフラグ CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti # アセンブラに渡すオプションフラグ ASFLAGS = $(CFLAGS) # リンカに渡すオプションフラグ LDFLAGS = # 追加するライブラリ LIBS= -lpspgu # ここら辺からPSP用の設定 # PSPに関するビルドの指定なのでここより下ではいけない BUILD_PRX = 1 # ファームウェアバージョン PSP_FW_VERSION=374 # 作成する実行ファイル EXTRA_TARGETS = EBOOT.PBP # ここら辺からXMBでの見た目の設定 # 実行時に表示されるタイトルです。 PSP_EBOOT_TITLE = template@KSK # XMBのアイコン(png)の指定。(多分144x80px) PSP_EBOOT_ICON = template.png # XMBの背景(png)の指定。(多分480x272px) PSP_EBOOT_PIC1 =bg.png # PSPSDKの場所指定 PSPSDK = D /devkitPro/devkitPSP/psp/sdk include $(PSPSDK)/lib/build.mak アンダーラインの部分を変更するだけで、大体のものはコンパイルできると思います。 このような感じです 広告
https://w.atwiki.jp/toyoken/pages/21.html
■ソースと同階層のMakefile #!/bin/make TARGET = Sample01 SRCS = $(shell ls *.cpp) OBJS = $(SRCS .cpp=.o) CXX = g++ CXXFLAGS = -g -O2 -Wall LDFLAGS = -lm -lrt -L/Develop/lib -lCmnFunc INCLUDE = -I../inc -I../../CmnInc DEST = ../../../bin .cpp.o $(CXX) $(CXXFLAGS) $(INCLUDE) -c $ $(TARGET) $(OBJS) $(CXX) $(LDFLAGS) -o $(TARGET) $(OBJS) cp $(TARGET) $(DEST) clean $(RM) $(TARGET) $(OBJS) $(RM) $(DEST)/$(TARGET) ■上位のMakefile #!/bin/make MAKE = make --no-print-directory SUBDIR = $(shell find ./*/src/ -type d) all list= $(SUBDIR) ; for subdir in $$list; do \ $(MAKE) -C $$subdir; \ done clean list= $(SUBDIR) ; for subdir in $$list; do \ $(MAKE) clean -C $$subdir; \ done