Blame win32/Makefile.msvc-introspection

Packit a4058c
# Author: Fan, Chun-wei
Packit a4058c
# Common autotools file for constructing the g-ir-scanner and
Packit a4058c
# g-ir-compiler command lines for Visual Studio builds.
Packit a4058c
Packit a4058c
# This is copied from $(srcroot)/win32 from the gobject-introspection
Packit a4058c
# project, which may be included in projects that support both
Packit a4058c
# Visual Studio builds and introspection.
Packit a4058c
Packit a4058c
# * Input variables:
Packit a4058c
#
Packit a4058c
#   MSVC_INTROSPECT_GIRS - List of .gir's that should be built
Packit a4058c
#                          in the NMake Makefiles
Packit a4058c
#
Packit a4058c
# * Simple tutorial
Packit a4058c
#
Packit a4058c
# Add this to Makefile.am where your library/program is built:
Packit a4058c
#   (Either YourLib_1_0_gir_MSVC_LIBS or YourLib_1_0_gir_MSVC_PROGRAM
Packit a4058c
#    is required unless --headers-only is specified in
Packit a4058c
#    YourLib_1_0_gir__MSVC_SCANNERFLAGS)
Packit a4058c
#
Packit a4058c
#   include <this Makefile.msvc-introspection>
Packit a4058c
#   MSVC_INTROSPECT_GIRS = YourLib-1.0.gir
Packit a4058c
#   YourLib_1_0_gir_NAMESPACE = YourLib # This is optional
Packit a4058c
#   YourLib_1_0_gir_VERSION = 1.0 # This is optional
Packit a4058c
#   YourLib_1_0_gir_MSVC_LIBS = yourlib-1.0
Packit a4058c
#   YourLib_1_0_gir_MSVC_FILES = $(libyourlib_1_0_SOURCES)
Packit a4058c
#   YourLib_1_0_gir_MSVC_PROGRAM = YourProgram
Packit a4058c
#   YourLib_1_0_gir_MSVC_PACKAGES = (Dependent .pc files)
Packit a4058c
#   YourLib_1_0_gir_MSVC_INCLUDE_GIRS = (Dependent external .gir's)
Packit a4058c
#   YourLib_1_0_gir_MSVC_EXPORT_PACKAGES = (Packages exported by this .gir)
Packit a4058c
#   YourLib_1_0_gir_MSVC_C_INCLUDES = (List of public C headers which need to be included by
Packit a4058c
#                                      consumers at compile time to make use of the API)
Packit a4058c
Packit a4058c
# Private functions
Packit a4058c
Packit a4058c
## Transform the MSVC project filename (no filename extensions) to something which can reference through a variable
Packit a4058c
## without automake/make complaining, eg Gtk-2.0 -> Gtk_2_0
Packit a4058c
_gir_name=$(subst /,_,$(subst -,_,$(subst .,_,$(1))))
Packit a4058c
Packit a4058c
# Namespace and Version is either fetched from the gir filename
Packit a4058c
# or the _NAMESPACE/_VERSION variable combo
Packit a4058c
_gir_namespace_msvc = $(or $($(_gir_name)_NAMESPACE),$(firstword $(subst -, ,$(notdir $(1)))))
Packit a4058c
_gir_version_msvc = $(or $($(_gir_name)_VERSION),$(lastword $(subst -, ,$(1:.gir=))))
Packit a4058c
_typelib_basename_msvc = $(_gir_namespace_msvc)'-'$(_gir_version_msvc)
Packit a4058c
Packit a4058c
# _PROGRAM is an optional variable which needs its own --program argument
Packit a4058c
_gir_program_msvc = $(if $($(_gir_name)_MSVC_PROGRAM),--program=$($(_gir_name)_MSVC_PROGRAM))
Packit a4058c
Packit a4058c
# Deduce the sub-folder from $(srcroot) where the sources reside in
Packit a4058c
_gir_source_path_raw_msvc:=$(subst $(abs_top_srcdir),,$(abs_srcdir))
Packit a4058c
_gir_source_path_msvc=$(subst /,\\,$(_gir_source_path_raw_msvc))
Packit a4058c
_gir_source_subdir_int_msvc=$(subst \\\\,\\,\\$(_gir_source_path_msvc)\\)
Packit a4058c
_gir_source_subdir_msvc=$(subst \\.\\,\\,$(_gir_source_subdir_int_msvc))
Packit a4058c
Packit a4058c
_gir_files_raw_msvc=$(subst /,\\,$($(_gir_name)_MSVC_FILES))
Packit a4058c
_gir_files_msvc=$(subst $(srcdir)\\,,$(subst $(builddir)\\,,$(subst $(top_builddir)\\$(_gir_source_path_msvc)\\,\\,$(_gir_files_raw_msvc))))
Packit a4058c
Packit a4058c
# Create a list of items for:
Packit a4058c
# - Libraries
Packit a4058c
# - Packages
Packit a4058c
# - GIRs to include
Packit a4058c
# - packages to export
Packit a4058c
Packit a4058c
_gir_libraries_msvc = $(foreach lib,$($(_gir_name)_MSVC_LIBS),--library=$(lib))
Packit a4058c
_gir_packages_msvc = $(foreach pkg,$($(_gir_name)_MSVC_PACKAGES),--pkg=$(pkg))
Packit a4058c
_gir_includes_msvc = $(foreach include,$($(_gir_name)_MSVC_INCLUDE_GIRS),--include=$(include))
Packit a4058c
_gir_export_packages_msvc = $(foreach pkg,$($(_gir_name)_MSVC_EXPORT_PACKAGES),--pkg-export=$(pkg))
Packit a4058c
_gir_c_includes_msvc = $(foreach include,$($(_gir_name)_MSVC_C_INCLUDES),--c-include=$(include))
Packit a4058c
Packit a4058c
#
Packit a4058c
# Create NMake Makefile Sections for Building Introspection files
Packit a4058c
# from autotools files
Packit a4058c
# $(1) - File Name of the .gir that is to be generated
Packit a4058c
#
Packit a4058c
Packit a4058c
define gir-nmake-builder
Packit a4058c
Packit a4058c
# Basic sanity check, to make sure required variables are set
Packit a4058c
$(if $($(_gir_name)_MSVC_FILES),,$(error Need to define $(_gir_name)_MSVC_FILES))
Packit a4058c
$(if $(or $(findstring --header-only,$($(_gir_name)_MSVC_SCANNERFLAGS)),
Packit a4058c
          $($(_gir_name)_MSVC_LIBS),
Packit a4058c
          $($(_gir_name)_MSVC_PROGRAM)),,
Packit a4058c
    $(error Need to define $(_gir_name)_MSVC_LIBS or $(_gir_name)_MSVC_PROGRAM))
