Makefile   [plain text]


# Makefile

.PHONY: build all install installsrc installhdrs test check Makefile testexcldebug 
PRODUCT=regressions

TESTDIRS := .

HFILES := $(shell find $(TESTDIRS) -type f -name \*.h -print)
ALL_CFILES := $(shell find $(TESTDIRS) -type f -name \*.c -print)
ALL_CXXFILES := $(shell find $(TESTDIRS) -type f -name \*.cpp -print)
ALL_MFILES := $(shell find $(TESTDIRS) -type f -name \*.m -print)
SHFILES := $(shell find $(TESTDIRS) -type f -name \*.sh -print)
TFILES := $(shell find $(TESTDIRS) -type f -name \*.t -print)

PAREN := (
CTESTS := $(shell grep -l 'main[ \t]*$(PAREN)' $(ALL_CFILES) /dev/null)
CXXTESTS := $(shell grep -l 'main[ \t]*$(PAREN)' $(ALL_CXXFILES) /dev/null)
MTESTS := $(shell grep -l 'main[ \t]*$(PAREN)' $(ALL_MFILES) /dev/null)
SHTESTS := $(SHFILES)

EXCLSTR := NO_AUTOMATED_TESTING
EXCL_CTESTS := $(shell grep -l $(EXCLSTR) $(CTESTS) /dev/null)
EXCL_CXXTESTS := $(shell grep -l $(EXCLSTR) $(CXXTESTS) /dev/null)
EXCL_MTESTS := $(shell grep -l $(EXCLSTR) $(MTESTS) /dev/null)
EXCL_SHTESTS := $(shell grep -l $(EXCLSTR) $(SHTESTS) /dev/null)
EXCL_TESTS := $(EXCL_CTESTS) $(EXCL_CXXTESTS) $(EXCL_MTESTS) $(EXCL_SHTESTS)

CFILES = $(filter-out $(CTESTS),$(ALL_CFILES))
CXXFILES = $(filter-out $(CXXTESTS),$(ALL_CXXFILES))
MFILES = $(filter-out $(MTESTS),$(ALL_MFILES))

BUILT_PRODUCTS_DIR ?= $(shell echo $(LOCAL_BUILD_DIR))
ifeq "" "$(BUILT_PRODUCTS_DIR)"
        BUILT_PRODUCTS_DIR = $(SYMROOT)
        ifeq "" "$(BUILT_PRODUCTS_DIR)"
                BUILT_PRODUCTS_DIR = build
        endif
endif
SYMROOT ?= $(BUILT_PRODUCTS_DIR)
OBJROOT ?= $(BUILT_PRODUCTS_DIR)/intermediates/$(PRODUCT).build
SRCROOT ?= $(shell /bin/pwd)
DSTROOT ?= ""

INSTALLDIR := $(DSTROOT)/usr/local/bin

SRCFILES := Makefile $(HFILES) $(CTESTS) $(CFILES) $(CXXTESTS) $(CXXFILES) $(MTESTS) $(MFILES)

BUILT_CTARGETS := $(addprefix $(BUILT_PRODUCTS_DIR)/,$(notdir $(basename $(CTESTS))))
BUILT_CXXTARGETS := $(addprefix $(BUILT_PRODUCTS_DIR)/,$(notdir $(basename $(CXXTESTS))))
BUILT_MTARGETS := $(addprefix $(BUILT_PRODUCTS_DIR)/,$(notdir $(basename $(MTESTS))))
BUILT_TARGETS := $(BUILT_CTARGETS) $(BUILT_CXXTARGETS) $(BUILT_MTARGETS)
EXCL_TARGETS := $(addprefix $(BUILT_PRODUCTS_DIR)/, $(notdir $(basename $(EXCL_TESTS))))
TEST_TARGETS := $(filter-out $(EXCL_TARGETS),$(BUILT_TARGETS))

COFILES := $(addprefix $(OBJROOT)/,$(addsuffix .o, $(basename $(CFILES))))
CXXOFILES := $(addprefix $(OBJROOT)/,$(addsuffix .o, $(basename $(CXXFILES))))
MOFILES := $(addprefix $(OBJROOT)/,$(addsuffix .o, $(basename $(MFILES))))
OFILES := $(COFILES) $(CXXOFILES) $(MOFILES)

TEST_COFILES := $(addprefix $(OBJROOT)/,$(addsuffix .o, $(basename $(CTESTS))))
TEST_CXXOFILES := $(addprefix $(OBJROOT)/,$(addsuffix .o, $(basename $(CXXTESTS))))
TEST_MOFILES := $(addprefix $(OBJROOT)/,$(addsuffix .o, $(basename $(MTESTS))))
TEST_OFILES := $(TEST_COFILES) $(TEST_CXXOFILES) $(TEST_MOFILES)

OBJDIRS := $(sort $(OBJROOT) $(dir $(OFILES) $(TEST_OFILES)))

#
# Assume final load with cc, not ld
#

C_FRAMEWORK_SEARCH_PATHS = $(BUILT_PRODUCTS_DIR)
CPP_FRAMEWORK_SEARCH_PATHS = $(BUILT_PRODUCTS_DIR) \
        /System/Library/PrivateFrameworks /usr/local/SecurityPieces/Frameworks
M_FRAMEWORK_SEARCH_PATHS = $(BUILT_PRODUCTS_DIR) \
        /System/Library/PrivateFrameworks
STD_HEADER_SEARCH_PATHS = $(SRCROOT)/test
STD_LIBARY_SEARCH_PATHS = $(BUILT_PRODUCTS_DIR)

ALL_HEADER_SEARCH_PATHS = $(HEADER_SEARCH_PATHS) $(STD_HEADER_SEARCH_PATHS)
ALL_LIBARY_SEARCH_PATHS = $(LIBARY_SEARCH_PATHS) $(STD_LIBARY_SEARCH_PATHS)

STD_LIBRARIES =
ALL_LIBRARIES = $(STD_LIBRARIES) $(LIBRARIES:lib%.a=%) 

C_FRAMEWORKS = Security CoreFoundation
CPP_FRAMEWORKS = $(C_FRAMEWORKS) #security_utilities
M_FRAMEWORKS = $(C_FRAMEWORKS) SecurityFoundation Foundation

C_FINCLUDES = $(addprefix -F,$(C_FRAMEWORK_SEARCH_PATHS) \
	$(FRAMEWORK_SEARCH_PATHS))
CPP_FINCLUDES = $(addprefix -F,$(CPP_FRAMEWORK_SEARCH_PATHS) \
	$(FRAMEWORK_SEARCH_PATHS))
M_FINCLUDES = $(addprefix -F,$(M_FRAMEWORK_SEARCH_PATHS) \
	$(FRAMEWORK_SEARCH_PATHS))
ALL_INCLUDES = $(addprefix -I,$(ALL_HEADER_SEARCH_PATHS))

#
# Override this from the make command line to add e.g. -lMallocDebug
#
CMDLINE_LDFLAGS=

#
C_LDFLAGS = $(CMDLINE_LDFLAGS) \
        $(C_FINCLUDES) \
        $(addprefix -framework ,$(C_FRAMEWORKS) $(FRAMEWORKS)) \
        $(addprefix -L,$(ALL_LIBARY_SEARCH_PATHS)) \
        $(addprefix -l,$(ALL_LIBARIES)) \
        $(OTHER_LDFLAGS)
CPP_LDFLAGS = $(CMDLINE_LDFLAGS) \
        $(CPP_FINCLUDES) \
        $(addprefix -framework ,$(CPP_FRAMEWORKS) $(FRAMEWORKS)) \
        $(addprefix -L,$(ALL_LIBARY_SEARCH_PATHS)) \
        $(addprefix -l,$(ALL_LIBARIES)) \
        $(OTHER_LDFLAGS) /usr/local/lib/libsecurity_utilities.a
M_LDFLAGS = $(CMDLINE_LDFLAGS) \
        $(M_FINCLUDES) \
        $(addprefix -framework ,$(M_FRAMEWORKS) $(FRAMEWORKS)) \
        $(addprefix -L,$(ALL_LIBARY_SEARCH_PATHS)) \
        $(addprefix -l,$(ALL_LIBARIES)) \
        $(OTHER_LDFLAGS)

###WARNING_CFLAGS = -Wno-four-char-constants -Wall -Werror
WARNING_CFLAGS = -Wno-four-char-constants -Wall -Wno-deprecated-declarations
STD_CFLAGS= -g
DEBUG_CFLAGS=

ALL_CFLAGS = $(C_FINCLUDES) $(ALL_INCLUDES) $(STD_CFLAGS) \
        $(WARNING_CFLAGS) $(OTHER_CFLAGS) $(DEBUG_CFLAGS)
ALL_CXXFLAGS = $(CPP_FINCLUDES) $(ALL_INCLUDES) $(STD_CFLAGS) \
        $(WARNING_CFLAGS) $(OTHER_CXXFLAGS) $(DEBUG_CFLAGS)
ALL_MFLAGS = $(M_FINCLUDES) $(ALL_INCLUDES) $(STD_CFLAGS) \
        $(WARNING_CFLAGS) $(OTHER_CFLAGS) $(DEBUG_CFLAGS)

build: $(OTHER_DEPENDENCIES) $(OBJDIRS) $(BUILT_TARGETS)

all: build

ppc64:
	make CMDLINE_LDFLAGS="-arch ppc64" DEBUG_CFLAGS="-arch ppc64"

install: build
	install -d -m 0755 $(INSTALLDIR)
	install -p -m 0755 $(BUILT_TARGETS) $(INSTALLDIR)

installhdrs:

installsrc:
	mkdir $(DSTROOT)

clean:
	rm -f $(BUILT_TARGETS) $(OFILES) $(TEST_OFILES) $(OTHER_TO_CLEAN)
#	echo rm -rf $(OBJDIRS)

test: build
	@perl -Iinc -e 'use MyHarness; Test::Harness::runtests @ARGV;' $(sort $(TEST_TARGETS)) $(sort $(TFILES))

testexcldebug: build
	@echo EXCL_CTESTS: $(EXCL_CTESTS)
	@echo EXCL_CXXTESTS: $(EXCL_CXXTESTS)
	@echo EXCL_MTESTS: $(EXCL_MTESTS)
	@echo EXCL_SHTESTS: $(EXCL_SHTESTS)
	@echo EXCL_TESTS: $(EXCL_TESTS)
	@echo BUILT_TARGETS: $(BUILT_TARGETS)
	@echo TEST_TARGETS: $(TEST_TARGETS)

LOCAL_OFILES := $(addsuffix .o, $(basename $(CFILES) $(CXXFILES) $(MFILES)))
OFILES := $(LOCAL_OFILES:%=$(OBJROOT)/%)

$(BUILT_CTARGETS): $(COFILES) $(TEST_COFILES)
	$(CC) -o $@ $(filter %/$(notdir $@).o,$(TEST_COFILES)) $(OFILES) $(C_LDFLAGS)

$(BUILT_CXXTARGETS): $(COFILES) $(CXXOFILES) $(TEST_CXXOFILES)
	$(CXX) -o $@ $(filter %/$(notdir $@).o,$(TEST_CXXOFILES)) $(OFILES) $(CPP_LDFLAGS)

$(BUILT_MTARGETS): $(COFILES) $(MOFILES) $(TEST_MOFILES)
	$(CC) -o $@ $(filter %/$(notdir $@).o,$(TEST_MOFILES)) $(OFILES) $(M_LDFLAGS)

$(OBJDIRS):
	@mkdir -p $@

$(OBJROOT)/%.o: %.c
	$(CC) $(ALL_CFLAGS) -c -o $(OBJROOT)/$*.o $<

$(OBJROOT)/%.o: %.cpp
	$(CXX) $(ALL_CXXFLAGS) -c -o $(OBJROOT)/$*.o $<

$(OBJROOT)/%.o: %.m
	$(CC) $(ALL_MFLAGS) -c -o $(OBJROOT)/$*.o $<

$(OFILES) $(TEST_OFILES): $(HFILES)