現在、C プロジェクトの Makefile を作成するときに問題に直面しています。
特に、私のプロジェクトには少なくとも 2 つの Makefile ターゲット (target_light
とtarget_full
) が必要target_light
です。これがデフォルトのターゲットです。
target_light
システムに外部ライブラリをインストールする必要があるいくつかのソース ファイルを除いて、すべてのソース ファイルをコンパイルする必要があります ( src/extra
.c ファイルの場合は に保存され、include/extra
.h ファイルの場合は に保存されます)。
target_full
代わりに、外部ライブラリを必要とするファイルを含むすべてのファイルをコンパイルする必要があります。また、 および にいくつかのフラグを追加する必要がCFLAGS
ありLDLIBS
ます。
現在、次のような Makefile があります。
EXECNAME=MyExecutable
CC=gcc
SRC_DIR=src
OBJ_DIR=obj
SRC_DIR_EXTERNAL_FILES=src/extra
OBJ_DIR_EXTERNAL_FILES=obj/extra
SRC=$(wildcard $(SRC_DIR)/*.c)
OBJ=$(SRC:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o)
SRC_EXTERNAL_FILES=$(wildcard $(SRC_DIR_EXTERNAL_FILES)/*.c)
OBJ_EXTERNAL_FILES=$(SRC_EXTERNAL_FILES:$(SRC_DIR_EXTERNAL_FILES)/%.c=$(OBJ_DIR_EXTERNAL_FILES)/%.o)
CFLAGS += -Wall -O2 -Iinclude
LDLIBS += -lpthread -lm
.PHONY: all clean
all: target_light
target_light: CC=gcc
target_light_embedded: CC=x86_64-openwrt-linux-musl-gcc
target_light_debug: CFLAGS += -g
target_light_debug: target_light
target_light target_light_debug target_light_embedded: $(EXECNAME)
$(EXECNAME): $(OBJ_CC)
$(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
$(CC) $(CFLAGS) -c $< -o $@
clean:
$(RM) $(OBJ_DIR)/*.o $(OBJ_DIR_EXTERNAL_FILES)/*.o
$(RM) $(EXECNAME)
-rm -rf $(OBJ_DIR)
私は現在、要求された場合にのみ追加のファイルをコンパイルするために、target_full
この Makefileに追加する方法を見つけるのに苦労しています。SRC_DIR_EXTERNAL_FILES
OBJ_DIR_EXTERNAL_FILES
SRC_EXTERNAL_FILES
OBJ_EXTERNAL_FILES
この操作を実行するにはどうすればよいですか? Makefile 内でこれを行う良い方法はありますか?
CFLAGS
私の2番目の質問は、フラグを両方に同時に追加するにはどうすればよいLDLIBS
ですtarget_full
か? 私は書いてみました:
target_full: CFLAGS += -DENABLE_CODE_EXTERNAL_LIB -Iinclude/extra
LDLIBS += -lext_lib
そして、次の$(EXECNAME)
行を変更します。
target_light target_light_debug target_light_embedded target_full: $(EXECNAME)
ただし、追加のLDLIBS
フラグは、が選択されている場合でも常に考慮されるようtarget_light
です。
次の行のように 2 回繰り返す必要がありますtarget_full
か?
target_full: CFLAGS += -DENABLE_CODE_EXTERNAL_LIB -Iinclude/extra
target_full: LDLIBS += -lext_lib
事前にどうもありがとうございました。