#!/usr/bin/env python

#Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies)

#This library is free software; you can redistribute it and/or
#modify it under the terms of the GNU Library General Public
#License as published by the Free Software Foundation; either
#version 2 of the License, or (at your option) any later version.

#This library is distributed in the hope that it will be useful,
#but WITHOUT ANY WARRANTY; without even the implied warranty of
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#Library General Public License for more details.

#You should have received a copy of the GNU Library General Public License
#along with this library; see the file COPYING.LIB.  If not, write to
#the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
#Boston, MA 02110-1301, USA.

# Extract /EXPORT: linker directives from static library and write it into a
# separate file as linker pragmas.
# Usage: generate-win32-export-forwards \path\to\static\library.lib outputfile.cpp
# Then compile outputfile.cpp into the final .dll and link the static library
# into the dll.

import subprocess
import sys
import re

def exportForwardsForLibrary(library):
    dumpBin = subprocess.Popen("dumpbin /directives " + library, stdout=subprocess.PIPE, universal_newlines=True)

    output = dumpBin.communicate()[0]
    return output

libraries = sys.argv[1 : -1]
outputFileName = sys.argv[-1]

exportedSymbolRegexp = re.compile("\s*(?P<symbol>/EXPORT:.+)")
symbols = set()

for lib in libraries:
    for line in exportForwardsForLibrary(lib).splitlines():
        match = exportedSymbolRegexp.match(line)
        if match:
            symbols.add(match.group("symbol"))

print("Forwarding %s symbols from %s" % (len(symbols), " ".join(libraries)))

exportFile = open(outputFileName, "w")
for symbol in symbols:
    exportFile.write("#pragma comment(linker, \"%s\")\n" % symbol);
exportFile.close()
