Skript file: /~heha/basteln/PC/USB2LPT/usb2lpt.zip/src/Makefile

# Makefile zur Erzeugung der Treiberdateien für USB2LPT
# Für Microsoft NMAKE.EXE (Borland MAKE macht keine ANSI-OEM-Konvertierung)
# Alle Targets sind – wie immer – ohne Laufzeitbibliothek.
# Um nur für eine bestimmte Sprache zu erstellen, Option "L=<sprachkürzel>" verwenden!
# heha, 090628

VER_DLL=1,7,2015,0313
VER_SYS=1,14,2015,0509
VER_INF=1,7,2015,0627

##############################
# Pfade und Compilerschalter #
##############################

# Dieses Makefile benötigt (Gnu-)SED und Gnu-AWK für die Modifikation von Textdateien.
SED=sed -e
AWK=gawk -f
RM=del

# Hilfe-Compiler sowie Vorfilterung, weil ich immer noch Word 2.0 (reicht!) benutze
RTFMOD=rtfmod -x -e -q
HC=c:\Programme\msvc\Common\Tools\hcrtf -x

#### Für Windows 98 und Me wird für die Eigenschaftsseiten im Geräte-Manager
#### allen Ernstes ein 16-Bit-Compiler benötigt! Damit entstehen 16-Bit-DLLs.

# Benötigt Borland C++ 3.1, Turbo- oder MS-Assembler sowie Win98-DDK
SDK16=e:\ToasterE\BC
DDK16=c:\progra~1\msvc\98DDK

#Die beiden Assembler unterscheiden sich in ihrer Kode-Generierung beim Befehl "cmp al,bl".
#ASM16=f:\PROGRAMS\TASM5\BIN\TASM.EXE -m5 -jMASM51 -jQUIRKS
ASM16=$(DDK16)\bin\win98\ML.EXE /c

#FASTCALL (-pr) macht den Kode größer und nicht wirklich schneller.
#Microsoft C ist wegen _ss-Zeigern nicht unmittelbar einsetzbar.
#Borland C++ 4.0 erzeugt rätselhafterweise deutlich größeren Kode und wurde verworfen.
CC16=$(SDK16)\bin\bcc -c
CC16OPT=-3 -d -ms! -a -H- -k- -O1 -p -w -tWDE -po -I$(DDK16)\inc\win98\inc16;$(SDK16)\include

#RC16=$(SDK16)\bin\brc -r -k #-- unbrauchbar, verschluckt sich an DBCS!!
#RC16=c:\progra~1\msvc\w2k3sddk\bin\bin16\rc -ic:\progra~1\msvc\w2k3sddk\inc\inc16 -r #-- unbrauchbar, hackt Strings mit Nullen ab!!
RC16=$(DDK16)\bin\win98\bin16\RC.EXE -i$(SDK16)\INCLUDE -r

#Auch der BorlandC-Linker verschluckt sich an bestimmten DBCS aus der .DEF-Datei.
#Andere Linker wurden nicht probiert, um Problemen (Compiler vs. Linker) aus dem Weg zu gehen.
LINK16=$(SDK16)\bin\tlink.exe /Twd /x /L$(SDK16)\lib
# /Lc:\progra~1\msvc\w2k3sddk\lib\lib16
#LINK16=$(DDK32)\bin\bin16\link /Lc:\progra~1\msvc\w2k3sddk\lib\lib16 /NOLOGO

RL16=$(SDK16)\bin\rlink.exe -31 -t -k
#RL16=c:\progra~1\msvc\w2k3sddk\bin\bin16\rc -k -t -31

#### Für alles andere werden 32-Bit-Compiler benötigt.

