From 2aaea5390a841e2682a318746e90aebbe8a955b9 Mon Sep 17 00:00:00 2001 From: Joshua Haberman Date: Tue, 4 Aug 2009 17:51:17 -0700 Subject: [PATCH] Makefile is much improved ("make deps" works again, etc). --- .gitignore | 1 + Makefile | 35 +++++++++++++++++++++++------------ gen-deps.sh | 17 +++++++++++++++++ 3 files changed, 41 insertions(+), 12 deletions(-) create mode 100644 .gitignore create mode 100755 gen-deps.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..a3493ef85f --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.s?? diff --git a/Makefile b/Makefile index a9d9a5fe43..f61d85b3e2 100644 --- a/Makefile +++ b/Makefile @@ -1,27 +1,38 @@ +# Function to expand a wildcard pattern recursively. +rwildcard=$(strip $(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2)$(filter $(subst *,%,$2),$d))) + .PHONY: all clean CC=gcc CXX=g++ CFLAGS=-std=c99 INCLUDE=-Idescriptor -Isrc -Itests -I. CPPFLAGS=-O3 -fomit-frame-pointer -Wall -Wextra -g -DNDEBUG $(INCLUDE) -OBJ=src/upb_parse.o src/upb_table.o src/upb_msg.o src/upb_enum.o src/upb_context.o \ - src/upb_string.o src/upb_text.o src/upb_serialize.o descriptor/descriptor.o -SRC=src/*.c src/*.h descriptor/*.c descriptor/*.h tests/*.c tests/*.h tools/*.c -ALL=$(OBJ) src/libupb.a tests/test_table tests/tests tools/upbc benchmark/benchmark + +ALL=deps $(OBJ) src/libupb.a tests/test_table tests/tests tools/upbc all: $(ALL) clean: - rm -f $(ALL) benchmark/google_messages.proto.pb benchmark/google_messages.pb.* - -test: tests/tests - ./tests/tests + rm -f $(call rwildcard,,*.o) $(ALL) benchmark/google_messages.proto.pb benchmark/google_messages.pb.* benchmark/b_* +# The core library (src/libupb.a) +OBJ=src/upb_parse.o src/upb_table.o src/upb_msg.o src/upb_enum.o src/upb_context.o \ + src/upb_string.o src/upb_text.o src/upb_serialize.o descriptor/descriptor.o +SRC=$(call rwildcard,,*.c) +HEADERS=$(call rwildcard,,*.h) src/libupb.a: $(OBJ) ar rcs src/libupb.a $(OBJ) + +# Tests +test: tests/tests + ./tests/tests tests/test_table: src/libupb.a tests/tests: src/libupb.a + +# Tools tools/upbc: src/libupb.a -benchmark/benchmark: src/libupb.a benchmark/google_messages.pb.h benchmark/google_messages.pb.o benchmark/benchmark.o - $(CXX) $(CPPFLAGS) -o benchmark/benchmark benchmark/google_messages.pb.o benchmark/benchmark.cc src/libupb.a -lm -lprotobuf -lpthread -benchmark/google_messages.pb.cc benchmark/google_messages.pb.h benchmark/google_messages.pb: benchmark/google_messages.proto - protoc benchmark/google_messages.proto --cpp_out=. -obenchmark/google_messages.proto.pb + +# Benchmarks + +-include deps +deps: $(SRC) $(HEADERS) gen-deps.sh Makefile + ./gen-deps.sh $(SRC) diff --git a/gen-deps.sh b/gen-deps.sh new file mode 100755 index 0000000000..6f7b4af4e3 --- /dev/null +++ b/gen-deps.sh @@ -0,0 +1,17 @@ +#!/bin/sh +# This script wraps gcc -MM, which unhelpfully strips the directory +# off of the input filename. In other words, if you run: +# +# $ gcc -MM src/upb_parse.c +# +# ...the emitted dependency information looks like: +# +# upb_parse.o: src/upb_parse.h [...] +# +# Since upb_parse.o is actually in src, the dependency information is +# not used. To remedy this, we use the -MT flag (see gcc docs). + +rm -f deps +for file in $@; do + gcc -MM $file -MT ${file%.*}.o -Idescriptor -Isrc -I. >> deps +done