ディレクトリのサブディレクトリにあるいくつかのプログラムをコンパイルし、makefileを使用して実行可能ファイルを異なるディレクトリに配置します

yabhishek

私の問題はこれです:いくつかのディレクトリでプログラムをコンパイルするが、各ディレクトリの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]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