# Benötigt (für Teletubbie-Optik) mindestens WinXP-DDK
DDK32=c:\programme\msvc\w2k3sddk
INC32=/I$(DDK32)\inc\wxp /I$(DDK32)\inc\crt
CC32=$(DDK32)\bin\x86\cl /nologo /W3 /O1 /GF /Zi /DWIN32 /DUNICODE $(INC32) /c
RC32=$(DDK32)\bin\x86\rc /i $(DDK32)\inc\wxp /d WINVER=0x0500
USERLIBS=kernel32.lib user32.lib gdi32.lib comdlg32.lib advapi32.lib shell32.lib comctl32.lib setupapi.lib shlwapi.lib
LINK32=$(DDK32)\bin\x86\link /LIBPATH:$(DDK32)\lib\wxp\i386 $(USERLIBS) /nologo /opt:nowin98 /mapinfo:lines /release /nod
LINK9x=$(DDK32)\bin\x86\link /libpath:"c:\programme\msvc\98DDK\lib\i386\free" /nologo /opt:nowin98 /mapinfo:lines /release /nod

# Der 64-Bit-Compiler und -Linker unterstützt leider keine Zeilennumern (was beim Post-Mortem-Debugging gut hilft)
CC64=$(DDK32)\bin\win64\x86\amd64\cl /DWIN32 /DUNICODE /D_WIN64 /nologo /W3 /O1 /GF /Zi /GS- /c
ASM64=$(DDK32)\bin\win64\x86\amd64\ml64 /Zi /c /nologo
LINK64=$(DDK32)\bin\win64\x86\amd64\link /LIBPATH:$(DDK32)\lib\wnet\amd64 /nologo /release /nod
#MAKECAT="H:\Program Files (x86)\Microsoft SDKs\Windows\v7.1\Bin\makecat"
MAKECAT=makecat
SIGN=sign	

#############
# Rekursion #
#############
!IFNDEF L
all:
	@echo Ressourcen für alle 14 Sprachen anhängen und in die 14 Setup-Verzeichnisse stellen ...
	@$(MAKE) /NOLOGO L=de
	@$(MAKE) /NOLOGO L=en
	@$(MAKE) /NOLOGO L=fr H=en
	@$(MAKE) /NOLOGO L=it H=en
	@$(MAKE) /NOLOGO L=es H=en
	@$(MAKE) /NOLOGO L=pt H=en
	@$(MAKE) /NOLOGO L=fi H=en
	@$(MAKE) /NOLOGO L=cn CP=936 H=en
	@$(MAKE) /NOLOGO L=jp CP=932 H=en
	@$(MAKE) /NOLOGO L=ru CP=1251 H=en
	@$(MAKE) /NOLOGO L=cz CP=1250 H=en
	@$(MAKE) /NOLOGO L=pl CP=1250
	@$(MAKE) /NOLOGO L=hu CP=1250 H=en
	@$(MAKE) /NOLOGO L=tr CP=1254 H=en
	@$(MAKE) /NOLOGO L=ml CP=1200 H="en de pl" ML=ml

signcat: ..\de\usb2lpt.cat ..\en\usb2lpt.cat ..\fr\usb2lpt.cat ..\it\usb2lpt.cat ..\es\usb2lpt.cat ..\pt\usb2lpt.cat ..\fi\usb2lpt.cat ..\cn\usb2lpt.cat ..\jp\usb2lpt.cat ..\ru\usb2lpt.cat ..\cz\usb2lpt.cat ..\pl\usb2lpt.cat ..\hu\usb2lpt.cat ..\tr\usb2lpt.cat ..\ml\usb2lpt.cat
	$(SIGN) $**

sign32: ..\de\usb2lpt.ntx86.sys ..\en\usb2lpt.ntx86.sys ..\fr\usb2lpt.ntx86.sys ..\it\usb2lpt.ntx86.sys ..\es\usb2lpt.ntx86.sys ..\pt\usb2lpt.ntx86.sys ..\fi\usb2lpt.ntx86.sys ..\cn\usb2lpt.ntx86.sys ..\jp\usb2lpt.ntx86.sys ..\ru\usb2lpt.ntx86.sys ..\cz\usb2lpt.ntx86.sys ..\pl\usb2lpt.ntx86.sys ..\hu\usb2lpt.ntx86.sys ..\tr\usb2lpt.ntx86.sys ..\ml\usb2lpt.ntx86.sys
	$(SIGN) $**

