On 11/5/18 4:12 AM, Huw Davies wrote:
On Sat, Nov 03, 2018 at 06:07:22PM -0500, Zebediah Figura wrote:
Signed-off-by: Zebediah Figura z.figura12@gmail.com
Automation types (BSTR, VARIANT, LPSAFEARRAY) are user-marshalled, which means that they require long format strings to represent the wire form of the data. Ideally this should be generated by widl at build time. However, we can't just create a dummy idl and retrieve the type format string from the generated proxy file, since we have no way of retrieving the length of the type format string (and we do need a way of copying it, since it must be contiguous with ours). Instead the solution I propose is to use a script to parse the type format string (and the other parts that we need) into a generated file, to be done at build time. Since we need widl to do this, and since it can be done very easily in shell script, I have embedded it as a Makefile rule.
Makefile.in | 1 + dlls/rpcrt4/Makefile.in | 21 ++++++++++++++++++++- dlls/rpcrt4/ndr_typelib.c | 28 ++++++++++++++++++++++++++-- 3 files changed, 47 insertions(+), 3 deletions(-)
diff --git a/Makefile.in b/Makefile.in index c1242afc01..25f535dc7f 100644 --- a/Makefile.in +++ b/Makefile.in @@ -76,6 +76,7 @@ SUBDIRS = @SUBDIRS@ RUNTESTFLAGS = -q -P wine MAKEDEP = $(TOOLSDIR)/tools/makedep$(TOOLSEXT) WRC = $(TOOLSDIR)/tools/wrc/wrc$(TOOLSEXT) +WIDL = $(TOOLSDIR)/tools/widl/widl$(TOOLSEXT) PACKAGE_VERSION = @PACKAGE_VERSION@ SED_CMD = LC_ALL=C sed -e 's,@bindir@,$(bindir),g' -e 's,@dlldir@,$(dlldir),g' -e 's,@srcdir@,$(srcdir),g' -e 's,@PACKAGE_STRING@,@PACKAGE_STRING@,g' -e 's,@PACKAGE_VERSION@,@PACKAGE_VERSION@,g' LDRPATH_INSTALL = @LDRPATH_INSTALL@ diff --git a/dlls/rpcrt4/Makefile.in b/dlls/rpcrt4/Makefile.in index ad67edf92e..aa80c2e7c7 100644 --- a/dlls/rpcrt4/Makefile.in +++ b/dlls/rpcrt4/Makefile.in @@ -2,7 +2,7 @@ EXTRADEFS = -D_RPCRT4_ -DMSWMSG MODULE = rpcrt4.dll IMPORTLIB = rpcrt4 IMPORTS = uuid advapi32 -DELAYIMPORTS = iphlpapi wininet secur32 user32 ws2_32 +DELAYIMPORTS = iphlpapi wininet secur32 user32 ws2_32 oleaut32
C_SRCS = \ cproxy.c \ @@ -28,3 +28,22 @@ C_SRCS = \ RC_SRCS = version.rc
IDL_SRCS = epm.idl
+EXTRA_OBJS = ndr_typelib_generated.o
+ndr_typelib_generated.c: $(WIDL)
- echo > ndr_typelib_generated.c '/* Automatically generated from Makefile.in, do not edit */' && \
- echo >> ndr_typelib_generated.c '#include "oaidl.h"' && \
- echo >> ndr_typelib_generated.c '#include "rpcproxy.h"' && \
- echo > ndr_typelib_generated.idl 'import "oaidl.idl"; [object] interface dummy {void dummy(BSTR a, IUnknown *b, IDispatch *c, VARIANT d, LPSAFEARRAY e); }' && \
- $(WIDL) $(WIDLFLAGS) -I $(top_srcdir)/include -p -o ndr_typelib_generated_p.c ndr_typelib_generated.idl && \
- echo >> ndr_typelib_generated.c 'const unsigned char oleaut_tfs[] = {' && \
- awk '/__MIDL_TypeFormatString =/,/};/' ndr_typelib_generated_p.c | head -n -2 | tail -n +5 >> ndr_typelib_generated.c && \
- echo >> ndr_typelib_generated.c '};' && \
- sed -n -e 's/#define TYPE_FORMAT_STRING_SIZE ([0-9]+)/const size_t oleaut_tfs_size = \1;/p' ndr_typelib_generated_p.c >> ndr_typelib_generated.c && \
- echo >> ndr_typelib_generated.c 'const unsigned short oleaut_offsets[] = {' && \
- sed -n -e 's/.*&__MIDL_TypeFormatString.Format[([0-9]+)].*/ \1,/p' ndr_typelib_generated_p.c | head -n 5 >> ndr_typelib_generated.c && \
- echo >> ndr_typelib_generated.c '};' && \
- echo >> ndr_typelib_generated.c 'const USER_MARSHAL_ROUTINE_QUADRUPLE oleaut_user_marshal[] = ' && \
- awk '/UserMarshalRoutines[] =/,/};/' ndr_typelib_generated_p.c | tail -n +2 >> ndr_typelib_generated.c && \
- rm ndr_typelib_generated_p.c ndr_typelib_generated.idl
Did you consider adding a magic option to widl that would generate this table? IMHO, that would be much cleaner than this hack.
FWIW, "head -n -num" isn't supported by macOS's native head.
Huw.
I believe I proposed it to Alexandre in an earlier conversation, and he seemed less than enthused, but I'll wait for his comment now that I've submitted the code.