mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-13 14:31:59 +02:00
160 lines
4.9 KiB
Makefile
160 lines
4.9 KiB
Makefile
#
|
|
# $Id: Makefile,v 1.2 2002/09/07 16:01:29 peter Exp $
|
|
# This file is part of the Free Pascal run time library.
|
|
# Copyright (c) 1999-2000 by Michael van Canneyt
|
|
#
|
|
# Makefile for the Free Pascal windows.pp include files
|
|
#
|
|
# See the file COPYING.FPC, included in this distribution,
|
|
# for details about the copyright.
|
|
#
|
|
# This program 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.
|
|
#
|
|
|
|
# Warning: this file contains TAB (#9) characters that are required for
|
|
# make. Make sure you use an editor that does not replace TABs with
|
|
# spaces, or the makefile won't work anymore after you save.
|
|
|
|
#####################################################################
|
|
# Defaults
|
|
#####################################################################
|
|
|
|
ECHO=echo
|
|
|
|
# Files used by windows.pp
|
|
include makefile.inc
|
|
|
|
|
|
#####################################################################
|
|
# windows.pp
|
|
#####################################################################
|
|
|
|
# default target
|
|
all: ascdef.inc unidef.inc
|
|
|
|
# Getting DLL names
|
|
# not present in headers !!
|
|
|
|
# first get the list of all exported function names
|
|
# uses pedump
|
|
# for system dll 's
|
|
# gdi32.exp will contain all exported functions names of gdi32.dll
|
|
|
|
WINDOWS_DIR:=c\:/windows
|
|
|
|
%.exp : $(WINDOWS_DIR)/system/%.dll
|
|
pedump $< > $*.tmp
|
|
sed -n -e "s/Addr:\(.*\)Ord:\(.*\)Name: \(.*\)/@\3@/p" $*.tmp > $*.exp
|
|
# -rm $*.tmp
|
|
|
|
%.exd : $(WINDOWS_DIR)/system/%.drv
|
|
pedump $< > $*.tmp
|
|
sed -n -e "s/Addr:\(.*\)Ord:\(.*\)Name: \(.*\)/@\3@/p" $*.tmp > $*.exd
|
|
# -rm $*.tmp
|
|
|
|
# list of useful dll's for windows.pp
|
|
dllexps : gdi32.exp kernel32.exp advapi32.exp user32.exp mapi32.exp \
|
|
comdlg32.exp shell32.exp mpr.exp comctl32.exp version.exp \
|
|
opengl32.exp spoolss.exp winspool.exd
|
|
|
|
# get a complete listing of all system dll's
|
|
allexps : $(notdir $(patsubst %.dll,%.exp,$(wildcard $(WINDOWS_DIR)/system/*.dll)) \
|
|
$(patsubst %.drv,%.exd,$(wildcard $(WINDOWS_DIR)/system/*.drv)))
|
|
|
|
# extract the dllnames for which the real dll file is not
|
|
# known yet
|
|
# func.lst will contain all functions for which we still do
|
|
# not know the origin DLL
|
|
%.lst : %.inc
|
|
@$(ECHO) listing DLL function names of $*.inc
|
|
sed -n -e "s/\(.*\)External_library name '\([^']*\)'\(.*\)/\2/p" $*.inc > $*.lst
|
|
|
|
# get the DLL name from the listing in .exp files
|
|
# of the current target
|
|
define grepname
|
|
$(filter %.dll %.drv ,$(subst .exd:,.drv ,$(subst .exp:,.dll ,$(shell grep @$*@ *.ex*))))
|
|
endef
|
|
|
|
# creating of a sed script that
|
|
# will substitute all External_library
|
|
# by the real name of the DLL if found in exports files
|
|
|
|
# two stages
|
|
# because you cannot set a variable inside the commands
|
|
# Level 1 : set filename variable
|
|
# Level 2 :
|
|
%.sub : %.lst
|
|
@$(ECHO) getting DLL file name for $*
|
|
-rm $*.sub
|
|
@$(ECHO) # Substitutions for $* >$*.sub
|
|
# call make for all names in lst file
|
|
# define LongList if there is an error
|
|
# because the list is too long
|
|
ifdef LongList
|
|
$(foreach name,$(shell cat $*.lst),$(MAKE) subfile=$*.sub $(name).find ; )
|
|
else
|
|
$(MAKE) subfile=$*.sub $(addsuffix .find,$(shell cat $*.lst))
|
|
endif
|
|
# resubstitute unfound ones !!
|
|
@$(ECHO) s/external \'\' name \'\([^\']*\)\'/external\
|
|
External_library name \'\1\'/ >>$*.sub
|
|
@$(ECHO) # End of substitutions for $* >>$*.sub
|
|
|
|
# Change file according to function found in export
|
|
# list remaining unfound functions in $*.mis
|
|
%.npp : %.sub
|
|
sed -f $*.sub $*.inc > $*.npp
|
|
sed -n -e "s/\(.*\)External_library name \'\([^\']*\)\'\(.*\)/\2/p" $*.npp > $*.mis
|
|
|
|
%.find :
|
|
@$(ECHO) $* is in $(grepname)
|
|
ifdef subfile
|
|
@$(ECHO) s/external External_library name \'$*\'/external\
|
|
\'$(filter %.dll %.drv ,$(subst .exd:,.drv ,$(subst .exp:,.dll ,$(shell grep @$*@ *.ex*))))\'\
|
|
name \'$*\'/ >>$(subfile)
|
|
else
|
|
@$(ECHO) external \
|
|
\'$(filter %.dll %.drv ,$(subst .exd:,.drv ,$(subst .exp:,.dll ,$(shell grep @$*@ *.ex*))))\'\
|
|
name $*
|
|
endif
|
|
|
|
GNUWIN32LIBDIR=./
|
|
|
|
%.find2 :
|
|
@$(ECHO) s/In archive \(.*\)/\1/p >find.sed
|
|
@$(ECHO) s/\(.*\)___imp_$*@\(.*\)/found: $*/p >>find.sed
|
|
ifdef subfile
|
|
sed -n -f find.sed alllibs.sym >> $(subfile)
|
|
else
|
|
sed -n -f find.sed alllibs.sym > $*.res
|
|
endif
|
|
|
|
missing : $(GNUWIN32LIBDIR)alllibs.sym $(addsuffix .lst,$(WINDOWS_FILES))
|
|
-rm missing
|
|
$(MAKE) subfile=missing $(addsuffix .find2,$(shell cat *.lst))
|
|
|
|
substmissing : missing
|
|
dtou missing
|
|
@$(ECHO) N > test.sed
|
|
@$(ECHO) s/lib\(.*\)\.a:\nfound: \(.*\)/\1.dll : \2/p >> test.sed
|
|
@$(ECHO) D >> test.sed
|
|
sed -n -f test.sed missing > missing.tmp
|
|
sed -e "s#\(.*\) : \(.*\)#s/external External_library name \'\2\'/external \'\1\' name \'\2\'/#" missing.tmp > missing.sub
|
|
|
|
dllnames:
|
|
$(MAKE) $(addsuffix .lst,$(WINDOWS_FILES))
|
|
|
|
test:
|
|
@$(ECHO) namelist of $(filename) is "$(namelist)"
|
|
|
|
# automatic conversion from ascfun.inc to ascdef.inc
|
|
# and unifun.inc to unidef.inc
|
|
ascdef.inc : ascfun.inc ascdef.sed
|
|
sed -f ascdef.sed ascfun.inc > ascdef.inc
|
|
|
|
unidef.inc : unifun.inc unidef.sed
|
|
sed -f unidef.sed unifun.inc > unidef.inc
|
|
|