sign64: ..\de\usb2lpt.ntamd64.sys ..\en\usb2lpt.ntamd64.sys ..\fr\usb2lpt.ntamd64.sys ..\it\usb2lpt.ntamd64.sys ..\es\usb2lpt.ntamd64.sys ..\pt\usb2lpt.ntamd64.sys ..\fi\usb2lpt.ntamd64.sys ..\cn\usb2lpt.ntamd64.sys ..\jp\usb2lpt.ntamd64.sys ..\ru\usb2lpt.ntamd64.sys ..\cz\usb2lpt.ntamd64.sys ..\pl\usb2lpt.ntamd64.sys ..\hu\usb2lpt.ntamd64.sys ..\tr\usb2lpt.ntamd64.sys ..\ml\usb2lpt.ntamd64.sys
	$(SIGN) $**

clean:
#Alle temporären Dateien landen neben dem Makefile
	-$(RM) *.obj
	-$(RM) *.res
	-$(RM) *.map
	-$(RM) prop??.dll
!ELSE
############
# Aktionen #
############

!ifdef ML
all: 32 64 inf
!else
!IFDEF H
all: 9x 32 64 inf
!ELSE
all: 9x 32 64 help inf
!ENDIF
!endif
	@echo Sprache »$L« komplett.
	
dirs:
	mkdir ..\$L

###########
# Win9xMe #
###########

!IFNDEF CP
CP=1252
#	Keine typografischen ... (Ellipse) bei Win16
#	Gegeben als CP1252 - so funktioniert's nur mit nmake!!
FILTER=| $(SED) "s/…/.../g;s/–/-/g;s/„/»/g;s/”/»/g;s/“/«/g"
!ENDIF


9x: ..\$L\usb2lpt.dll ..\$L\usb2lpt.sys

### PropertySheet-Provider ###

# Assembler-Stub, um die Laufzeitbibliothek von Borland C++ wegzulassen
ul_c0ds.obj: dll\ul_c0ds.asm
	$(ASM16) $**

# Gemeinsamer Quelltext
prop16.obj: dll\prop.cpp dll\prop.h sys\usb2lpt.h dll\thunk16.h
	$(CC16) @<< -Idll -Isys -oprop16.obj dll\prop.cpp
$(CC16OPT)
<<

mon16.obj: dll\mon.cpp dll\prop.h sys\usb2lpt.h
	$(CC16) @<< -Idll -Isys -omon16.obj dll\mon.cpp
$(CC16OPT)
<<

# Stub-DLL ohne Ressourcen
prop16.dll: ul_c0ds.obj prop16.obj mon16.obj dll\prop16.def
	$(LINK16) ul_c0ds.obj prop16.obj mon16.obj,$@,prop16.map,import.lib,dll\prop16.def
	$(SDK16)\bin\exechain $@

#Einsprachige 16-bit-Ressourcen
prop16$L.res: dll\prop.rc dll\prop.ico dll\$L.inc dll\FilterInc.awk
	$(AWK) dll\FilterInc.awk -v VER=$(VER_DLL) -v VP=$(VER_INF) -v CP=$(CP) dll\$L.inc >tmp.inc
	transcode $(CP) tmp.inc $(FILTER) >tmp.rc
	transcode $(CP) dll\prop.rc >>tmp.rc
	$(RC16) -idll -fo$@ tmp.rc
	$(RM) tmp.rc tmp.inc

# Sprachspezifische DLL
..\$L\usb2lpt.dll: prop16$L.res prop16.dll
	$(RL16) -fe $@ $**


### Treiber ###

usb2lpt.obj: sys\usb2lpt.c sys\usb2lpt.h sys\w2k.h
	$(CC32) /Fo$@ sys\usb2lpt.c /Gz /I c:\programme\msvc\98DDK\inc\win98 /D _X86_ /D DRIVER

