私の問題はこれです:いくつかのディレクトリでプログラムをコンパイルするが、各ディレクトリのexecutablesという名前のサブディレクトリに実行可能ファイルを配置するmakefileを作成したいと思います。コンパイルするプログラムがたくさんあるので、それぞれのルールを書くのは面倒なようです。私の現在の作業ディレクトリがCurr_dirであると仮定すると、次のディレクトリ構造があります-
Curr_dir
|
|__dir1
| |__q1.c
| |__q2.c
| |__q3.c
| |__+executable
|
|__dir2
| |__q4.c
| |__q5.c
| |__q6.c
| |__+executable
|
|__Makefile
ルートディレクトリに2つのディレクトリしかリストしていませんが、3〜4個の.cファイルを含むディレクトリがいくつかあります。次に、ルートディレクトリのMakefileを使用してこれらすべての.cファイルをコンパイルし、対応する実行可能ファイルディレクトリに実行可能ファイルを配置します。これが私のmakefileで、各プログラムをコンパイルし、同じディレクトリに実行可能ファイルを生成します。
CC= gcc
RM= rm -vrf
CFLAGS= -lm -g
SRCFILES =$(wildcard */*.c)
SRCDIRS= $(wildcard */)
EXECDIRS= $(SRCDIRS:%=%executables)
EXECFILES = $(SRCFILES:%.c=%)
dirs:
mkdir -p $(EXECDIRS)
all: dirs $(EXECFILES)
%: %.c
-$(CC) -o $@ $< $(CFLAGS)
.PHONY: clean
clean:
$(RM) $(EXECFILES) $(EXECDIRS)
どんな助けでも大歓迎です。
2つの問題があります。ビルドするファイルのリストを作成することと、それらをビルドするためのルールまたはルールのセットを作成することです。たまたま、Makeのワイルドカード処理が適切でないため、両方の問題が困難になっています。
最初の部分:
SRCFILES := $(wildcard */*.c)
EXECFILES := $(join $(addsuffix executables/,$(dir $(SRCFILES))), $(basename $(notdir $(SRCFILES))))
粗野ですが効果的です。
2番目の部分では、ターゲット名を(dir1/executables/q1)
対応するソース名(dir1/q1.c
)に関連付ける必要があります。おそらくこれを行う最も恐ろしい方法は、SECONDEXPANSIONを使用してターゲット名を操作するパターンルールを使用することです。
.SECONDEXPANSION:
$(EXECFILES): $$(addsuffix .c,$$(subst executables/,,$$@))
@echo building $@ from $<
-$(CC) -o $@ $< $(CFLAGS)
ディレクトリを構築するための最良の方法についてはいくつかの論争がありますが、私はこのアプローチが好きです:
.SECONDEXPANSION:
$(EXECFILES): $$(addsuffix .c,$$(subst executables/,,$$@)) $$(dir $$@)
@echo building $@ from $<
-$(CC) -o $@ $< $(CFLAGS)
%/executables:
mkdir -p $@
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加