| # 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. |
| |
| # * Input variables: |
| # |
| # MSVCPROJS - List of Projects that should be generated |
| # |
| # * Simple tutorial |
| # |
| # Add this to Makefile.am where your library/program is built: |
| # include <this 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 |
| # (the following 3 lines if headers need to be installed) |
| # YourProject_HEADERS_DIR = $(libyourlibincludedir) |
| # YourProject_HEADERS_INST = $(libyourlib_1_0_HEADERS) |
| # YourProject_HEADERS_EXCLUDES = ... # <list of headers to exclude from installation, separated by '|', wildcards allowed; use random unsed value if none> |
| # |
| # 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)/win32/vs9/YourProject.vcproj \ |
| # $(top_builddir)/win32/vs9/YourProject.headers # if headers need to be installed |
| # |
| # --or, if Visual Studio 2013 or later is required-- |
| # dist-hook: \ # (or add to it if it is already there, this does -not- call other vs items in the process) |
| # $(top_builddir)/win32/vs12/YourProject.vcxproj \ |
| # $(top_builddir)/win32/vs12/YourProject.vs12.headers # if headers need to be installed |
| |
| # 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)/win32/vs10/$(1).vcxproj: $(top_builddir)/win32/vs9/$(1).vcproj |
| $(top_builddir)/win32/vs10/$(1).vcxproj.filters: $(top_builddir)/win32/vs9/$(1).vcproj |
| $(1).sourcefiles: $(top_builddir)/win32/vs9/$(1).vcproj |
| $(1).vs10.sourcefiles: $(top_builddir)/win32/vs9/$(1).vcproj |
| $(1).vs10.sourcefiles.filters: $(top_builddir)/win32/vs9/$(1).vcproj |
| |
| $(top_builddir)/win32/vs9/$(1).vcproj: Makefile |
| -$(RM) $(top_builddir)/win32/vs9/$(1).vcproj |
| -$(RM) $(top_builddir)/win32/vs10/$(1).vcxproj |
| -$(RM) $(top_builddir)/win32/vs10/$(1).vcxproj.filters |
| -$(RM) $(top_builddir)/win32/vs11/$(1).vcxproj |
| -$(RM) $(top_builddir)/win32/vs11/$(1).vcxproj.filters |
| -$(RM) $(top_builddir)/win32/vs12/$(1).vcxproj |
| -$(RM) $(top_builddir)/win32/vs12/$(1).vcxproj.filters |
| -$(RM) $(top_builddir)/win32/vs14/$(1).vcxproj |
| -$(RM) $(top_builddir)/win32/vs14/$(1).vcxproj.filters |
| |
| |
| for F in $(_proj_files); do \ |
| case $$$$F in \ |
| $(_proj_filters)) \ |
| ;; \ |
| *.c|*.cpp|*.cc|*.cxx) \ |
| echo ' <File RelativePath="..\..'$(_proj_subdir)$$$$F'" />' >>$(1).sourcefiles && \ |
| echo ' <ClCompile Include="..\..'$(_proj_subdir)$$$$F'" />' >>$(1).vs10.sourcefiles && \ |
| echo ' <ClCompile Include="..\..'$(_proj_subdir)$$$$F'"><Filter>Source Files</Filter></ClCompile>' >>$(1).vs10.sourcefiles.filters \ |
| ;; \ |
| esac; \ |
| done |
| |
| |
| $(CPP) -P - <$(top_srcdir)/win32/vs9/$(1).vcprojin >$(top_builddir)/win32/vs9/$(1).vcproj |
| $(CPP) -P - <$(top_srcdir)/win32/vs10/$(1).vcxprojin >$(top_builddir)/win32/vs10/$(1).vcxproj |
| $(CPP) -P - <$(top_srcdir)/win32/vs10/$(1).vcxproj.filtersin >$(top_builddir)/win32/vs10/$(1).vcxproj.filters |
| $(RM) $(1).sourcefiles |
| $(RM) $(1).vs10.sourcefiles |
| $(RM) $(1).vs10.sourcefiles.filters |
| |
| $(top_builddir)/win32/vs10/$(1).vs10.headers: $(top_builddir)/win32/vs9/$(1).headers |
| |
| $(top_builddir)/win32/vs9/$(1).headers: Makefile |
| -$(RM) $(top_builddir)/win32/vs9/$(1).headers |
| -$(RM) $(top_builddir)/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)/win32/vs9/$(1).headers && \ |
| echo 'copy ..\..'$(_proj_subdir)$$$$F' $$$$(CopyDir)\include'$(_headers_destdir)'\'$$$$F >>$(top_builddir)/win32/vs10/$(1).vs10.headers \ |
| ;; \ |
| esac; \ |
| done |
| |
| $(top_builddir)/win32/vs12/$(1).vcxproj.filters: $(top_builddir)/win32/vs12/$(1).vcxproj |
| |
| $(top_builddir)/win32/vs12/$(1).vcxproj: Makefile |
| -$(RM) $(top_builddir)/win32/vs14/$(1).vcxproj |
| -$(RM) $(top_builddir)/win32/vs14/$(1).vcxproj.filters |
| |
| for F in $(_proj_files); do \ |
| case $$$$F in \ |
| $(_proj_filters)) \ |
| ;; \ |
| *.c|*.cpp|*.cc|*.cxx) \ |
| echo ' <ClCompile Include="..\..'$(_proj_subdir)$$$$F'" />' >>$(1).vs12.sourcefiles && \ |
| echo ' <ClCompile Include="..\..'$(_proj_subdir)$$$$F'"><Filter>Source Files</Filter></ClCompile>' >>$(1).vs12.sourcefiles.filters \ |
| ;; \ |
| esac; \ |
| done |
| |
| $(CPP) -P - <$(top_srcdir)/win32/vs12/$(1).vcxprojin >$(top_builddir)/win32/vs12/$(1).vcxproj |
| $(CPP) -P - <$(top_srcdir)/win32/vs12/$(1).vcxproj.filtersin >$(top_builddir)/win32/vs12/$(1).vcxproj.filters |
| $(RM) $(1).vs12.sourcefiles |
| $(RM) $(1).vs12.sourcefiles.filters |
| |
| $(top_builddir)/win32/vs12/$(1).vs12.headers: Makefile |
| -$(RM) $(top_builddir)/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)/win32/vs12/$(1).vs12.headers \ |
| ;; \ |
| esac; \ |
| done |
| |
| endef |
| |
| $(foreach proj,$(MSVCPROJS),$(eval $(call msvcproj-builder,$(proj)))) |