# Author: Fan, Chun-wei # Common Autotools file used to generate Visual Studio 2008+ # Projects from their templates # This autotools file, from GLib, can be used in other projects # that have Visual Studio build support, and is copied into # $(srcroot)/build/. # * Input variables: # # MSVCPROJS - List of Projects that should be generated # # * Simple tutorial # # Add this to Makefile.am where your library/program is built: # include $(top_srcdir)/build/Makefile.msvcproj # MSVCPROJS = YourProject (can be multiple projects in a single srcdir) # YourProject_FILES = $(libyourlib_1_0_SOURCES) # YourProject_EXCLUDES = ... # list of sources to exclude, separated by '|', wildcards allowed; use random unsed value if none # YourProject_HEADERS_DIR = $(libyourlibincludedir) # YourProject_HEADERS_INST = $(libyourlib_1_0_HEADERS) # YourProject_HEADERS_EXCLUDES = ... # # # dist-hook: \ # (or add to it if it is already there, note the vs9 items will also call the vs10 items in the process) # $(top_builddir)/build/win32/vs9/YourProject.vcproj \ # $(top_builddir)/build/win32/vs9/YourProject.headers # Private functions ## Transform the MSVC project filename (no filename extensions) to something which can reference through a variable ## without automake/make complaining, eg Gtk-2.0 -> Gtk_2_0 _proj_name=$(subst /,_,$(subst -,_,$(subst .,_,$(1)))) _proj_path_raw:=$(subst $(abs_top_srcdir),,$(abs_srcdir)) _proj_path=$(subst /,\\,$(_proj_path_raw)) _proj_subdir_int=$(subst \\\\,\\,\\$(_proj_path)\\) _proj_subdir=$(subst \\.\\,\\,$(_proj_subdir_int)) _proj_files_raw=$(subst /,\\,$($(_proj_name)_FILES)) _proj_files=$(subst $(srcdir)\\,,$(subst $(builddir)\\,,$(subst $(top_builddir)\\$(_proj_path)\\,\\,$(_proj_files_raw)))) _proj_filters=$($(_proj_name)_EXCLUDES) _proj_headers_raw=$(subst /,\\,$($(_proj_name)_HEADERS_INST)) _proj_headers=$(subst $(srcdir)\\,,$(subst $(builddir)\\,,$(subst $(top_builddir)\\$(_proj_path)\\,\\,$(_proj_headers_raw)))) _proj_headers_excludes=$($(_proj_name)_HEADERS_EXCLUDES) _headers_dest_posix=$(subst $(includedir),,$($(_proj_name)_HEADERS_DIR)) _headers_destdir=$(subst /,\\,$(_headers_dest_posix)) # # Creates Visual Studio 2008/2010 projects from items passed in from autotools files # $(1) - Base Name of the MSVC project files (outputs) # define msvcproj-builder $(top_builddir)/build/win32/vs10/$(1).vcxproj: $(top_builddir)/build/win32/vs9/$(1).vcproj $(top_builddir)/build/win32/vs10/$(1).vcxproj.filters: $(top_builddir)/build/win32/vs9/$(1).vcproj $(1).sourcefiles: $(top_builddir)/build/win32/vs9/$(1).vcproj $(1).vs10.sourcefiles: $(top_builddir)/build/win32/vs9/$(1).vcproj $(1).vs10.sourcefiles.filters: $(top_builddir)/build/win32/vs9/$(1).vcproj $(top_builddir)/build/win32/vs9/$(1).vcproj: Makefile -$(RM) $(top_builddir)/build/win32/vs9/$(1).vcproj -$(RM) $(top_builddir)/build/win32/vs10/$(1).vcxproj -$(RM) $(top_builddir)/build/win32/vs10/$(1).vcxproj.filters -$(RM) $(top_builddir)/build/win32/vs11/$(1).vcxproj -$(RM) $(top_builddir)/build/win32/vs11/$(1).vcxproj.filters -$(RM) $(top_builddir)/build/win32/vs12/$(1).vcxproj -$(RM) $(top_builddir)/build/win32/vs12/$(1).vcxproj.filters -$(RM) $(top_builddir)/build/win32/vs14/$(1).vcxproj -$(RM) $(top_builddir)/build/win32/vs14/$(1).vcxproj.filters for F in $(_proj_files); do \ case $$$$F in \ $(_proj_filters)) \ ;; \ *.c|*.cpp|*.cc|*.cxx) \ echo ' ' >>$(1).sourcefiles && \ echo ' ' >>$(1).vs10.sourcefiles && \ echo ' Source Files' >>$(1).vs10.sourcefiles.filters \ ;; \ esac; \ done $(CPP) -P - <$(top_srcdir)/build/win32/vs9/$(1).vcprojin >$(top_builddir)/build/win32/vs9/$(1).vcproj $(CPP) -P - <$(top_srcdir)/build/win32/vs10/$(1).vcxprojin >$(top_builddir)/build/win32/vs10/$(1).vcxproj $(CPP) -P - <$(top_srcdir)/build/win32/vs10/$(1).vcxproj.filtersin >$(top_builddir)/build/win32/vs10/$(1).vcxproj.filters $(RM) $(1).sourcefiles $(RM) $(1).vs10.sourcefiles $(RM) $(1).vs10.sourcefiles.filters $(top_builddir)/build/win32/vs10/$(1).vs10.headers: $(top_builddir)/build/win32/vs9/$(1).headers $(top_builddir)/build/win32/vs9/$(1).headers: Makefile -$(RM) $(top_builddir)/build/win32/vs9/$(1).headers -$(RM) $(top_builddir)/build/win32/vs10/$(1).vs10.headers for F in $(_proj_headers); do \ case $$$$F in \ $(_proj_headers_excludes)) \ ;; \ *.h|*.hpp|*.hh|*.hxx) \ echo 'copy ..\..\..'$(_proj_subdir)$$$$F' $$$$(CopyDir)\include'$(_headers_destdir)'\'$$$$F' ' >>$(top_builddir)/build/win32/vs9/$(1).headers && \ echo 'copy ..\..\..'$(_proj_subdir)$$$$F' $$$$(CopyDir)\include'$(_headers_destdir)'\'$$$$F >>$(top_builddir)/build/win32/vs10/$(1).vs10.headers \ ;; \ esac; \ done $(top_builddir)/build/win32/vs12/$(1).vcxproj.filters: $(top_builddir)/build/win32/vs12/$(1).vcxproj $(top_builddir)/build/win32/vs12/$(1).vcxproj: Makefile -$(RM) $(top_builddir)/build/win32/vs14/$(1).vcxproj -$(RM) $(top_builddir)/build/win32/vs14/$(1).vcxproj.filters for F in $(_proj_files); do \ case $$$$F in \ $(_proj_filters)) \ ;; \ *.c|*.cpp|*.cc|*.cxx) \ echo ' ' >>$(1).vs12.sourcefiles && \ echo ' Source Files' >>$(1).vs12.sourcefiles.filters \ ;; \ esac; \ done $(CPP) -P - <$(top_srcdir)/build/win32/vs12/$(1).vcxprojin >$(top_builddir)/build/win32/vs12/$(1).vcxproj $(CPP) -P - <$(top_srcdir)/build/win32/vs12/$(1).vcxproj.filtersin >$(top_builddir)/build/win32/vs12/$(1).vcxproj.filters $(RM) $(1).vs12.sourcefiles $(RM) $(1).vs12.sourcefiles.filters $(top_builddir)/build/win32/vs12/$(1).vs12.headers: Makefile -$(RM) $(top_builddir)/build/win32/vs12/$(1).vs12.headers for F in $(_proj_headers); do \ case $$$$F in \ $(_proj_headers_excludes)) \ ;; \ *.h|*.hpp|*.hh|*.hxx) \ echo 'copy ..\..\..'$(_proj_subdir)$$$$F' $$$$(CopyDir)\include'$(_headers_destdir)'\'$$$$F >>$(top_builddir)/build/win32/vs12/$(1).vs12.headers \ ;; \ esac; \ done endef $(foreach proj,$(MSVCPROJS),$(eval $(call msvcproj-builder,$(proj))))