4 # Makefile template for MinGW.org MS-Windows API Package
6 PACKAGE_TARNAME := @PACKAGE_TARNAME@
7 PACKAGE_VERSION := @PACKAGE_VERSION@
9 # Written by Keith Marshall <keithmarshall@users.sourceforge.net>
10 # Copyright (C) 2014-2016, MinGW.org Project
13 # Permission is hereby granted, free of charge, to any person obtaining a
14 # copy of this software and associated documentation files (the "Software"),
15 # to deal in the Software without restriction, including without limitation
16 # the rights to use, copy, modify, merge, publish, distribute, sublicense,
17 # and/or sell copies of the Software, and to permit persons to whom the
18 # Software is furnished to do so, subject to the following conditions:
20 # The above copyright notice and this permission notice (including the next
21 # paragraph) shall be included in all copies or substantial portions of the
24 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
25 # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
26 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
27 # AUTHORS OR THE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
28 # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
29 # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
30 # DEALINGS IN THE SOFTWARE.
33 # The default target is "all"; declare it early, to avoid any possible
34 # inadvertent override from any included file.
38 PACKAGE_RELEASE_TAG := $(PACKAGE_VERSION)$(PACKAGE_RELEASE:%=-%)-mingw32
40 # Establish the minimum version of Windows which this build is required
41 # to support; note that we fix the default as WinNT4, but we define it in
42 # a manner which will allow a command line override, and may be adapted,
43 # ultimately, to support a configure time assignment.
45 NTDDI_VERSION := NTDDI_WINNT4
46 NTDDI_VERSION_SPEC := $(NTDDI_VERSION:%=-D NTDDI_VERSION=%)
48 # Build paths and macros.
51 top_srcdir = @top_srcdir@
52 mingwrt_srcdir = @mingwrt_srcdir@
53 w32api_srcdir = @srcdir@
54 abs_builddir = @abs_builddir@
70 # Installation paths and macros.
73 exec_prefix = @exec_prefix@
74 includedir = ${DESTDIR}@includedir@
75 libdir = ${DESTDIR}@libdir@
77 mkinstalldirs = @MKDIR_P@ $(addprefix $1,$2)
80 INSTALL_DATA = @INSTALL_DATA@ $1 $2
82 # Keep the configuration in a consistent state. Note that we assume
83 # that configure has been run initially, (otherwise we wouldn't have
84 # a Makefile to begin with); since this also creates config.status,
85 # we may normally assume that it is already available ...
87 vpath configure ${top_srcdir}
88 config.status: configure
89 $(SHELL) config.status --recheck
91 # ... in which case, updating Makefile should be a simple matter of
92 # running config.status ...
94 vpath Makefile.in ${top_srcdir}
95 requires_existing = $(if $(wildcard $1),$1,$1.missing)
96 Makefile: Makefile.in configure $(call requires_existing,config.status)
97 $(SHELL) config.status
99 .PHONY: config.status.missing
100 # ... but, in the event that this may be missing, (e.g. because it
101 # has been manually removed, or removed by "make distclean"), suggest
102 # running configure, and bail out.
104 config.status.missing:
105 $(warning *** cannot execute config.status)
106 $(error please run ${top_srcdir}/configure to regenerate it.)
108 # If configure itself needs to be updated, we must run autoconf in the
109 # top level source directory.
111 vpath %.m4 ${top_srcdir}
112 vpath configure.ac ${top_srcdir}
113 configure: configure.ac aclocal.m4 VERSION.m4
114 cd ${top_srcdir}; autoconf
116 # Propagate package version, as configured, consistently throughout
119 vpath w32api.h.in ${top_srcdir}/include
120 vpath _mingw.h.in ${mingwrt_srcdir}/include
122 w32api.h _mingw.h: configure.ac
124 PACKAGE_VERSION_SCRIPT = sed \
125 -e s"`$(call PACKAGE_VERSION_FORMAT,LONG,%d,$$3+1000*($$2+1000*$$1))`" \
126 -e s"`$(call PACKAGE_VERSION_FORMAT,MAJOR,%7d,$$1)`" \
127 -e s"`$(call PACKAGE_VERSION_FORMAT,MINOR,%7d,$$2)`" \
128 -e s"`$(call PACKAGE_VERSION_FORMAT,PATCH,%7d,$$3)`"
130 PACKAGE_VERSION_FORMAT = echo $(PACKAGE_VERSION).0.0 | awk -F. '{ \
131 printf ",%%PACKAGE_VERSION_$1%%,$2,", $3; \
134 w32api.h _mingw.h: %.h: %.h.in
135 $(PACKAGE_VERSION_SCRIPT) $< > $@
137 # Capture dependencies conveyed within source files, ensuring that
138 # header files are taken from our working source tree, and not from
139 # the build-time compiler's installation path. (Note: we use -MD,
140 # and not -MMD in DEPFLAGS; since this package furnishes system
141 # headers, we need changes therein to trigger a rebuild).
145 INCLUDES = -nostdinc -I . -I ${top_srcdir}/include -I ${mingwrt_srcdir}/include \
146 -I ${top_srcdir} -I ${top_srcdir}/profile -iwithprefixbefore include
148 ALL_CFLAGS = $(CFLAGS) $(DEPFLAGS) $(INCLUDES) $(NTDDI_VERSION_SPEC)
150 # The general case, for compiling object files from C source,
151 # requires a small adjustment to the default implicit rule.
154 $(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -o $@ $<
156 deffiles = $(eval vpath %.def $1)$(notdir $(wildcard $1/*.def))
157 implibfiles = $(addprefix lib,$(subst .def,.a,$(call deffiles,$1)))
160 all-w32api-libs: w32api.h _mingw.h
161 all-w32api-libs install-w32api-libs: $(call implibfiles,${srcdir}/lib)
162 all-w32api-libs install-w32api-libs: $(call implibfiles,${srcdir}/lib/directx)
163 all-w32api-libs install-w32api-libs: $(call implibfiles,${srcdir}/lib/ddk)
164 all-w32api-libs install-w32api-libs: liblargeint.a libstrmiids.a libuuid.a
165 all-w32api-libs install-w32api-libs: libdxerr8.a libdxerr9.a libdxguid.a
166 all-w32api-libs install-w32api-libs: libscrnsave.a libscrnsavw.a
167 all-w32api-libs install-w32api-libs: libdmoguids.a libvfw32.a
170 $(DLLTOOL) --as=$(AS) -k --output-lib $@ --def $<
171 $(if $(filter-out $<,$^),$(AR) $(ARFLAGS) $@ $(filter-out $<,$^))
173 vpath %.c ${srcdir}/lib
174 libuuid.a: ativscp-uuid.$(OBJEXT) cguid-uuid.$(OBJEXT)
175 libuuid.a: comcat-uuid.$(OBJEXT) devguid.$(OBJEXT) docobj-uuid.$(OBJEXT)
176 libuuid.a: exdisp-uuid.$(OBJEXT) extras-uuid.$(OBJEXT) hlguids-uuid.$(OBJEXT)
177 libuuid.a: hlink-uuid.$(OBJEXT) mlang-uuid.$(OBJEXT) mshtml-uuid.$(OBJEXT)
178 libuuid.a: msxml-uuid.$(OBJEXT) oaidl-uuid.$(OBJEXT) objidl-uuid.$(OBJEXT)
179 libuuid.a: objsafe-uuid.$(OBJEXT) ocidl-uuid.$(OBJEXT) oleacc-uuid.$(OBJEXT)
180 libuuid.a: olectlid-uuid.$(OBJEXT) oleidl-uuid.$(OBJEXT) power-uuid.$(OBJEXT)
181 libuuid.a: servprov-uuid.$(OBJEXT) unknwn-uuid.$(OBJEXT) urlmon-uuid.$(OBJEXT)
183 scrnsavw.$(OBJEXT): %.$(OBJEXT): scrnsave.c
184 $(CC) -c -D UNICODE $(CPPFLAGS) $(CFLAGS) $(DEPFLAGS) $(INCLUDES) -o $@ $<
186 libshell32.a: shell32.$(OBJEXT)
187 libgdiplus.a: gdiplus.$(OBJEXT)
188 libws2_32.a: ws2_32.$(OBJEXT)
190 libdmoguids.a libdxguid.a \
191 liblargeint.a libscrnsave.a libscrnsavw.a libstrmiids.a: lib%.a: %.$(OBJEXT)
192 $(AR) $(ARFLAGS) $@ $<
194 libuuid.a libdxerr8.a libdxerr9.a:
195 $(AR) $(ARFLAGS) $@ $^
197 vpath %.mri ${srcdir}/lib
198 libvfw32.a: lib%.a: %.mri libmsvfw32.a libavifil32.a libavicap32.a
199 rm -f $@ && $(AR) -M < $< && $(RANLIB) $@
201 vpath %.c ${srcdir}/lib/directx
202 libdinput.a libdinput8.a: dinput_joy.$(OBJEXT) dinput_joy2.$(OBJEXT) \
203 dinput_kbd.$(OBJEXT) dinput_mouse.$(OBJEXT) dinput_mouse2.$(OBJEXT)
205 libdxerr8.a: dxerr8.$(OBJEXT) dxerr8w.$(OBJEXT)
206 libdxerr9.a: dxerr9.$(OBJEXT) dxerr9w.$(OBJEXT)
211 # Users may expect to be able to specify DESTDIR, to stage the
212 # following stock installation directories outside of the regular
213 # "as configured" installation tree; unfortunately, this expectation
214 # MUST fail, when the stock path is in MS-Windows absolute format, so
215 # we provide an exception mechanism to forbid such usage, and we
216 # proceed to create the directories only when the exception is
219 .PHONY: DESTDIR-UNSUPPORTED
220 bindir docdir includedir libdir mandir htmldir pdfdir:
221 @test -z "$(strip ${DESTDIR})" || case $($@) in ${DESTDIR}?:*) \
222 $(MAKE) --no-print-directory reject=$@ DESTDIR-UNSUPPORTED;; \
224 $(call mkinstalldirs,,$($@))
226 # Note: we MUST use a recursive make invocation here, as the
227 # "error" function within the accompanying diagnostics would be
228 # triggered, irrespective of its placement in an unexecuted
229 # branch of the above exception trapping shell code.
232 $(call MSG_DESTDIR_FORBIDDEN,$(reject),$($(reject):${DESTDIR}%=%))
234 # The following macros, which rely heavily on GNU make's "call"
235 # function, define the diagnostics to be emitted, when the DESTDIR
236 # exception is triggered.
239 MSG_DESTDIR_FORBIDDEN = \
240 $(warning *** $(call MSG_DESTDIR_PATH_CONFLICT,$1,Win32,$2);) \
241 $(error try $(call QUOTE,$(call MSG_DESTDIR_ALTERNATIVE,$1,$2)) instead)
242 MSG_DESTDIR_BAD_PATH = DESTDIR is not supported when $1 contains $2 path $3
243 MSG_DESTDIR_PATH_CONFLICT = $(call MSG_DESTDIR_BAD_PATH,$1,$2,$(call QUOTE,$3))
244 MSG_DESTDIR_ALTERNATIVE = make install $1="$(call MSG_DESTDIR_TRANSFORM,$2)"
245 MSG_DESTDIR_TRANSFORM = ${DESTDIR}$(shell echo $1 | sed 's/^.://')
247 install: install-w32api
248 install-strip: install-strip-w32api
250 installdirs: w32api-include-dirs w32api-lib-dirs
251 install-strip-w32api: install-w32api-headers install-strip-w32api-libs
252 install-w32api: install-w32api-headers install-w32api-libs
254 w32api_extra_include_dirs = directx
255 w32api_include_subdirs = GL ddk gdiplus
257 w32api-include-dirs: includedir
258 $(call mkinstalldirs,${includedir}/,$(w32api_include_subdirs))
260 w32api-lib-dirs: libdir
262 install-headers: install-w32api-headers
263 install-w32api-headers: w32api.h w32api-include-dirs
264 $(call INSTALL_DATA,w32api.h ${srcdir}/include/*.h,${includedir})
265 for dir in $(w32api_extra_include_dirs); do \
266 $(call INSTALL_DATA,${srcdir}/include/$$dir/*.h,${includedir}); \
268 for dir in $(w32api_include_subdirs); do \
269 $(call INSTALL_DATA,${srcdir}/include/$$dir/*.h,${includedir}/$$dir); \
272 w32api-lib-reqs: all-w32api-libs w32api-lib-dirs
274 install-w32api-libs: w32api-lib-reqs
275 $(call INSTALL_DATA,$(filter-out w32api-lib-reqs,$^),${libdir})
276 $(if $(STRIP_LIBS),$(call STRIP_LIBS,$(filter-out w32api-lib-reqs,$^)))
278 install-strip-w32api-libs:
279 $(MAKE) --no-print-directory $(MAKEFLAGS) \
280 STRIP_LIBS='cd ${libdir}; $(STRIP) --strip-unneeded $$1' \
283 uninstall: uninstall-w32api-headers uninstall-w32api-libs
285 uninstall-w32api-headers:
286 cd ${includedir} && rm -f $(notdir $(wildcard ${srcdir}/include/*.h))
287 for dir in $(w32api_extra_include_dirs); do \
288 files=`cd ${srcdir}/include/$$dir && echo *.h`; \
289 (cd ${includedir} && rm -f $$files); \
291 for dir in $(w32api_include_subdirs); do \
292 files=`cd ${srcdir}/include/$$dir && echo *.h`; \
293 (cd ${includedir}/$$dir && rm -f $$files); \
296 uninstall-w32api-libs: un%:
297 $(MAKE) --no-print-directory $(MAKEFLAGS) mkinstalldirs= \
298 INSTALL_DATA='cd $$2 && rm -f $$1' $*
304 dist: bindist devdist dlldist licdist mandist srcdist
305 $(RM) -r dist/mingwrt dist/w32api
307 .PHONY: bindist devdist dlldist licdist mandist srcdist
308 bindist devdist dlldist licdist mandist srcdist: %dist: w32api-%dist
310 .PHONY: $(foreach tag,bin dev dll lic man src,mingwrt-$(tag)dist)
311 $(foreach tag,bin dev dll lic man src,mingwrt-$(tag)dist):
313 .PHONY: $(foreach tag,bin dev dll lic man src,w32api-$(tag)dist)
314 $(foreach tag,bin dev dll lic man src,w32api-$(tag)dist):
316 staged_prefix = $(addsuffix =`pwd`/dist/$1,prefix exec_prefix)
317 staged_install = $(call staged_prefix,$1) install-strip-$1
319 mingwrt-dist-staged w32api-dist-staged: %-dist-staged:
321 $(MAKE) --no-print-directory $(call staged_install,$*)
323 mingwrt-srcdist w32api-srcdist: %-srcdist: %-srcdist-dir %-srcdist-files
324 cd dist && tar chf - $*-$(PACKAGE_VERSION) | \
325 xz -c > $*-$(PACKAGE_RELEASE_TAG)-src.tar.xz
326 $(RM) -r dist/$*-$(PACKAGE_VERSION)
328 mingwrt-srcdist-dir w32api-srcdist-dir: %-srcdist-dir:
329 $(RM) -r dist/$*-$(PACKAGE_VERSION)
330 $(call mkinstalldirs,,dist/$*-$(PACKAGE_VERSION))
332 mingwrt-srcdist-files w32api-srcdist-files: %-srcdist-files:
333 (cd ${$*_srcdir} && tar chf - --hard-dereference $(notdir $^)) | \
334 (cd dist/$*-$(PACKAGE_VERSION) && tar xf -)
336 mingwrt-devdist w32api-devdist: %-devdist: %-dist-staged
337 cd dist/$* && tar chf - --hard-dereference include lib | \
338 xz -c > ../$*-$(PACKAGE_RELEASE_TAG)-dev.tar.xz
340 SRCDIST_ADD = $1-srcdist-files: $(addprefix ${$1_srcdir}/,$2)
342 $(call SRCDIST_ADD,w32api,ChangeLog CONTRIBUTIONS README.w32api TODO)
343 $(call SRCDIST_ADD,w32api,configure configure.ac aclocal.m4 Makefile.in)
344 $(call SRCDIST_ADD,w32api,config.guess config.sub install-sh)
345 $(call SRCDIST_ADD,w32api,include lib)
351 clean-local: mostlyclean-local
355 $(RM) *.d *.$(OBJEXT)
357 distclean-local: clean-local
358 $(RM) config.log config.status
360 maintainer-clean-warning:
361 $(warning $(MAKE) $(@:%-warning=%))
362 $(warning This command should be used by package maintainers only;)
363 $(warning it deletes files which may require special tools to rebuild.)
365 maintainer-clean-local: maintainer-clean-warning distclean-local
366 $(RM) -r ${srcdir}/configure ${srcdir}/autom4te.cache
368 clean mostlyclean distclean maintainer-clean: %clean: %clean-local
370 # $RCSfile$: end of file