1つのmakefileでコンパイルするクライアントサーバーアプリケーションがあるとします。サーバーは、サービスを提供する並列クライアントにlibtaskを使用します。クライアントは一部のグラフィックにncursesを使用します。ディレクトリツリーは次のようになります。
./
--bin/
--obj/
--src/
----client/*.c
----server/*.c
--makefile
だから、ここにmakefileがあります。単純化できますか?私はstackoverflowに関するいくつかの関連する質問を読みましたが、バイナリをリンクすることを除いて、コマンドが繰り返されるのを見ることができる場合は、ほぼ理想的だと思います。スタイル/クロスプラットフォームでの作業に関するいくつかの提案が役立ちます。ありがとうございました!
.PHONY: all clean
TASKLIB = -ltask
CURSESLIB = -lncurses
CFLAGS = -Wall -Werror -pedantic
bin = server client
obj_dir = obj
bin_dir = bin
ssource := src/server
csource := src/client
search_wildcard s := $(addsuffix /*.c, $(ssource))
search_wildcard c := $(addsuffix /*.c, $(csource))
sobjs = $(addprefix $(obj_dir)/, $(patsubst %.c, %.o, $(notdir $(wildcard $(search_wildcard s)))))
cobjs = $(addprefix $(obj_dir)/, $(patsubst %.c, %.o, $(notdir $(wildcard $(search_wildcard c)))))
all: $(bin)
@echo "done!"
server: CFLAGS+=$(TASKLIB)
client: CFLAGS+=$(CURSESLIB)
clean:
rm $(sobjs) $(cobjs) $(obj_dir)/*.d $(bin_dir)/client $(bin_dir)/server
VPATH := $(ssource) $(csource)
server: $(sobjs)
@test -d $(bin_dir) || mkdir $(bin_dir)
@echo "Linking $(@F)..."
@$(CC) $< $(CFLAGS) -o $(bin_dir)/$@
client: $(cobjs)
@test -d $(bin_dir) || mkdir $(bin_dir)
@echo "Linking $(@F)..."
@$(CC) $< $(CFLAGS) -o $(bin_dir)/$@
$(obj_dir)/%.o: %.c
@test -d $(obj_dir) || mkdir $(obj_dir)
@echo "Compiling $(@F)..."
@$(CC) $< $(CFLAGS) -c -MD -o $@
include $(wildcard $(obj_dir)/*.d)