PKGCONFIG=pkg-config RUNTIME=mono CSC=mcs CSCFLAGS=/nowarn:0612 /unsafe /keyfile:$(basedir)/ngtk.snk GACUTIL=gacutil FIXUP=gapi2-fixup CODEGEN=gapi2-codegen PARSER=gapi2-parser INSTALL = /usr/bin/install -c UNINSTALL = rm -f #basedir = . #hack until we do lib_ automatically lib_none= ifdef PACKAGE_API_VERSION PACKAGE_VERSION = $(PACKAGE_NAME)-$(PACKAGE_API_VERSION) else PACKAGE_VERSION = $(PACKAGE_NAME) endif #TODO: better cross-platform support # test `uname -s` = "Darwin" # see configure.in ifdef win32 CC=gcc -mno-cygwin -mms-bitfields DLLWRAP=dllwrap -mno-cygwin -mms-bitfields --target i386-mingw32 --export-all-symbols SOPREFIX= SOEXT=dll CSC=$(basedir)/mcs RUNTIME= WIN32GLUE=$(basedir)/win32dll.c else GACUTIL_FLAGS=/package $(PACKAGE_VERSION) /gacdir $(libdir) /root $(DESTDIR)$(libdir) SOPREFIX=lib SOEXT=so endif ifndef prefix ifdef RUNTIME prefix = $(patsubst %/bin/$(RUNTIME),%,$(shell which $(RUNTIME))) else prefix = /usr/local endif endif exec_prefix = ${prefix} datadir = ${prefix}/share libdir = ${exec_prefix}/lib gapidir = $(datadir)/gapi-2.0 #pathsearch = $(firstword $(wildcard $(addsuffix /$(1),$(subst :, ,$(PATH))))) #LS := $(call pathsearch,ls) #TODO: Win32 build #GTK_CFLAGS=`$(PKGCONFIG) --cflags gtk+-win32-2.0 libglade-2.0` #GTK_LIBS=`$(PKGCONFIG) --libs gtk+-win32-2.0 libglade-2.0` #TODO: error checking: there may be no glue or glue deps PKG_FLAGS := $(shell $(PKGCONFIG) --cflags --libs $(native_pkg_deps)) #FIXME: this is broken DEP_SOS := $(patsubst -l%,lib%.so.0,$(filter -l%,$(PKG_FLAGS))) DLLMAPS := $(foreach so,$(DEP_SOS), \) eapis := $(patsubst %,api/%-symbols.xml,$(epkgs)) apis := $(eapis) $(patsubst %,api/%-api.xml, $(pkgs)) basedlls := $(patsubst %,bin/n%.dll,$(basepkgs)) dlls := $(patsubst %,bin/n%.dll,$(basepkgs) $(pkgs)) dllconfigs := $(addsuffix .config,$(dlls)) #FIXME: use major/minor version in soname glues := $(patsubst %,lib/$(SOPREFIX)n%glue.$(SOEXT),$(gluepkgs)) exported_refs := $(addprefix -r:, $(sort $(patsubst %,$$\{libdir\}/mono/$(PACKAGE_VERSION)/n%.dll,$(basepkgs) $(epkgs) $(pkgs)))) exported_apis := $(addprefix -I:, $(sort $(patsubst api/%,$$\{gapidir\}/%,$(apis)))) pkgconfigs := $(patsubst %,lib/pkgconfig/%.pc,$(PACKAGE_VERSION)) all: apis dlls libs pkgconfigs .PHONY: install uninstall install: install-apis install-dlls install-libs install-pkgconfigs #a target to install the package without installing to the GAC or building glue install-devel-manual: install-apis install-dlls-manual install-pkgconfigs uninstall: uninstall-libs #FIXME: add %/*.cs to target deps bin/n%.dll: ./src/% ./src/AssemblyInfo.cs $(basedlls) $(CSC) $(CSCFLAGS) -out:$@ -target:library $(addprefix -r:, $(filter %.dll,$(extrarefs) $^)) $(addprefix -pkg:,$(managed_pkg_deps)) $(filter %.cs,$^) $(*F)/*.cs ./src/$(*F)-src/*.cs #$(CSC) $(CSCFLAGS) -out:$@ -target:library $(addprefix -r:, $(filter-out $<,$(extrarefs) $^)) $(*F)/*.cs ./src/$(*F)-src/*.cs #TODO: move the $(PKGCONFIG) run elsewhere, check for nonnull first with foreach src/%: api/%-api.xml $(apis) rm -rf src/$(*F)-src mkdir src/$(*F)-src $(CODEGEN) --generate $< $(addprefix -I:, $(filter-out $<, $^)) $(shell $(PKGCONFIG) --cflags $(managed_pkg_deps)) --outdir=./src/$(*F)-src --customdir=$(*F) --assembly-name=n$(*F) --gluelib-name=n$(*F)glue --glue-filename=./src/$(*F)-src/generated.c --glue-includes=$(glue_includes) touch $@ #[DllImport("ngtkglue-2")] #[DllImport("libgtk-win32-2.0-0.dll")] #[DllImport("libgobject-2.0-0.dll")] #FIXME: finish this off # should ideally be of format NGLib.Native.Glue, NGLib.Native.Library for interaction between assemblies src/AssemblyInfo.cs: echo "using System.Reflection;" > $@ echo "using System.Runtime.CompilerServices;" >> $@ #echo "[assembly:AssemblyVersion(\"$(PACKAGE_API_VERSION)\")]" >> $@ echo >> $@ echo "internal class Native" >> $@ echo "{" >> $@ echo " internal const string $(call comsep,$(foreach g,$(filter lib_%,$(.VARIABLES)),$(patsubst lib_%,%,$(g))=\"$($(g))\"));" >> $@ echo "}" >> $@ echo >> $@ echo "internal class Glue" >> $@ echo "{" >> $@ #echo " internal const string gtk = \"ngtkglue\";" >> $@ echo " internal const string $(call comsep,$(foreach g,$(sort glib $(gluepkgs)),$(g)=\"n$(g)glue\"));" >> $@ echo "}" >> $@ bin/%.config: rm -f $@ echo "" >> $@ echo $(DLLMAPS) >> $@ echo "" >> $@ api/%-api.xml: %/api-raw.xml %/metadata.xml cp -f $< $@ $(FIXUP) --api=$@ --metadata=$(*F)/metadata.xml api/%-api.xml: %/api-raw.xml cp -f $< $@ api/%-symbols.xml: %/symbols.xml cp -f $< $@ #objects := $(patsubst %.c,%.o,$(wildcard *.c)) #FIXME: use version number lib/n%glue.dll: $(RM) *.o $(CC) -c $(PKG_FLAGS) $(WIN32GLUE) $(*F)/glue/*.c $(DLLWRAP) --output-lib=lib/lib$(basename $(notdir $@)).a --dllname=$@ --driver-name=gcc --output-def=lib/$(basename $(notdir $@)).def *.o $(PKG_FLAGS) $(RM) *.o #FIXME: use version number lib/libn%glue.so: src/% touch src/$(*F)-src/generated.c $(CC) -fpic -shared -o $@ $(PKG_FLAGS) $(*F)/glue/*.c src/$(*F)-src/*.c #TODO: Win32 build #lib/%.dll: $(objects) # touch $@ lib/pkgconfig/%.pc: # $(dlls) #touch $@ rm -f $@ echo prefix=$(prefix) >> $@ echo exec_prefix=$$\{prefix\} >> $@ echo libdir=$$\{exec_prefix\}/lib >> $@ echo gapidir=$(gapidir) >> $@ echo >> $@ echo Name: $(PACKAGE_NAME) >> $@ echo Description: $(PACKAGE_DESCRIPTION) >> $@ echo Version: $(PACKAGE_VERSION_NUMBER) >> $@ echo Requires: $(managed_pkg_deps) >> $@ echo Libs: $(exported_refs) >> $@ echo Cflags: $(exported_apis) >> $@ dlls: $(dlls) $(dllconfigs) apis: $(apis) libs: $(glues) pkgconfigs: $(pkgconfigs) parse: sources/sources.xml #cd sources && PATH=../$(basedir)/parser:$$PATH ../$(PARSER) sources.xml cd sources && $(PARSER) sources.xml audit: dlls $(basedir)/generator/NGAudit ./src install-dlls: $(dlls) $(dllconfigs) @for ASSEMBLY in $(dlls) ; \ do \ $(GACUTIL) /i $$ASSEMBLY /f $(GACUTIL_FLAGS) ; \ done install-dlls-manual: $(dlls) @for ASSEMBLY in $(dlls) ; \ do \ $(INSTALL) -D $$ASSEMBLY $(DESTDIR)$(libdir)/mono/$(PACKAGE_VERSION)/`basename $$ASSEMBLY` ; \ done install-apis: $(apis) @for API in $^ ; \ do \ $(INSTALL) -D $$API $(DESTDIR)$(gapidir)/`basename $$API` ; \ done install-pkgconfigs: $(pkgconfigs) @for LIBFILE in $^ ; \ do \ $(INSTALL) -D $$LIBFILE $(DESTDIR)$(prefix)/$$LIBFILE ; \ done #TODO: use libdir install-libs: $(glues) @for LIBFILE in $^ ; \ do \ $(INSTALL) -s -D $$LIBFILE $(DESTDIR)$(prefix)/$$LIBFILE ; \ done #TODO: use libdir uninstall-libs: @for LIBFILE in $(glues) $(pkgconfigs) ; \ do \ $(UNINSTALL) $(DESTDIR)$(prefix)/$$LIBFILE ; \ done #uninstall-local: # @if test -n '$(TARGET)'; then \ # echo "$(GACUTIL) /u $(ASSEMBLY_NAME) $(GACUTIL_FLAGS)"; \ # $(GACUTIL) /u $(ASSEMBLY_NAME) $(GACUTIL_FLAGS) || exit 1; \ # fi .PHONY: clean clean: rm -rf bin/* src/* api/* lib/* mkdir -p bin src api lib lib/pkgconfig #TODO: error handling if something isn't defined? #TODO: these aren't regexes. is there a more appropriate sed mode? #TODO: docs, deps etc. #substitute all vars starting with PACKAGE_ comma:= , empty:= space:= $(empty) $(empty) comsep = $(subst $(space),$(comma)$(space),$(1)) vpath %.pc $(patsubst %/bin/$(PKGCONFIG),%/lib/pkgconfig,$(shell which $(PKGCONFIG))):$(PKG_CONFIG_PATH) RPM = rpm RPM_QUERY_FLAGS = --queryformat \'%{NAME}\' -qf PKG_DEP_PCS = $(addsuffix .pc, $(native_pkg_deps) $(managed_pkg_deps)) rpmdeps = $(foreach pcfile, $(1),$(shell $(RPM) $(RPM_QUERY_FLAGS) $(pcfile))) PACKAGE_RPM_DEPS=$(call comsep,$(call rpmdeps,$(filter %.pc,$^))) PACKAGE_RPM_BUILDDEPS=$(call comsep,$(call rpmdeps,$(filter %.pc,$^))) SED_SUBST_PAIRS = $(foreach key, $(1),-e 's/@$(patsubst PACKAGE_%,%,$(key))@/$($(key))/g') DISTNAME = $(PACKAGE_NAME)-$(PACKAGE_VERSION_NUMBER) RPMSPEC = $(PACKAGE_NAME).spec rpmspec: $(RPMSPEC) dist-bzip2: rm -rf /tmp/$(DISTNAME) mkdir /tmp/$(DISTNAME) cp -a * /tmp/$(DISTNAME) rm -f `find /tmp/$(DISTNAME) -type l` rm -rf `find /tmp/$(DISTNAME) -name .svn` $(MAKE) -C /tmp/$(DISTNAME) clean rpmspec basedir=$(PWD)/$(basedir) tar -C /tmp -c $(DISTNAME) | bzip2 > /tmp/$(DISTNAME).tar.bz2 rm -rf /tmp/$(DISTNAME) %.spec: $(basedir)/package.spec.in Makefile $(PKG_DEP_PCS) sed $(call SED_SUBST_PAIRS,$(filter PACKAGE_%,$(.VARIABLES))) $< > $@ rpm: $(RPMSPEC) #echo rpmbuild --buildroot $(PWD) -bb $< #echo rpmbuild --short-circuit --buildroot $(PWD) -bi $<