2015-09-03 13:08:55 +02:00
# Author: Fan, Chun-wei
# Common Autotools file used to generate Visual Studio 2008+
# Projects from their templates
2015-09-17 03:15:27 +02:00
# This autotools file, from GLib, can be used in other projects
# that have Visual Studio build support, and is copied into
2015-09-03 13:08:55 +02:00
# $(srcroot)/build/, except those that have their main sources
2015-09-17 03:15:27 +02:00
# in their $(srcroot), or those that have their autotools build
# files in $(srcroot). Those that should not use this include:
# gobject-introspection, librsvg, instead they would currently
# need a modified version of this.
2015-09-03 13:08:55 +02:00
# * 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 = ... # <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)/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 = $( if $( ifeq $( _proj_path) ,\. ) ,\\ ,\\ $( _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)
#
d e f i n e m s v c p r o j - b u i l d e r
$(top_builddir)/build/win32/vs10/$(1).vcxproj : $( top_builddir ) /build /win 32/vs 9/$( 1) .vcproj
$(top_builddir)/build/win32/vs10/$(1).vcxproj.filters : $( top_builddir ) /build /win 32/vs 9/$( 1) .vcproj
$(1).sourcefiles : $( top_builddir ) /build /win 32/vs 9/$( 1) .vcproj
$(1).vs10.sourcefiles : $( top_builddir ) /build /win 32/vs 9/$( 1) .vcproj
$(1).vs10.sourcefiles.filters : $( top_builddir ) /build /win 32/vs 9/$( 1) .vcproj
$(top_builddir)/build/win32/vs9/$(1).vcproj :
-$( 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
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) /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 /win 32/vs 9/$( 1) .headers
$(top_builddir)/build/win32/vs9/$(1).headers :
-$( 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
e n d e f
$( foreach proj ,$ ( MSVCPROJS ) ,$ ( eval $ ( call msvcproj -builder ,$ ( proj ) ) ) )