# next line has to be edited manually PD_DIR = $(ROOT_DIR)/../../pd/src OS_NAME = $(shell uname -s) ifneq ($(OS_NAME),Linux) ifneq ($(OS_NAME),Darwin) # FIXME endif endif TILDE = ~ -include Makefile.dirs include Makefile.sources include Makefile.objects default: define_build all ifeq ($(OS_NAME),Linux) # FIXME CC = gcc-2.95 X_SUFFIX = pd_linux DEFINES = -DUNIX OPT_CFLAGS = -O6 -funroll-loops -fomit-frame-pointer LFLAGS = -export_dynamic -shared endif ifeq ($(OS_NAME),Darwin) CC = gcc2 X_SUFFIX = pd_darwin DEFINES = -DUNIX -DMACOSX OPT_CFLAGS = -O2 -funroll-loops -fomit-frame-pointer # perhaps "-undefined suppress" would be a better choice, when we go dynamic # with our own common code? (not likely to happen soon...) LFLAGS = -bundle -bundle_loader $(PD_DIR)/../bin/pd -flat_namespace endif SHARED_DIR = $(ROOT_DIR)/shared OBJ_DIR = . OUT_DIR = $(ROOT_DIR)/bin BASE_DIR = $(shell basename `pwd`) BASE_NAME = $(shell basename `pwd` | awk -F - '{print $$1}') # CX: control external's main file # AX: audio (tilde) external's main file # LX: alias external's main file # (if alias external is tilde-only, use OTHER_SOURCES and AX_CLASSES) CX_NAMES = $(notdir $(CX_SOURCES)) AX_NAMES = $(notdir $(AX_SOURCES)) TYPES_NAMES = $(notdir $($1_SOURCES)) ifdef LX_SOURCES LX_NAMES = $(notdir $(LX_SOURCES)) LX_CLASSES = $(subst _,.,$(LX_NAMES)) endif CX_DIR = $(dir $(firstword $(CX_SOURCES))) AX_DIR = $(dir $(firstword $(AX_SOURCES))) TYPES_DIR = $(dir $(firstword $($1_SOURCES))) TYPES_EXTERNS = \ $(patsubst %.c,%$($1_TILDE).$(X_SUFFIX),$(call TYPES_NAMES,$1)) SOURCES = $(CX_SOURCES) $(AX_SOURCES) $(LX_SOURCES) $(OTHER_SOURCES) \ $(foreach type,$(TYPES),$($(type)_SOURCES)) \ $(foreach type,$(TYPES),$($(type)_PRIVATEOBJECTS:.o=.c)) INCLUDES = -I. -I$(PD_DIR) -I$(SHARED_DIR) WARN_CFLAGS = -Wall -W -Wstrict-prototypes -Werror \ -Wno-unused -Wno-parentheses -Wno-switch DBG_CFLAGS = CFLAGS = $(WARN_CFLAGS) $(OPT_CFLAGS) $(DEFINES) $(INCLUDES) EXTERNS = $(foreach fn,$(CX_NAMES:.c=.$(X_SUFFIX)),$(OUT_DIR)/$(fn)) \ $(foreach fn,$(AX_NAMES:.c=~.$(X_SUFFIX)),$(OUT_DIR)/$(fn)) \ $(foreach fn,$(LX_CLASSES:.c=.$(X_SUFFIX)),$(OUT_DIR)/$(fn)) \ $(foreach fn,$(CX_CLASSES:=.$(X_SUFFIX)),$(OUT_DIR)/$(fn)) \ $(foreach fn,$(AX_CLASSES:=~.$(X_SUFFIX)),$(OUT_DIR)/$(fn)) \ $(foreach type,$(TYPES),\ $(foreach fn,$(call TYPES_EXTERNS,$(type)),$(OUT_DIR)/$(fn))) TYPES_RULE = $(foreach fn,$(call TYPES_EXTERNS,$1),$(OUT_DIR)/$(fn)): \ $(OUT_DIR)/%$($1_TILDE).$(X_SUFFIX) \ : $(call TYPES_DIR,$1)%.o $($1_PRIVATEOBJECTS) \ $(foreach obj,$($1_OBJECTS),$(SHARED_DIR)/$(obj)) \ ; $(CC) -o $$@ $(CFLAGS) $(LFLAGS) $$+ # LATER find a better way... $(if $(word 1,$(TYPES)),$(call TYPES_RULE,$(word 1,$(TYPES)))) $(if $(word 2,$(TYPES)),$(call TYPES_RULE,$(word 2,$(TYPES)))) $(if $(word 3,$(TYPES)),$(call TYPES_RULE,$(word 3,$(TYPES)))) $(if $(word 4,$(TYPES)),$(call TYPES_RULE,$(word 4,$(TYPES)))) $(if $(word 5,$(TYPES)),$(call TYPES_RULE,$(word 5,$(TYPES)))) $(if $(word 6,$(TYPES)),$(call TYPES_RULE,$(word 6,$(TYPES)))) $(if $(word 7,$(TYPES)),$(call TYPES_RULE,$(word 7,$(TYPES)))) $(if $(word 8,$(TYPES)),$(call TYPES_RULE,$(word 8,$(TYPES)))) $(if $(word 9,$(TYPES)),$(call TYPES_RULE,$(word 9,$(TYPES)))) $(if $(word 10,$(TYPES)),$(call TYPES_RULE,$(word 10,$(TYPES)))) $(if $(word 11,$(TYPES)),$(call TYPES_RULE,$(word 11,$(TYPES)))) $(if $(word 12,$(TYPES)),$(call TYPES_RULE,$(word 12,$(TYPES)))) $(if $(word 13,$(TYPES)),$(call TYPES_RULE,$(word 13,$(TYPES)))) $(if $(word 14,$(TYPES)),$(call TYPES_RULE,$(word 14,$(TYPES)))) $(if $(word 15,$(TYPES)),$(call TYPES_RULE,$(word 15,$(TYPES)))) $(if $(word 16,$(TYPES)),$(call TYPES_RULE,$(word 16,$(TYPES)))) $(if $(word 17,$(TYPES)),$(call TYPES_RULE,$(word 17,$(TYPES)))) $(if $(word 18,$(TYPES)),$(call TYPES_RULE,$(word 18,$(TYPES)))) $(if $(word 19,$(TYPES)),$(call TYPES_RULE,$(word 19,$(TYPES)))) $(if $(word 20,$(TYPES)),$(call TYPES_RULE,$(word 20,$(TYPES)))) $(if $(word 21,$(TYPES)),$(call TYPES_RULE,$(word 21,$(TYPES)))) $(if $(word 22,$(TYPES)),$(call TYPES_RULE,$(word 22,$(TYPES)))) $(if $(word 23,$(TYPES)),$(call TYPES_RULE,$(word 23,$(TYPES)))) $(if $(word 24,$(TYPES)),$(call TYPES_RULE,$(word 24,$(TYPES)))) SHOBJECTS = $(foreach fn,$(SHARED_OBJECTS),$(SHARED_DIR)/$(fn)) OBJECTS = $(foreach fn,$(OTHER_SOURCES:.c=.o),$(OBJ_DIR)/$(fn)) \ $(foreach fn,$(LX_SOURCES:.c=.o),$(OBJ_DIR)/$(fn)) \ $(SHOBJECTS) # lame... .PRECIOUS: %.o # rules for aliases must precede generic extern rules # FIXME $(OUT_DIR)/$(BASE_NAME).%~.$(X_SUFFIX): $(BASE_NAME)_loader.c $(SHOBJECTS) $(CC) -o $@ -Xlinker -defsym \ -Xlinker $(BASE_NAME).$(*F)_tilde_setup=$(BASE_NAME)_loader_setup \ $(CFLAGS) $(LFLAGS) $(SHOBJECTS) $< $(OUT_DIR)/$(BASE_NAME).%.$(X_SUFFIX): $(BASE_NAME)_loader.c $(SHOBJECTS) $(CC) -o $@ -Xlinker -defsym \ -Xlinker $(BASE_NAME).$(*F)_setup=$(BASE_NAME)_loader_setup \ $(CFLAGS) $(LFLAGS) $(SHOBJECTS) $< #$(OUT_DIR)/$(BASE_NAME).%.$(X_SUFFIX): $(BASE_NAME)_%.c $(SHOBJECTS) # $(CC) -c $(CFLAGS) $< # -ld -o $@ -defsym $(BASE_NAME).$(*F)_setup=$(BASE_NAME)_$(*F)_setup \ # -L $(OUT_DIR) $(LFLAGS) $(SHOBJECTS) \ # $(BASE_NAME).$(X_SUFFIX) $(BASE_NAME)_$(*F).o # $(CC) -o $@ -Xlinker -defsym \ # -Xlinker $(BASE_NAME).$(*F)_setup=$(BASE_NAME)_$(*F)_setup \ # -Xlinker -rpath -Xlinker $(OUT_DIR) \ # $(CFLAGS) $(LFLAGS) $(SHOBJECTS) $(BASE_NAME).$(X_SUFFIX) $< # library stub # if not equal BASE_NAME, it has to be declared explicitly in BASE_DIR/Makefile # FIXME $(OUT_DIR)/$(LX_STUB)_%~.$(X_SUFFIX): $(OUT_DIR)/$(BASE_NAME).$(X_SUFFIX) -ln -sf $(BASE_NAME).$(X_SUFFIX) $@ $(OUT_DIR)/$(LX_STUB)_%.$(X_SUFFIX): $(OUT_DIR)/$(BASE_NAME).$(X_SUFFIX) -ln -sf $(BASE_NAME).$(X_SUFFIX) $@ $(OUT_DIR)/$(LX_STUB).$(X_SUFFIX): $(OUT_DIR)/$(BASE_NAME).$(X_SUFFIX) -ln -sf $(BASE_NAME).$(X_SUFFIX) $@ # generic rule for audio externals $(OUT_DIR)/%~.$(X_SUFFIX): $(AX_DIR)%.c $(OBJECTS) $(CC) -o $@ $(CFLAGS) $(LFLAGS) $(OBJECTS) $< # generic rule for control externals $(OUT_DIR)/%.$(X_SUFFIX): $(CX_DIR)%.c $(OBJECTS) $(CC) -o $@ $(CFLAGS) $(LFLAGS) $(OBJECTS) $< SUBDIRS = @for i in $(MIXED_DIRS) and_in_case_it_is_null ; \ do ( if [ -d $$i ] ; then \ cd $$i; $(MAKE) $@ ; fi ) ; done SUBDIRS_DEFAULT = @for i in $(MIXED_DIRS) and_in_case_it_is_null ; \ do ( if [ -d $$i ] ; then \ cd $$i; $(MAKE) ; fi ) ; done define_build: @if [[ -f build_counter && `whoami` == krzYszcz && \ `date -r build_counter +%j` != `date +%j` ]] ; then \ mv build_counter build_counter~ ; \ echo -n 'increment build counter (y/n)? [n]' ; read doit ; \ if [ $$doit ] && [ $$doit == 'y' ] ; then \ cat build_counter~ | \ awk '{if (index($$2,"BUILD")) print $$1, $$2, $$3+1; else print}' \ > build_counter ; \ cat build_counter | \ awk 'BEGIN {printf toupper("$(BASE_NAME)_VERSION = ")} \ {gsub("\"","",$$3); printf $$3; if (NR==1) printf "-"} \ END {printf "\r\n" }' > $(ROOT_DIR)/ViCious/$(BASE_DIR)/version ; \ else cat build_counter~ > build_counter ; fi \ fi all$(BASE_NAME)s.c: Makefile.sources $(ROOT_DIR)/dumpsetups > $@ all: $(EXTERNS) $(SUBDIRS_DEFAULT) clean: emptydeps # remove all objects and externs that are contained in current directory -rm -f *.o *.$(X_SUFFIX) $(SUBDIRS) cleanall: clean # remove default target externs -rm -f $(EXTERNS) $(SUBDIRS) # added by Hans-Christoph Steiner to remove # files created when making MacOS X packages -rm -Rf ../installroot OLDROOT_DIR = $(shell ls -d -1 ../../Mixed-* | tail -1) diff: @echo -n > diff.out ; \ for f in {*.h,*.c} ; do \ if [ -f $$f ] ; then \ diff -u $(OLDROOT_DIR)/$(BASE_DIR)/$$f $$f >> diff.out ; \ fi \ done VERSION = $(shell awk \ '{if (index($$2,"VERSION")) print substr($$3,2,length($$3)-2)}' \ build_counter) RELEASE = $(shell awk \ '{if (index($$2,"RELEASE")) print substr($$3,2,length($$3)-2)}' \ build_counter) BUILD = $(shell awk '{if (index($$2,"BUILD")) print $$3}' build_counter) RELEASE_STUB = release/$(BASE_NAME)-$(VERSION)-$(RELEASE)$(BUILD) SRC_TAR = $(RELEASE_STUB)-src.tar BIN_TAR = $(RELEASE_STUB)-bin.tar LIB_TAR = $(RELEASE_STUB)-lib.tar DOC_TAR = $(RELEASE_STUB)-doc.tar ALL_TAR = $(RELEASE_STUB)-all.tar REL_BINDIR = bin REL_LIBNAMES = $(foreach fn,$(RELEASE_LIBS:=.$(X_SUFFIX)),$(REL_BINDIR)/$(fn)) REL_EXTERNS = $(foreach fn,$(CX_NAMES:.c=.$(X_SUFFIX)),$(REL_BINDIR)/$(fn)) \ $(foreach fn,$(AX_NAMES:.c=~.$(X_SUFFIX)),$(REL_BINDIR)/$(fn)) \ $(REL_LIBNAMES) $(foreach fn,$(RELEASE_APPS),$(REL_BINDIR)/$(fn)) \ $(foreach type,$(TYPES),\ $(foreach fn,$(call TYPES_EXTERNS,$(type)),$(REL_BINDIR)/$(fn))) REL_ROOTSRC = LICENSE.txt Makefile.common dumpsetups srelease: emptydeps define_build cd $(ROOT_DIR)/shared; $(MAKE) emptydeps cd $(ROOT_DIR); tar -X $(BASE_DIR)/$(BASE_NAME)-all.exclude -cf \ $(SRC_TAR) $(BASE_DIR)/* $(REL_ROOTSRC) cd $(ROOT_DIR); tar -T $(BASE_DIR)/$(BASE_NAME)-shared.include -rf \ $(SRC_TAR) cd $(ROOT_DIR); gzip -f $(SRC_TAR) stestrelease: emptydeps define_build cd $(ROOT_DIR)/shared; $(MAKE) emptydeps cd $(ROOT_DIR); tar -X $(BASE_DIR)/$(BASE_NAME)-all.exclude -cf \ $(SRC_TAR) $(BASE_DIR)/* $(REL_ROOTSRC) cd $(ROOT_DIR); tar -T $(BASE_DIR)/$(BASE_NAME)-shared.include -rf \ $(SRC_TAR) cd $(ROOT_DIR); tar -X $(BASE_DIR)/$(BASE_NAME)-test.exclude -rf \ $(SRC_TAR) test/$(BASE_NAME)/* cd $(ROOT_DIR); tar -X $(BASE_DIR)/$(BASE_NAME)-vicious.exclude -rf \ $(SRC_TAR) ViCious/$(BASE_DIR)/* cd $(ROOT_DIR); gzip -f $(SRC_TAR) brelease: define_build cd $(ROOT_DIR); tar zcf \ $(BIN_TAR).gz $(REL_EXTERNS) btestrelease: define_build cd $(ROOT_DIR); tar -cf $(BIN_TAR) $(REL_EXTERNS) cd $(ROOT_DIR); tar -X $(BASE_DIR)/$(BASE_NAME)-test.exclude -rf \ $(BIN_TAR) test/$(BASE_NAME)/* cd $(ROOT_DIR); gzip -f $(BIN_TAR) rellibs: cd $(ROOT_DIR); tar zcf \ $(LIB_TAR).gz $(REL_LIBNAMES) drelease: define_build cd $(ROOT_DIR); tar -X $(BASE_DIR)/$(BASE_NAME)-doc.exclude -zcf \ $(DOC_TAR).gz doc/examples/$(BASE_NAME)/* release: srelease brelease drelease cd $(ROOT_DIR); tar -X $(BASE_DIR)/$(BASE_NAME)-all.exclude -cf \ $(ALL_TAR) $(BASE_DIR)/* $(REL_ROOTSRC) $(REL_EXTERNS) cd $(ROOT_DIR); tar -T $(BASE_DIR)/$(BASE_NAME)-shared.include -rf \ $(ALL_TAR) cd $(ROOT_DIR); tar -X $(BASE_DIR)/$(BASE_NAME)-doc.exclude -rf \ $(ALL_TAR) doc/examples/$(BASE_NAME)/* cd $(ROOT_DIR); gzip -f $(ALL_TAR) testrelease: stestrelease btestrelease cd $(ROOT_DIR); tar -X $(BASE_DIR)/$(BASE_NAME)-all.exclude -cf \ $(ALL_TAR) $(BASE_DIR)/* $(REL_ROOTSRC) $(REL_EXTERNS) cd $(ROOT_DIR); tar -T $(BASE_DIR)/$(BASE_NAME)-shared.include -rf \ $(ALL_TAR) cd $(ROOT_DIR); tar -X $(BASE_DIR)/$(BASE_NAME)-test.exclude -rf \ $(ALL_TAR) test/$(BASE_NAME)/* cd $(ROOT_DIR); tar -X $(BASE_DIR)/$(BASE_NAME)-vicious.exclude -rf \ $(ALL_TAR) ViCious/$(BASE_DIR)/* cd $(ROOT_DIR); gzip -f $(ALL_TAR) snap: emptyalldeps stestrelease btestrelease depend: $(CC) $(CFLAGS) -M $(SOURCES) > Makefile.deps $(SUBDIRS) emptydeps: -rm -f Makefile.deps touch Makefile.deps chmod 666 Makefile.deps emptyalldeps: emptydeps $(SUBDIRS) Makefile.deps: touch Makefile.deps chmod 666 Makefile.deps -include Makefile.deps # added by Hans-Christoph Steiner # to generate MacOS X packages # krzYszcz: # LATER try making cyclone-specifics abstracted out ala linux release # keep cyclone libs, because they offer the max->pd import facility PACKAGE_PREFIX = pd-$(BASE_NAME) PACKAGE_NAME = $(PACKAGE_PREFIX)-$(VERSION)-$(RELEASE)$(BUILD) darwin_pkg_license: # generate HTML version of License echo "" > License.html cat ../LICENSE.txt | sed -e 's/^$$/\/g' >> License.html echo "" >> License.html darwin_pkg_clean: -sudo rm -Rf installroot/ $(PACKAGE_PREFIX)*.pkg/ -rm -f $(PACKAGE_PREFIX)-*.info *~ 1 License.html # install into MacOS X style paths: /Library/Pd darwin_altpkg: all darwin_pkg_clean darwin_pkg_license # set up installroot dir test -d installroot/Help || mkdir -p installroot/Help cp ../test/cyclone/*.pd ../test/cyclone/test* ../test/cyclone/*.coll ../test/cyclone/*.mid installroot/Help test -d installroot/Externals || mkdir -p installroot/Externals install -m644 ../bin/*.pd_darwin installroot/Externals sed -e 's/\/usr\/local/\/Library\/Pd/' pd-cyclone.info \ | sed -e 's/MSP standard paths/MacOS X-style Paths/' \ > $(PACKAGE_NAME)-alt.info # delete cruft -find installroot -name .DS_Store -delete -rm -f 1 # set proper permissions sudo chown -R root:staff installroot package installroot $(PACKAGE_NAME)-alt.info -d . -ignoreDSStore # install pkg docs install -m 644 License.html Welcome.html $(PACKAGE_NAME)-alt.pkg/Contents/Resources sudo chown -R root:staff $(PACKAGE_NAME)-alt.pkg/Contents/Resources # install into MSP's default: /usr/local/lib darwin_pkg: all darwin_pkg_clean darwin_pkg_license # set up installroot dir test -d installroot/lib/pd/doc/5.reference || mkdir -p installroot/lib/pd/doc/5.reference cp ../test/cyclone/*.pd ../test/cyclone/test* ../test/cyclone/*.coll ../test/cyclone/*.mid installroot/lib/pd/doc/5.reference test -d installroot/lib/pd/extra || mkdir -p installroot/lib/pd/extra install -m644 ../bin/*.pd_darwin --group=staff installroot/lib/pd/extra test -d installroot/bin || mkdir -p installroot/bin install -m755 ../bin/cyclist --group=staff installroot/bin cp -f pd-cyclone.info $(PACKAGE_NAME).info # delete cruft -find installroot -name .DS_Store -delete -rm -f 1 # set proper permissions sudo chown -R root:staff installroot package installroot $(PACKAGE_NAME).info -d . -ignoreDSStore # install pkg docs install -m 644 License.html Welcome.html $(PACKAGE_NAME).pkg/Contents/Resources sudo chown -R root:staff $(PACKAGE_NAME).pkg/Contents/Resources