Packit a4058c
Packit a4058c
$(top_builddir)/win32/$(_gir_name)_list:
Packit a4058c
	for F in $(_gir_files_msvc); do \
Packit a4058c
		case $$$$F in \
Packit a4058c
		*.c|*.cpp|*.cc|*.cxx|*.h|*.hpp|*.hh|*.hxx) \
Packit a4058c
			echo '..'$(_gir_source_subdir_msvc)$$$$F >>$(top_builddir)/win32/$(_gir_name)_list \
Packit a4058c
			;; \
Packit a4058c
		esac; \
Packit a4058c
	done
Packit a4058c
Packit a4058c
$(top_builddir)/win32/$(1).msvc.introspect:
Packit a4058c
	-$(RM) $(top_builddir)/win32/$(1).msvc.introspect
Packit a4058c
Packit a4058c
# Assemble the Command to Run g-ir-scanner
Packit a4058c
	echo $(1)': '$(_gir_name)'_list '$($(_gir_name)_MSVC_GIR_DEPS)>>$(top_builddir)/win32/$(1).msvc.introspect
Packit a4058c
	echo '	@-echo Generating $$$$@...'>>$(top_builddir)/win32/$(1).msvc.introspect
Packit a4058c
	echo '	$$$$(PYTHON) $$$$(G_IR_SCANNER)	\'>>$(top_builddir)/win32/$(1).msvc.introspect