vlpt.obj: sys\vlpt.c sys\usb2lpt.h
	$(CC32) /Fo$@ sys\vlpt.c /Gz /I c:\programme\msvc\98DDK\inc\win98 /D _X86_ /D DRIVER

w2k.obj: sys\w2k.c sys\w2k.h
	$(CC32) /Fo$@ sys\w2k.c /Gz /I c:\programme\msvc\98DDK\inc\win98 /D _X86_ /D DRIVER

!IFDEF ML
usb2lpt$L.res: sys\usb2lpt.rc
	$(AWK) dll\MixLang.awk -v VER=$(VER_SYS) -v VP=$(VER_INF) -v CP=1200 sys\usb2lpt.rc >tmp.inc
	transcode 1200 tmp.inc >tmp.rc
!ELSE
usb2lpt$L.res: sys\usb2lpt.rc dll\$L.inc
	$(AWK) dll\FilterInc.awk -v VER=$(VER_SYS) -v VP=$(VER_INF) -v CP=1200 dll\$L.inc >tmp.inc
	transcode 1200 tmp.inc >tmp.rc
	transcode 1200 sys\usb2lpt.rc >>tmp.rc
!ENDIF
	$(RC32) -fo$@ tmp.rc
	$(RM) tmp.rc tmp.inc

..\$L\usb2lpt.sys: usb2lpt.obj vlpt.obj w2k.obj usb2lpt$L.res
	$(LINK9x) ntoskrnl.lib hal.lib USBD.LIB /entry:DriverEntry /out:$@ $** /subsystem:NATIVE /driver /map:usb2lpt.sys.map

###########
# WinNt32 #
###########

32: ..\$L\usb2lpt.ntx86.dll ..\$L\usb2lpt.ntx86.sys

### PropertySheet-Provider ###

# Library-Stub, um eine Bindung nach Name nach msports.dll:ParallelPortPropPageProvider hinzubekommen
# Und LoadLibrary/GetProcAddress bläht Kode auf, ist langweilig – und das kann ja jeder!
# ... Bibliothek ist im w2k3-DDK enthalten.
#msports32.lib: dll\msports.cpp dll\msports.h
#	$(CC32) /DMSPORTS_EXPORTS dll\msports.cpp
#	$(LINK32) /dll /out:msports.dll msports.obj /export:ParallelPortPropPageProvider
#	$(RM) msports.obj msports.dll msports.exp

# Gemeinsamer Quelltext
prop32.obj: dll\prop.cpp dll\prop.h sys\usb2lpt.h dll\msports.h
	$(CC32) -Isys /Fo$@ dll\prop.cpp /Gr 
	
mon32.obj: dll\mon.cpp dll\prop.h sys\usb2lpt.h dll\msports.h
	$(CC32) -Isys /Fo$@ dll\mon.cpp /Gr

!IFDEF ML
prop32$L.res: dll\prop.rc dll\prop.ico dll\prop.manifest dll\MixLang.awk
	$(AWK) dll\MixLang.awk -v VER=$(VER_DLL) -v VP=$(VER_INF) -v CP=1200 dll\prop.rc >tmp.inc
	transcode 1200 tmp.inc >tmp.rc
!ELSE
prop32$L.res: dll\prop.rc dll\prop.ico dll\prop.manifest dll\$L.inc dll\FilterInc.awk
	$(AWK) dll\FilterInc.awk -v VER=$(VER_DLL) -v VP=$(VER_INF) -v CP=1200 dll\$L.inc >tmp.inc
	transcode 1200 tmp.inc >tmp.rc
	transcode 1200 dll\prop.rc >>tmp.rc
!ENDIF
	$(RC32) -I dll /d WIN32 -r -fo$@ tmp.rc
	$(RM) tmp.rc tmp.inc

