#**************************************************************
#
#  Licensed to the Apache Software Foundation (ASF) under one
#  or more contributor license agreements.  See the NOTICE file
#  distributed with this work for additional information
#  regarding copyright ownership.  The ASF licenses this file
#  to you under the Apache License, Version 2.0 (the
#  "License"); you may not use this file except in compliance
#  with the License.  You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing,
#  software distributed under the License is distributed on an
#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
#  KIND, either express or implied.  See the License for the
#  specific language governing permissions and limitations
#  under the License.
#
#**************************************************************



PRJ=..
PRJNAME=external
TARGET=mingwheaders

.INCLUDE :  settings.mk

.IF "$(OS)$(COM)" == "WNTGCC"

# Cygwin and MinGW use different directories for the W32API headers
.IF "$(USE_MINGW)" == "cygwin"
MINGW_INCLUDE_DIR=$/usr$/include/mingw/
MINGW_W32API_INCLUDE_DIR=$/usr$/include/w32api/
MINGW_W32API_LIB_DIR=$/usr$/include/w32api/
.ELSE
MINGW_INCLUDE_DIR=$(COMPATH)$/include/
MINGW_W32API_INCLUDE_DIR=$(COMPATH)$/include/
MINGW_W32API_LIB_DIR=$(COMPATH)$/lib/
.ENDIF

SYS_INCLUDE_DIR=$(MINGW_INCLUDE_DIR)$/sys/

PSDK_INCLUDE_DIR=$(PSDK_HOME)$/include$/

ATL_INCLUDE_DIR=$(PSDK_HOME)$/include$/atl$/

DIRECTXSDK_INCLUDE_DIR=$(DIRECTXSDK_HOME)$/include$/

FILES_TO_COPY_FROM_MINGW= \
	excpt.h \
	 tchar.h

FILES_TO_COPY_FROM_W32API= \
	amvideo.h \
	basetyps.h \
	objidl.h \
	specstrings.h \
	uxtheme.h \
	winbase.h \
	windef.h \
	wininet.h \
	winver.h \
	wtypes.h

FILES_TO_COPY_FROM_SYS= \
	stat.h

FILES_TO_COPY_FROM_PSDK= \
	adoctint.h \
	adodef.h \
	adoguids.h \
	adoint.h \
	bcrypt.h \
	commctrl.h \
	control.h \
	dispex.h \
	filter.h \
	gdiplusbitmap.h \
	gdiplusbrush.h \
	gdiplusenums.h \
	gdiplusfont.h \
	gdiplusheaders.h \
	gdiplusimageattributes.h \
	gdiplusimaging.h \
	gdiplusmatrix.h \
	gdipluspath.h \
	gdipluspen.h \
	gdiplusregion.h \
	gdiplusstringformat.h \
	imm.h \
	imagehlp.h \
	mapiwin.h \
	msdasc.h \
	msi.h \
	msiquery.h \
	multimon.h \
	ntquery.h \
	oaidl.h \
	ocidl.h \
	oleauto.h \
	olectl.h \
	oledb.h \
	oleidl.h \
	propidl.h \
	propkeydef.h \
	propsys.h \
	propvarutil.h \
	shlobj.h \
	shobjidl.h \
	shtypes.h \
	sspi.h \
	strmif.h \
	strsafe.h \
	structuredquery.h \
	urlmon.h \
	wincrypt.h \
	winerror.h \
	wingdi.h \
	wintrust.h \
	winuser.h \
	wspiapi.h \
	exdispid.h \
	dshow.h \
	gdiplus.h \
	msxml.h \
	ncrypt.h \
	shlguid.h \
	transact.h

.IF "$(DISABLE_ATL)"==""
MINGWHEADER_ATL_PATCH_TARGET=$(MISC)$/mingwheader_atl_patch
MINGWHEADER_ATL_COPY_TARGET=$(MISC)$/mingwheader_atl_copy
FILES_TO_COPY_FROM_ATL= \
	atlbase.h \
	atlcom.h \
	atlconv.h \
	atlctl.h \
	atlwin.h \
	statreg.h
.ENDIF

FILES_TO_COPY_FROM_DIRECTXSDK= \
	d3dtypes.h \
	d3dx9core.h \
	d3dx9math.h \
	d3dx9math.inl \
	dxtrans.h \
	d3dx9.h

