# # Copyright (c) 2006 The Apache Software Foundation # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # ---------------------------------------------------------------- # # Makefile for Qpid C++ project. # # Build system principles # * Single Makefile (see http://www.apache.org/licenses/LICENSE-2.0) # * Build from directories, no explicit source lists in Makefile. # * Corresponding .cpp and .h files in same directory for easy editing. # * Source directory structure mirrors C++ namespaces. # # Source directories: # * src/ - .h and .cpp source files, directories mirror namespaces. # * test/ # * unit/ - unit tests (cppunit plugins), directories mirror namespaces. # * include/ - .h files used by tests # * client/ - sources for client test executables. # * etc/ - Non-c++ resources, e.g. stylesheets. # * gen/ - generated code # # Output directories: # * gen/ - (created by make) generated code # * bin/ lib/ - exes & libraries. # # NOTE: always use := rather than = unless you have a specific need # for delayed evaluation. See the link for details. # include options.mk .PHONY: test all all-nogen generate unittest pythontest test: unittest pythontest # Must run this as two separate make processes to pick up generated files. all: $(MAKE) generate $(MAKE) all-nogen ## Generaged code SPEC := $(CURDIR)/../specs/amqp-8.0.xml XSL := code_gen.xsl framing.xsl STYLESHEETS := $(XSL:%=$(CURDIR)/etc/stylesheets/%) TRANSFORM := java -jar $(CURDIR)/tools/saxon8.jar -o results.out $(SPEC) generate: gen/timestamp gen/timestamp: $(wildcard etc/stylesheets/*.xsl) $(SPEC) mkdir -p gen/qpid/framing echo > gen/timestamp cd gen/qpid/framing && for s in $(STYLESHEETS) ; do $(TRANSFORM) $$s ; done gen $(wildcard gen/qpid/framing/*.cpp): gen/timestamp ## Libraries # Library command, late evaluated for $@ LIB_CMD = $(CXX) -shared -o $@ $(LDFLAGS) $(CXXFLAGS) -lapr-1 # Common library. COMMON_LIB := lib/libqpid_common.so.1.0 COMMON_DIRS := qpid/concurrent qpid/framing qpid/io qpid COMMON_SRC := $(wildcard gen/qpid/framing/*.cpp $(COMMON_DIRS:%=src/%/*.cpp)) $(COMMON_LIB): gen/timestamp $(COMMON_SRC:.cpp=.o) $(LIB_CMD) $(COMMON_SRC:.cpp=.o) all-nogen: $(COMMON_LIB) UNITTESTS := $(UNITTESTS) $(wildcard $(COMMON_DIRS:%=test/unit/%/*Test.cpp)) # Client library. CLIENT_LIB := lib/libqpid_client.so.1.0 CLIENT_SRC := $(wildcard src/qpid/client/*.cpp) $(CLIENT_LIB): $(CLIENT_SRC:.cpp=.o) $(CURDIR)/$(COMMON_LIB) $(LIB_CMD) $^ all-nogen: $(CLIENT_LIB) UNITTESTS := $(UNITTESTS) $(wildcard $(COMMON_DIRS:%=test/unit/%/*Test.cpp)) # Broker library. BROKER_LIB := lib/libqpid_broker.so.1.0 BROKER_SRC := $(wildcard src/qpid/broker/*.cpp) $(BROKER_LIB): $(BROKER_SRC:.cpp=.o) $(CURDIR)/$(COMMON_LIB) $(LIB_CMD) $^ all-nogen: $(BROKER_LIB) UNITTESTS := $(UNITTESTS) $(wildcard test/unit/qpid/broker/*Test.cpp) # Implicit rule for unit test plugin libraries. %Test.so: %Test.cpp $(CURDIR)/$(COMMON_LIB) $(CURDIR)/$(BROKER_LIB) $(CXX) -shared -o $@ $< $($(LIB)_FLAGS) -Itest/include $(CXXFLAGS) $(LDFLAGS) -lapr-1 -lcppunit $(CURDIR)/$(COMMON_LIB) $(CURDIR)/$(BROKER_LIB) ## Client tests CLIENT_TEST_SRC := $(wildcard test/client/*.cpp) all-nogen: $(CLIENT_TEST_SRC:.cpp=) test/client/%: test/client/%.cpp $(CXX) -o $@ $< $($(LIB)_FLAGS) -Itest/include $(CXXFLAGS) $(LDFLAGS) -lapr-1 $(CURDIR)/$(COMMON_LIB) $(CURDIR)/$(CLIENT_LIB) ## Daemon executable bin/qpidd: src/qpidd.o $(CURDIR)/$(COMMON_LIB) $(CURDIR)/$(BROKER_LIB) $(CXX) -o $@ $(CXXFLAGS) $(LDFLAGS) -lapr-1 $^ all-nogen: bin/qpidd ## Run unit tests. unittest: all DllPlugInTester -c -b $(UNITTESTS:.cpp=.so) all-nogen: $(UNITTESTS:.cpp=.so) ## Run python tests pythontest: all bin/qpidd > qpidd.log & cd ../python ; ./run-tests -v -I cpp_failing.txt ## Doxygen documentation. doxygen: doxygen/doxygen.cfg $(SOURCES) cd doxygen && doxygen doxygen.cfg ## #include dependencies -include $(shell find src test -name '*.d') ## Cleanup clean:: rm -f bin/* lib/* qpidd.log rm -rf gen rm -f `find src test -name '*.o' -o -name '*.d' -o -name '*.so'`