# Stub-DLL ohne Ressourcen: Das geht nicht! Fehlt ein Ressource-Linker!
..\$L\usb2lpt.ntx86.dll: prop32.obj mon32.obj prop32$L.res
	$(LINK32) /dll /out:usb2lpt.dll $** msports.lib /subsystem:windows,5.0 /base:0x6abc0000 /version:1.2 /export:EnumPropPages /export:CoDeviceInstall /map:usb2lpt.ntx86.dll.map
	$(RM) usb2lpt.exp usb2lpt.lib
# Die DLL soll intern schön "usb2lpt.dll" heißen - so benennt sie der Installer um.
	move usb2lpt.dll $@

### Treiber ###

usb2lpt32.obj: sys\usb2lpt.c sys\usb2lpt.h
	$(CC32) /Fo$@ sys\usb2lpt.c /Gz /I $(DDK32)\inc\ddk\w2k /I $(DDK32)\inc\crt /I $(DDK32)\inc\w2k /I $(DDK32)\inc\ddk\wdm\w2k /D _X86_ /D DRIVER /D NTDDK

vlpt32.obj: sys\vlpt.c sys\usb2lpt.h
	$(CC32) /Fo$@ sys\vlpt.c /Gz /I $(DDK32)\inc\ddk\w2k /I $(DDK32)\inc\crt /I $(DDK32)\inc\w2k /I $(DDK32)\inc\ddk\wdm\w2k /D _X86_ /D DRIVER /D NTDDK

# Gleiche Ressource für alle Plattformen, usb2lpt$L.res siehe "Win9xMe"

..\$L\usb2lpt.ntx86.sys: usb2lpt32.obj vlpt32.obj usb2lpt$L.res
	$(LINK32) ntoskrnl.lib hal.lib USBD.LIB wmilib.lib /entry:DriverEntry /out:usb2lpt.sys $** /libpath:$(DDK32)\lib\w2k\i386 /subsystem:NATIVE /driver /map:usb2lpt.ntx86.sys.map
	move usb2lpt.sys $@

###########
# WinNt64 #
###########

64: ..\$L\usb2lpt.ntamd64.dll ..\$L\usb2lpt.ntamd64.sys

### PropertySheet-Provider ###

prop64.obj: dll\prop.cpp dll\prop.h sys\usb2lpt.h dll\msports.h
	$(CC64) -Isys /Fo$@ dll\prop.cpp $(INC32)
	
mon64.obj: dll\mon.cpp dll\prop.h sys\usb2lpt.h dll\msports.h
	$(CC64) -Isys /Fo$@ dll\mon.cpp $(INC32)

..\$L\usb2lpt.ntamd64.dll: prop64.obj mon64.obj prop32$L.res 
	$(LINK64) /dll /out:usb2lpt.dll $(USERLIBS) uxtheme.lib msports.lib $** /export:EnumPropPages /export:CoDeviceInstall /map:usb2lpt.ntamd64.dll.map
	$(RM) usb2lpt.exp usb2lpt.lib
	move usb2lpt.dll $@


### Treiber ###

usb2lpt64.obj: sys\usb2lpt.c sys\usb2lpt.h
	$(CC64) /Fo$@ sys\usb2lpt.c /I $(DDK32)\inc\ddk\wnet /I $(DDK32)\inc\crt /I $(DDK32)\inc\wnet /I $(DDK32)\inc\ddk\wdm\wnet /D _AMD64_ /D DRIVER /D NTDDK

vlpt64.obj: sys\vlpt.c sys\usb2lpt.h
	$(CC64) /Fo$@ sys\vlpt.c /I $(DDK32)\inc\ddk\wnet /I $(DDK32)\inc\crt /I $(DDK32)\inc\wnet /I $(DDK32)\inc\ddk\wdm\wnet /D _AMD64_ /D DRIVER /D NTDDK

amd64.obj: sys\amd64.asm
	$(ASM64) /Fo$@ $**

#ext.obj: sys\ext.asm
#	$(ASM64) /Fo$@ $**

