gccのMオプションで依存関係を自動的に作ってくれるので、

%.d: %.c
	$(CC) -MM -MF $@ -MP -MT $(subst .d,.o,$@) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) $<

こんな感じにしておくと、Cソースから依存関係を作れて便利。

VPATHを使うと、ターゲットや必須項目を探すときの起点となるディレクトリを追加できて便利。(デフォルトはカレントのみ)

Qtで自動生成されるMakefileをプロジェクトで作っているMakefileと統合するのに苦悩中。

proj/ + app1/ + Makefile
      |       + cファイル
      + app2/ + Makefile
      |       + cファイル
      + qapp/ + Makefile
      |       + cファイル
      + inc/  + hファイル
      + Makefile

のような感じにして、トップディレクトリから、make app1とかmake app2とかはapp1,app2にそれぞれうまく動くMakefileを作ったあと、トップのMakefileから

apps : app1 app2

.PHONY: all $(apps)

all: $(apps)

$(apps):
	$(MAKE) --directory=$@ $(TARGET)

のような感じで問題なく動く。(TARGETはcleanターゲット用、トップからはmake TARGET=clean)qappのMakefileは、

target   := 
sources  := 
listfile := $(target).ls
projfile := $(target).pro
makfile  := $(target).mak

.PHONY: all
all:

#存在しないときに1回だけ実行
$(makfile): $(projfile)
	@echo "checking $@"
	@if [ -e $@ ];\
        then\
          true;\
        else\
          echo "creating $@";\
          qmake -o $@ $<;\
        fi

  • include $(makfile)
#.proはファイルのリストに依存している $(projfile): $(listfile) qmake -project -o $@ perl -pe "s/^(INCLUDEPATH\s*\+=\s*\.)/\$$1 ..\/include/" <$@ >$@.tmp mv $@.tmp $@ #ファイルのリストはカレントディレクトリの更新時刻に依存している $(listfile): . @echo "updating $@" @ls $(sources) >$@.tmp @mv $@.tmp $@ .PHONY: clean clean: $(MAKE) -f $(makfile) distclean rm $(projfile) $(listfile)

こんな感じで、ファイルリストが更新されたら.proと.makを作り直して、.makをインクルードすることで、必要なもの以外のルールはqmakeで自動生成する.makにまかせるようにしたい。こいつは単体でも、.makで定義される、.mak,cleanのルールとバッティングして警告でるし、incの依存関係がうまくいってない。ただ単体ではビルドそのものは可能。トップディレクトリはビルドはできるがcleanがうまくいかない。現在保留中。