Packit a4058c
	echo '	--verbose -no-libtool	\'>>$(top_builddir)/win32/$(1).msvc.introspect
Packit a4058c
	echo '	--namespace='$(_gir_namespace_msvc)'	\'>>$(top_builddir)/win32/$(1).msvc.introspect
Packit a4058c
	echo '	--nsversion='$(_gir_version_msvc)'	\'>>$(top_builddir)/win32/$(1).msvc.introspect
Packit a4058c
	echo '	'$(_gir_packages_msvc)'	\'>>$(top_builddir)/win32/$(1).msvc.introspect
Packit a4058c
	echo '	'$(_gir_libraries_msvc)'	\'>>$(top_builddir)/win32/$(1).msvc.introspect
Packit a4058c
	echo '	'$(_gir_program_msvc)'	\'>>$(top_builddir)/win32/$(1).msvc.introspect
Packit a4058c
	echo '	--add-include-path=$$$$(G_IR_INCLUDEDIR)	\'>>$(top_builddir)/win32/$(1).msvc.introspect
Packit a4058c
	echo '	'$(_gir_includes_msvc)'	\'>>$(top_builddir)/win32/$(1).msvc.introspect
Packit a4058c
	echo '	'$(_gir_export_packages_msvc)'	\'>>$(top_builddir)/win32/$(1).msvc.introspect
Packit a4058c
	echo '  '$(_gir_c_includes_msvc)'	\'>>$(top_builddir)/win32/$(1).msvc.introspect
Packit a4058c
	echo '	--cflags-begin	\'>>$(top_builddir)/win32/$(1).msvc.introspect
Packit a4058c
	echo '	'$($(_gir_name)_MSVC_CFLAGS)'	\'>>$(top_builddir)/win32/$(1).msvc.introspect
Packit a4058c
	echo '	--cflags-end	\'>>$(top_builddir)/win32/$(1).msvc.introspect
Packit a4058c
	echo '	'$($(_gir_name)_MSVC_SCANNERFLAGS)'	\'>>$(top_builddir)/win32/$(1).msvc.introspect
Packit a4058c
	echo '	--filelist='$(_gir_name)'_list	\'>>$(top_builddir)/win32/$(1).msvc.introspect
Packit a4058c
	echo '	-o $$$$@'>>$(top_builddir)/win32/$(1).msvc.introspect
Packit a4058c
	echo '' >>$(top_builddir)/win32/$(1).msvc.introspect
Packit a4058c
Packit a4058c
# Finally Assemble the Command to Compile the generated .gir
Packit a4058c
	echo '$(_typelib_basename_msvc).typelib: '$(_typelib_basename_msvc)'.gir'>>$(top_builddir)/win32/$(1).msvc.introspect
Packit a4058c
	echo '	@-echo Compiling $$$$@...'>>$(top_builddir)/win32/$(1).msvc.introspect
Packit a4058c
	echo '	$$$$(G_IR_COMPILER)	\'>>$(top_builddir)/win32/$(1).msvc.introspect
Packit a4058c
	echo '	--includedir=. --debug --verbose	\'>>$(top_builddir)/win32/$(1).msvc.introspect
Packit a4058c
	echo '	'$(1)'	\'>>$(top_builddir)/win32/$(1).msvc.introspect
Packit a4058c
	echo '	-o $$$$@'>>$(top_builddir)/win32/$(1).msvc.introspect
Packit a4058c
	echo '' >>$(top_builddir)/win32/$(1).msvc.introspect
Packit a4058c
endef
Packit a4058c
Packit a4058c
$(foreach gir,$(MSVC_INTROSPECT_GIRS),$(eval $(call gir-nmake-builder,$(gir))))