#antipatch.obj: sys\antipatch.c
#	$(CC64) /Fo$@ sys\antipatch.c /I $(DDK32)\inc\ddk\wnet /I $(DDK32)\inc\crt /I $(DDK32)\inc\wnet /D _AMD64_

..\$L\usb2lpt.ntamd64.sys: usb2lpt64.obj vlpt64.obj amd64.obj usb2lpt$L.res
	$(LINK64) ntoskrnl.lib hal.lib USBD.LIB wmilib.lib /entry:DriverEntry /out:usb2lpt.sys $** /libpath:$(DDK32)\lib\wnet\amd64 /subsystem:NATIVE /driver /map:usb2lpt.ntamd64.sys.map
	move usb2lpt.sys $@

#########
# Hilfe #
#########

help: ..\$L\usb2lpt.hlp
..\$L\usb2lpt.hlp: hlp\$L.hpj hlp\$L.rtf
	cd hlp
	$(RTFMOD) $L.rtf
	$(HC) $L.hpj
	cd ..

inf: ..\$L\usb2lpt.cat Makefile

!IFDEF ML
..\$L\usb2lpt.inf: inf\usb2lpt.inx inf\FilterInf.awk
	$(AWK) inf\FilterInf.awk -v VER_INF=$(VER_INF) -v HLP_LNG="$H" inf\usb2lpt.inx > tmp.inf
	$(AWK) inf\MixLang.awk >> tmp.inf
	transcode $(CP) tmp.inf > $@
	$(RM) tmp.inf
!ELSE
..\$L\usb2lpt.inf: inf\usb2lpt.inx inf\FilterInf.awk inf\FilterInc.awk dll\$L.inc
	$(AWK) inf\FilterInf.awk -v VER_INF=$(VER_INF) -v HLP_LNG=$H inf\usb2lpt.inx > $@
	transcode $(CP) dll\$L.inc | $(AWK) inf\FilterInc.awk >> $@
!ENDIF

sign: ..\$L\usb2lpt.cat
	$(SIGN) $**

!ENDIF

#1. Alle, wirklich ALLE Dateien müssen in den Katalog. Sonst gilt die Signatur nicht:
#   Der Installer meckert das Installationspaket als ungültig an.
#2. Es funktioniert NUR mit dem <HASH>-Präfix; CMD's "^<" gibt ein "<" aus
#   Links vom "=" steht nur ein (hinreichend eindeutiger) Täg.
#3. Das ATTR1 "File" ist für den Anwender, damit er sieht auf welche Datei sich der Hash bezieht.
#   So und nicht anders müssen Attribute angegeben werden; MS-Dokumentation mangels Beispiel unklar.
#4. Das ATTR2 "OSAttr" wird angeblich vom Installer geprüft, aber bisher ging es auch ohne.
#   Die Angabe "2:5.00,2:6.0" wurde am häufigsten gesichtet.
#   "2:" bedeutet Windows NT, nach dem Doppelpunkt die Versionsnummer.
#   Laut MS müsste JEDES Windows gelistet werden, und zwar in JEWEILS EINEM ANDEREM ATTR. Nie gesehen.
#5. INF2CAT (was ich nicht habe) wirft anscheinend noch alle USB-ID-Paare in den Header hinein,
#   wie man das bei fremden CAT-Dateien sieht.
#   Vom CAT-Betrachter (Doppelklick auf CAT-Datei im Explorer) wird's aber nur augenschmerzend angezeigt.
..\$L\usb2lpt.cat: #..\$L\usb2lpt.inf ..\$L\usb2lpt.ntamd64.sys ..\$L\usb2lpt.ntamd64.dll ..\$L\usb2lpt.ntx86.sys ..\$L\usb2lpt.ntx86.dll
	echo [CatalogHeader] > usb2lpt.cdf
	echo Name=usb2lpt.cat >> usb2lpt.cdf
	echo [CatalogFiles] >> usb2lpt.cdf
	echo ^<HASH^>inf=..\$L\usb2lpt.inf >> usb2lpt.cdf
	echo ^<HASH^>infATTR1=0x10010001:File:usb2lpt.inf >> usb2lpt.cdf
	echo ^<HASH^>ntamd64.sys=..\$L\usb2lpt.ntamd64.sys >> usb2lpt.cdf
	echo ^<HASH^>ntamd64.sysATTR1=0x10010001:File:usb2lpt.ntamd64.sys >> usb2lpt.cdf
	echo ^<HASH^>ntamd64.sysATTR2=0x10010001:OSAttr:2:5.00,2:6.0 >> usb2lpt.cdf
	echo ^<HASH^>ntamd64.dll=..\$L\usb2lpt.ntamd64.dll >> usb2lpt.cdf
	echo ^<HASH^>ntamd64.dllATTR1=0x10010001:File:usb2lpt.ntamd64.dll >> usb2lpt.cdf
	echo ^<HASH^>ntamd64.dllATTR2=0x10010001:OSAttr:2:5.00,2:6.0 >> usb2lpt.cdf
	echo ^<HASH^>ntx86.sys=..\$L\usb2lpt.ntx86.sys >> usb2lpt.cdf
	echo ^<HASH^>ntx86.sysATTR1=0x10010001:File:usb2lpt.ntx86.sys >> usb2lpt.cdf
	echo ^<HASH^>ntx86.sysATTR2=0x10010001:OSAttr:2:5.00,2:6.0 >> usb2lpt.cdf
	echo ^<HASH^>ntx86.dll=..\$L\usb2lpt.ntx86.dll >> usb2lpt.cdf
	echo ^<HASH^>ntx86.dllATTR1=0x10010001:File:usb2lpt.ntx86.dll >> usb2lpt.cdf
	echo ^<HASH^>ntx86.dllATTR2=0x10010001:OSAttr:2:5.00,2:6.0 >> usb2lpt.cdf