$(MISC)$/mingwheader_patch_all : $(MISC)$/mingwheader_patch $(MINGWHEADER_ATL_PATCH_TARGET) $(LB)$/libmsvcrt.a

$(MISC)$/mingwheader_patch : $(MISC)$/mingwheader_copy
	patch -bd $(MISC)$/mingw -p0 -N -f -Z <mingw_headers.patch
	$(TOUCH) $(MISC)$/mingwheader_patch

.IF "$(DISABLE_ATL)"==""
$(MINGWHEADER_ATL_PATCH_TARGET) : $(MINGWHEADER_ATL_COPY_TARGET)
	patch -bd $(MISC)$/mingw -p0 -N -f -Z <mingw_atl_headers.patch
	$(TOUCH) $(MINGWHEADER_ATL_PATCH_TARGET)
.ENDIF

$(MISC)$/mingwheader_copy:
	$(MKDIRHIER) $(MISC)$/mingw$/include
	$(MKDIRHIER) $(MISC)$/mingw$/include/sys
	$(COPY) $(FILES_TO_COPY_FROM_MINGW:^$(MINGW_INCLUDE_DIR)) $(MISC)$/mingw$/include
	$(COPY) $(FILES_TO_COPY_FROM_W32API:^$(MINGW_W32API_INCLUDE_DIR)) $(MISC)$/mingw$/include
	$(COPY) $(FILES_TO_COPY_FROM_SYS:^$(SYS_INCLUDE_DIR)) $(MISC)$/mingw$/include$/sys
	$(COPY) $(FILES_TO_COPY_FROM_PSDK:^$(PSDK_INCLUDE_DIR)) $(MISC)$/mingw$/include
	$(COPY) $(FILES_TO_COPY_FROM_DIRECTXSDK:^$(DIRECTXSDK_INCLUDE_DIR)) $(MISC)$/mingw$/include
	$(TOUCH) $(MISC)$/mingwheader_copy

.IF "$(DISABLE_ATL)"==""
$(MINGWHEADER_ATL_COPY_TARGET):
	$(MKDIRHIER) $(MISC)$/mingw$/include/atl
	$(COPY) $(FILES_TO_COPY_FROM_ATL:^$(ATL_INCLUDE_DIR)) $(MISC)$/mingw$/include$/atl
 	$(TOUCH) $(MINGWHEADER_ATL_COPY_TARGET)
.ENDIF

$(LB)$/libmsvcrt.a:
.IF "$(USE_MINGW)" == "cygwin"
	$(COPY) $(COMPATH)$/lib/mingw/libmsvcrt.a $(LB)$/libmsvcrt_orig.a
.ELSE
	$(COPY) $(COMPATH)$/lib/libmsvcrt.a $(LB)$/libmsvcrt_orig.a
.ENDIF
	cd $(LB) && ar -x libmsvcrt_orig.a ofmt_stub.o
	ar -d $(LB)$/libmsvcrt_orig.a ofmt_stub.o
	nm -g --defined-only $(LB)$/libmsvcrt_orig.a > $(MISC)$/msvcrt.nm
	echo EXPORTS > $(MISC)$/msvcrt.def
	sed -ne 's/.* T _//p' $(MISC)$/msvcrt.nm | sort >> $(MISC)$/msvcrt.def
	-sed -ne 's/.* I __imp__//p' $(MISC)$/msvcrt.nm | sort | diff - $(MISC)$/msvcrt.def | \
		sed -ne 's/^< \(.*\)$/\1 DATA/p' > $(MISC)$/msvcrtdata.def
	cat $(MISC)$/msvcrtdata.def >> $(MISC)$/msvcrt.def
	dlltool --dllname msvcrt.dll --input-def=$(MISC)$/msvcrt.def --kill-at --output-lib=$(LB)$/libmsvcrt.a
	cd $(LB) && ar -rs libmsvcrt.a ofmt_stub.o

clean:
	-$(RM) $(MISC)$/mingw$/include$/*.h
	-$(RM) $(MISC)$/mingwheader_copy
	-$(RM) $(MISC)$/mingwheader_patch

.ENDIF

.INCLUDE :  target.mk
