From b743dadc04f87b72d040e3c93a1d5084491e9fb9 Mon Sep 17 00:00:00 2001 From: midipix Date: Sat, 18 Nov 2017 21:46:46 +0000 Subject: project: added w32def.mk, w32def.sh (generation of .def source files). --- README | 4 +++ project/common.mk | 26 +++++++++++++++ project/w32def/w32def.mk | 31 ++++++++++++++++++ project/w32def/w32def.sh | 83 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 144 insertions(+) create mode 100644 project/w32def/w32def.mk create mode 100755 project/w32def/w32def.sh diff --git a/README b/README index 95c11bb..df4d75a 100644 --- a/README +++ b/README @@ -1 +1,5 @@ w32lib: custom import libraries for OS user-space interfaces + +# manual generation of .def source files: +# make -f project/w32def/w32def.mk W32_SYSDIR=/path/to/Windows/System32 w32def +# adjust the value of W32_SYSDIR as needed. diff --git a/project/common.mk b/project/common.mk index 4b72987..f3d101a 100644 --- a/project/common.mk +++ b/project/common.mk @@ -5,3 +5,29 @@ INTERNAL_SRCS = \ APP_SRCS = \ COMMON_SRCS = $(API_SRCS) $(INTERNAL_SRCS) + + +# list of underlying .dll's and .drv's +W32DLL = \ + advapi32.dll \ + comctl32.dll \ + comdlg32.dll \ + gdi32.dll \ + kernel32.dll \ + imm32.dll \ + ole32.dll \ + shell32.dll \ + user32.dll \ + usp10.dll \ + winmm.dll \ + +W32DRV = \ + winspool.drv + +# cross-compilation support +W32FAKE += $(W32DLL:%.dll=$(SOURCE_DIR)/fake/%.dll) +W32FAKE += $(W32DRV:%.drv=$(SOURCE_DIR)/fake/%.drv) + +# list of manually generated .def files +W32DEF += $(W32DLL:%.dll=$(SOURCE_DIR)/def/%.def) +W32DEF += $(W32DRV:%.drv=$(SOURCE_DIR)/def/%.def) diff --git a/project/w32def/w32def.mk b/project/w32def/w32def.mk new file mode 100644 index 0000000..b007064 --- /dev/null +++ b/project/w32def/w32def.mk @@ -0,0 +1,31 @@ +PERK ?= perk +W32_SYSDIR ?= /dev/null +PROJECT_DIR ?= . +SOURCE_DIR ?= . + +include $(PROJECT_DIR)/project/common.mk + +fake/%.dll: + touch $@ + +fake/%.drv: + touch $@ + +config.project: $(W32FAKE) + +$(SOURCE_DIR)/def/kernel32.def: APIS_WITH_CAPS = -c + +$(SOURCE_DIR)/def/%.def: $(W32_SYSDIR)/%.dll + $(PROJECT_DIR)/project/w32def/w32def.sh -p $(PERK) -l $< -o $@ $(APIS_WITH_CAPS) + +$(SOURCE_DIR)/def/%.def: $(W32_SYSDIR)/%.drv + $(PROJECT_DIR)/project/w32def/w32def.sh -p $(PERK) -l $< -o $@ $(APIS_WITH_CAPS) + +w32def: config.project $(W32DEF) + +w32def-clean: + rm -f $(W32DEF) + rm -f $(W32FAKE) + +.PHONY: w32def +.PHONY: w32def-clean diff --git a/project/w32def/w32def.sh b/project/w32def/w32def.sh new file mode 100755 index 0000000..3fca7c3 --- /dev/null +++ b/project/w32def/w32def.sh @@ -0,0 +1,83 @@ +#!/bin/sh + +usage() +{ +cat << EOF >&2 + +Usage: + -h show this HELP message + -p PERK set pe parser utility + -o OUTPUT set output file name + -l SYSLIB set system library from which to extract symbols + +EOF +exit 1 +} + + +# one +perk= +caps= + +workdir=$(pwd) +output= +syslib= + + +while getopts "hp:o:l:c" opt; do + case $opt in + h) + usage + ;; + p) + perk="$OPTARG" + ;; + o) + output="$OPTARG" + ;; + l) + syslib="$OPTARG" + ;; + c) + caps='yes' + ;; + \?) + printf "$0: Invalid option: -%s" "$OPTARG" >&2 + usage + ;; + esac +done + + +# two +if [ -z "$perk" ] || [ -z "$output" ] || [ -z "$syslib" ]; then + usage +fi + +tmpdef=`mktemp` + +if [ -z "$tmpdef" ]; then + printf "$0: Failed to create a temporary file!" >&2 + exit 1 +fi + +# three +if [ -z "$caps" ]; then + "$perk" -e "$syslib" > "$tmpdef" || exit 1 +else + "$perk" -e "$syslib" | grep -e '[A-Z]' > "$tmpdef" || exit 1 +fi + +# four +grep -v \ + -e 'DllMain' \ + -e 'DllCanUnloadNow' \ + -e 'DllDebugObjectRPCHook' \ + -e 'DllGetClassObject' \ + -e 'DllRegisterServer' \ + -e 'DllUnregisterServer' \ + -e '?' \ + "$tmpdef" > "$output" || exit 1 + +# all done +exit 0 -- cgit v1.2.3