!IFDEF ML
	echo ^<HASH^>de.hlp=..\de\usb2lpt.hlp >> usb2lpt.cdf
	echo ^<HASH^>de.hlpATTR1=0x10010001:File:usb2lpt.de.hlp >> usb2lpt.cdf
	echo ^<HASH^>en.hlp=..\en\usb2lpt.hlp >> usb2lpt.cdf
	echo ^<HASH^>en.hlpATTR1=0x10010001:File:usb2lpt.en.hlp >> usb2lpt.cdf
	echo ^<HASH^>pl.hlp=..\pl\usb2lpt.hlp >> usb2lpt.cdf
	echo ^<HASH^>pl.hlpATTR1=0x10010001:File:usb2lpt.pl.hlp >> usb2lpt.cdf
!ELSE
	echo ^<HASH^>sys=..\$L\usb2lpt.sys >> usb2lpt.cdf
	echo ^<HASH^>sysATTR1=0x10010001:File:usb2lpt.sys >> usb2lpt.cdf
	echo ^<HASH^>dll=..\$L\usb2lpt.dll >> usb2lpt.cdf
	echo ^<HASH^>dllATTR1=0x10010001:File:usb2lpt.dll >> usb2lpt.cdf
!IFDEF H
	echo ^<HASH^>hlp=..\$H\usb2lpt.hlp >> usb2lpt.cdf
	echo ^<HASH^>hlpATTR1=0x10010001:File:usb2lpt.hlp >> usb2lpt.cdf
!ELSE
	echo ^<HASH^>hlp=..\$L\usb2lpt.hlp >> usb2lpt.cdf
	echo ^<HASH^>hlpATTR1=0x10010001:File:usb2lpt.hlp >> usb2lpt.cdf
!ENDIF
!ENDIF
	$(MAKECAT) usb2lpt.cdf
	$(RM) usb2lpt.cdf
	move usb2lpt.cat $@

######################################
# Hilfsziele zur Programmentwicklung #
######################################

# leer
Detected encoding: ANSI (CP1252)4
Wrong umlauts? - Assume file is ANSI (CP1252) encoded