diff --git a/.gitattributes b/.gitattributes index b2f7582f06..04bbf50d38 100644 --- a/.gitattributes +++ b/.gitattributes @@ -12767,7 +12767,10 @@ utils/fpcmkcfg/fppkg.inc svneol=native#text/plain utils/fpcres/Makefile svneol=native#text/plain utils/fpcres/Makefile.fpc svneol=native#text/plain utils/fpcres/closablefilestream.pas svneol=native#text/plain +utils/fpcres/fpcjres.pas svneol=native#text/plain utils/fpcres/fpcres.pas svneol=native#text/plain +utils/fpcres/jarparamparser.pas svneol=native#text/plain +utils/fpcres/jarsourcehandler.pas svneol=native#text/plain utils/fpcres/msghandler.pas svneol=native#text/plain utils/fpcres/paramparser.pas svneol=native#text/plain utils/fpcres/sourcehandler.pas svneol=native#text/plain diff --git a/compiler/comprsrc.pas b/compiler/comprsrc.pas index 8988263bf0..8a983cc061 100644 --- a/compiler/comprsrc.pas +++ b/compiler/comprsrc.pas @@ -63,6 +63,15 @@ type procedure EndCollect; override; end; + TJVMRawResourceFile = class(TWinLikeResourceFile) + private + protected + public + function Compile(output: tresoutput; const OutName: ansistring) : boolean; override; + function IsCompiled(const fn : ansistring) : boolean;override; + end; + + procedure CompileResourceFiles; procedure CollectResourceFiles; @@ -383,6 +392,25 @@ begin end; +{**************************************************************************** + TJVMRawResourceFile +****************************************************************************} + +function TJVMRawResourceFile.Compile(output: tresoutput; const OutName: ansistring): boolean; + begin + if output<>roOBJ then + internalerror(2011081703); + result:=inherited; + end; + + +function TJVMRawResourceFile.IsCompiled(const fn: ansistring): boolean; + begin + internalerror(2011081704); + result:=true; + end; + + function CopyResFile(inf,outf : TCmdStr) : boolean; var src,dst : TCCustomFileStream; @@ -418,7 +446,8 @@ var begin { Don't do anything for systems supporting resources without using resource file classes (e.g. Mac OS). They process resources elsewhere. } - if (target_info.res<>res_none) and (target_res.resourcefileclass=nil) then + if ((target_info.res<>res_none) and (target_res.resourcefileclass=nil)) or + (res_no_compile in target_res.resflags) then exit; p:=ExtractFilePath(ExpandFileName(current_module.mainsource^)); diff --git a/compiler/systems.inc b/compiler/systems.inc index 990ad234a2..1d4a403491 100644 --- a/compiler/systems.inc +++ b/compiler/systems.inc @@ -197,10 +197,11 @@ ,res_m68k_palmos,res_m68k_mpw ,res_powerpc_mpw,res_elf ,res_win64_gorc, res_macho, res_ext + ,res_jvm_raw ); tresinfoflags = (res_external_file,res_arch_in_file_name - ,res_single_file); + ,res_single_file,res_no_compile); tdbg = (dbg_none ,dbg_stabs,dbg_dwarf2,dbg_dwarf3,dbg_dwarf4,dbg_jasmin diff --git a/compiler/systems/i_jvm.pas b/compiler/systems/i_jvm.pas index 96ff6ca5b5..f8b9f250db 100644 --- a/compiler/systems/i_jvm.pas +++ b/compiler/systems/i_jvm.pas @@ -27,9 +27,20 @@ unit i_jvm; interface uses - systems; + systems,rescmn; const + res_jvmraw_info : tresinfo = + ( + id : res_jvm_raw; + resbin : 'fpcjres'; + rescmd : '-o $OBJ $DBG'; + rcbin : ''; + rccmd : ''; + resourcefileclass : nil; + resflags : [res_no_compile]; + ); + { The 32 only means that code written for this target behaves semantically as if it were written for a 32 bit target (default integer evaluation width = 32 bit). It will work equally well on 32 @@ -53,8 +64,8 @@ unit i_jvm; unitlibext : '.ppl'; asmext : '.j'; objext : '.class'; - resext : '.res'; - resobjext : '.or'; + resext : ''; + resobjext : '.jar'; sharedlibext : '.jar'; staticlibext : '.jar'; staticlibprefix : ''; @@ -73,7 +84,7 @@ unit i_jvm; link : nil; linkextern : nil; ar : ar_none; - res : res_none; + res : res_jvm_raw; dbg : dbg_jasmin; script : script_unix; endian : endian_big; diff --git a/compiler/systems/t_jvm.pas b/compiler/systems/t_jvm.pas index e65d12cca6..356e84f8fb 100644 --- a/compiler/systems/t_jvm.pas +++ b/compiler/systems/t_jvm.pas @@ -98,4 +98,6 @@ initialization RegisterImport(system_jvm_java32,timportlibjvm); RegisterExport(system_jvm_java32,texportlibjvm); RegisterTarget(system_jvm_java32_info); + + RegisterRes(res_jvmraw_info,TJVMRawResourceFile); end. diff --git a/utils/fpcres/Makefile b/utils/fpcres/Makefile index cf9f19ac75..4dba735a53 100644 --- a/utils/fpcres/Makefile +++ b/utils/fpcres/Makefile @@ -293,382 +293,382 @@ FPCFPMAKE=$(FPC) endif endif ifeq ($(FULL_TARGET),i386-linux) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),i386-go32v2) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),i386-win32) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),i386-os2) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),i386-freebsd) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),i386-beos) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),i386-haiku) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),i386-netbsd) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),i386-solaris) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),i386-qnx) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),i386-netware) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),i386-openbsd) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),i386-wdosx) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),i386-darwin) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),i386-emx) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),i386-watcom) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),i386-netwlibc) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),i386-wince) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),i386-embedded) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),i386-symbian) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),i386-nativent) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),i386-iphonesim) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),m68k-linux) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),m68k-freebsd) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),m68k-netbsd) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),m68k-amiga) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),m68k-atari) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),m68k-openbsd) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),m68k-palmos) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),m68k-embedded) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),powerpc-linux) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),powerpc-netbsd) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),powerpc-amiga) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),powerpc-macos) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),powerpc-darwin) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),powerpc-morphos) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),powerpc-embedded) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),powerpc-wii) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),sparc-linux) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),sparc-netbsd) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),sparc-solaris) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),sparc-embedded) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),x86_64-linux) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),x86_64-freebsd) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),x86_64-solaris) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),x86_64-darwin) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),x86_64-win64) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),x86_64-embedded) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),arm-linux) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),arm-palmos) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),arm-darwin) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),arm-wince) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),arm-gba) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),arm-nds) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),arm-embedded) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),arm-symbian) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),powerpc64-linux) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),powerpc64-darwin) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),powerpc64-embedded) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),avr-embedded) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),armeb-linux) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),armeb-embedded) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),mipsel-linux) -override TARGET_PROGRAMS+=fpcres +override TARGET_PROGRAMS+=fpcres fpcjres endif ifeq ($(FULL_TARGET),i386-linux) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),i386-go32v2) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),i386-win32) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),i386-os2) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),i386-freebsd) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),i386-beos) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),i386-haiku) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),i386-netbsd) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),i386-solaris) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),i386-qnx) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),i386-netware) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),i386-openbsd) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),i386-wdosx) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),i386-darwin) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),i386-emx) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),i386-watcom) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),i386-netwlibc) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),i386-wince) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),i386-embedded) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),i386-symbian) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),i386-nativent) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),i386-iphonesim) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),m68k-linux) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),m68k-freebsd) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),m68k-netbsd) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),m68k-amiga) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),m68k-atari) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),m68k-openbsd) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),m68k-palmos) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),m68k-embedded) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),powerpc-linux) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),powerpc-netbsd) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),powerpc-amiga) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),powerpc-macos) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),powerpc-darwin) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),powerpc-morphos) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),powerpc-embedded) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),powerpc-wii) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),sparc-linux) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),sparc-netbsd) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),sparc-solaris) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),sparc-embedded) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),x86_64-linux) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),x86_64-freebsd) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),x86_64-solaris) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),x86_64-darwin) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),x86_64-win64) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),x86_64-embedded) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),arm-linux) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),arm-palmos) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),arm-darwin) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),arm-wince) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),arm-gba) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),arm-nds) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),arm-embedded) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),arm-symbian) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),powerpc64-linux) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),powerpc64-darwin) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),powerpc64-embedded) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),avr-embedded) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),armeb-linux) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),armeb-embedded) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif ifeq ($(FULL_TARGET),mipsel-linux) -override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target +override CLEAN_UNITS+=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser endif override INSTALL_FPCPACKAGE=y ifdef REQUIRE_UNITSDIR @@ -1446,7 +1446,7 @@ else TAROPT=vz TAREXT=.tar.gz endif -override REQUIRE_PACKAGES=rtl rtl fcl-res +override REQUIRE_PACKAGES=rtl rtl fcl-res paszlib ifeq ($(FULL_TARGET),i386-linux) REQUIRE_PACKAGES_RTL=1 REQUIRE_PACKAGES_HASH=1 @@ -2703,3 +2703,4 @@ include fpcmake.loc endif .NOTPARALLEL: fpcres$(EXEEXT): target.pas msghandler.pas closablefilestream.pas paramparser.pas sourcehandler.pas fpcres.pas +fpcjres$(EXEEXT): msghandler.pas closablefilestream.pas paramparser.pas sourcehandler.pas fpcjres.pas jarsourcehandler.pas jarparamparser.pas diff --git a/utils/fpcres/Makefile.fpc b/utils/fpcres/Makefile.fpc index 6b5fb76cd9..c2a7e663cb 100644 --- a/utils/fpcres/Makefile.fpc +++ b/utils/fpcres/Makefile.fpc @@ -3,13 +3,13 @@ # [target] -programs=fpcres +programs=fpcres fpcjres [clean] -units=closablefilestream msghandler paramparser sourcehandler target +units=closablefilestream msghandler paramparser sourcehandler target jarsourcehandler jarparamparser [require] -packages=rtl fcl-res +packages=rtl fcl-res paszlib [install] fpcpackage=y @@ -20,3 +20,4 @@ fpcdir=../.. [rules] .NOTPARALLEL: fpcres$(EXEEXT): target.pas msghandler.pas closablefilestream.pas paramparser.pas sourcehandler.pas fpcres.pas +fpcjres$(EXEEXT): msghandler.pas closablefilestream.pas paramparser.pas sourcehandler.pas fpcjres.pas jarsourcehandler.pas jarparamparser.pas diff --git a/utils/fpcres/fpcjres.pas b/utils/fpcres/fpcjres.pas new file mode 100644 index 0000000000..d6f5765678 --- /dev/null +++ b/utils/fpcres/fpcjres.pas @@ -0,0 +1,279 @@ +{ + + FPCRes - Free Pascal Resource Converter + Part of the Free Pascal distribution + Copyright (C) 2008 by Giulio Bernardi + Copyright (C) 2011 by Jonas Maebe + + See the file COPYING, 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. +} + +{ + Java's internal resource file handling system is based on simply loading + files from withing the package name space. We reserve the namespace + org.freepascal.rawresources for this purpose. + + This program creates a jar file (= zip file) containing all specified files. +} + +program fpcjres; + +{$MODE OBJFPC} {$H+} + +uses + SysUtils, Classes, paramparser, msghandler, jarsourcehandler, + zipper + ; + +const + halt_no_err = 0; + halt_param_err = 1; + halt_read_err = 2; + halt_write_err = 3; + + progname = 'fpcjres'; + progversion = '1.0'; //to distinguish from the old fpcres + + fpcversion = {$INCLUDE %FPCVERSION%}; + host_arch = {$INCLUDE %FPCTARGETCPU%}; + host_os = {$INCLUDE %FPCTARGETOS%}; + build_date = {$INCLUDE %DATE%}; + + +var + params : TParameters = nil; + resources : TZipper = nil; + sourcefiles : TJarSourceFiles = nil; + +procedure ShowVersion; +begin + writeln(progname+' - resource file converter, version '+progversion+' ['+build_date+'], FPC '+fpcversion); + writeln('Host platform: '+host_os+' - '+host_arch); + writeln('Copyright (c) 2008 by Giulio Bernardi.'); + writeln('Copyright (c) 2011 by Jonas Maebe.'); +end; + +procedure ShowHelp; +begin + ShowVersion; + writeln('Syntax: '+progname+' [options] [...] [-o ]'); + writeln; + writeln('Options:'); + writeln(' --help, -h, -? Show this screen.'); + writeln(' --version, -V Show program version.'); + writeln(' --verbose, -v Be verbose.'); + writeln(' --input, -i Ignored for compatibility.'); + writeln(' --output, -o Set the output file name.'); + writeln(' @ Read more options from file '); +end; + +const + SOutputFileAlreadySet = 'Output file name already set.'; + SUnknownParameter = 'Unknown parameter ''%s'''; + SArgumentMissing = 'Argument missing for option ''%s'''; + SUnknownObjFormat = 'Unknown file format ''%s'''; + SUnknownMachine = 'Unknown architecture ''%s'''; + SFormatArchMismatch = 'Architecture %s is not available for %s format'; + SNoInputFiles = 'No input files'; + SNoOutputFile = 'No output file name specified'; + SCannotReadConfFile ='Can''t read config file ''%s'''; + + SCantOpenFile = 'Can''t open file ''%s'''; + SUnknownInputFormat = 'No known file format detected for file ''%s'''; + + SCantCreateDirHier = 'Can''t create directory hierarchy ''%s'''; + SCantCreateFile = 'Can''t create file ''%s'''; + +function GetCurrentTimeMsec : longint; +var h,m,s,ms : word; +begin + DecodeTime(Time,h,m,s,ms); + Result:=h*3600*1000 + m*60*1000 + s*1000 + ms; +end; + +procedure CheckInputFiles; +begin + if params.InputFiles.Count=0 then + begin + Messages.DoError(SNoInputFiles); + halt(halt_param_err); + end; +end; + +procedure CheckOutputFile; +var tmp : string; +begin + if params.OutputFile<>'' then exit; + if params.InputFiles.Count>1 then + begin + Messages.DoError(SNoOutputFile); + halt(halt_param_err); + end; + tmp:=ChangeFileExt(ExtractFileName(params.InputFiles[0]), + '.jar'); + if lowercase(tmp)=lowercase(params.InputFiles[0]) then + tmp:=tmp+'.jar'; + params.OutputFile:=tmp; +end; + +procedure ParseParams; +var msg : string; +begin + Messages.DoVerbose('parsing command line parameters'); + msg:=''; + if ParamCount = 0 then + begin + ShowHelp; + halt(halt_no_err); + end; + params:=TParameters.Create; + try + params.Parse; + except + on e : EOutputFileAlreadySetException do msg:=SOutputFileAlreadySet; + on e : EUnknownParameterException do msg:=Format(SUnknownParameter,[e.Message]); + on e : EArgumentMissingException do msg:=Format(SArgumentMissing,[e.Message]); + on e : EUnknownObjFormatException do msg:=Format(SUnknownObjFormat,[e.Message]); + on e : EUnknownMachineException do msg:=Format(SUnknownMachine,[e.Message]); + on e : ECannotReadConfFile do msg:=Format(SCannotReadConfFile,[e.Message]); + end; + Messages.Verbose:=params.Verbose; + if msg<>'' then + begin + Messages.DoError(msg); + halt(halt_param_err); + end; + if params.Version then + begin + ShowVersion; + halt(halt_no_err); + end; + if params.Help then + begin + ShowHelp; + halt(halt_no_err); + end; + + CheckInputFiles; + CheckOutputFile; + + Messages.DoVerbose('finished parsing command line parameters'); +end; + +procedure LoadSourceFiles; +var msg : string; +begin + msg:=''; + resources:=TZipper.Create; + sourcefiles:=TJarSourceFiles.Create; + sourcefiles.FileList.AddStrings(params.InputFiles); + try + sourcefiles.Load(resources); + except + on e : ECantOpenFileException do msg:=Format(SCantOpenFile,[e.Message]); + on e : EUnknownInputFormatException do msg:=Format(SUnknownInputFormat,[e.Message]); + on e : Exception do + begin + if e.Message='' then msg:=e.ClassName + else msg:=e.Message; + end; + end; + if msg<>'' then + begin + Messages.DoError(msg); + halt(halt_read_err); + end; +end; + + +procedure WriteOutputFile; +var + msg : string; + outfile: THandle; + removedirlevel: longint; +begin + { create the "resbasedir" hierarchy, since that directory has to exist for + TZipper to be able to add it. If it already exists, make sure we don't + remove it } + if DirectoryExists('org') then + if DirectoryExists('org'+DirectorySeparator+'freepascal') then + if DirectoryExists(resbasedir) then + removedirlevel:=0 + else + removedirlevel:=1 + else + removedirlevel:=2 + else + removedirlevel:=3; + try + ForceDirectories(resbasedir); + except + Messages.DoError(Format(SCantCreateDirHier,[resbasedir])); + halt(halt_write_err); + end; + try + Messages.DoVerbose(Format('Trying to write output file %s...',[params.OutputFile])); + try + { will be overwritten by the tzipper } + outfile:=FileCreate(params.OutputFile,fmCreate or fmShareDenyWrite,438); + FileClose(outfile); + except + Messages.DoError(Format(SCantCreateFile,[params.OutputFile])); + halt(halt_write_err); + end; + try + Messages.DoVerbose(Format('Writing output file %s...',[params.OutputFile])); + resources.FileName:=params.OutputFile; + resources.ZipAllFiles; + except + on e : Exception do + begin + if e.Message='' then msg:=e.ClassName + else msg:=e.Message; + Messages.DoError(msg); + halt(halt_write_err); + end; + end; + Messages.DoVerbose(Format('Output file %s written',[params.OutputFile])); + finally + if removedirlevel>0 then + begin + if removedirlevel>1 then + begin + if removedirlevel>2 then + RemoveDir(resbasedir); + RemoveDir('org'+DirectorySeparator+'freepascal'); + end; + RemoveDir('org'); + end; + end; +end; + +procedure Cleanup; +begin + Messages.DoVerbose('Cleaning up'); + if Resources<>nil then Resources.Free; + if SourceFiles<>nil then SourceFiles.Free; + if Params<>nil then Params.Free; +end; + +var before, elapsed : longint; + +begin + try + before:=GetCurrentTimeMsec; + ParseParams; + LoadSourceFiles; + WriteOutputFile; + elapsed:=GetCurrentTimeMsec-before; + if elapsed<0 then elapsed:=24*3600*1000 + elapsed; + Messages.DoVerbose(Format('Time elapsed: %d.%d seconds',[elapsed div 1000,(elapsed mod 1000) div 10])); + finally + Cleanup; + end; +end. diff --git a/utils/fpcres/jarparamparser.pas b/utils/fpcres/jarparamparser.pas new file mode 100644 index 0000000000..2700068ee4 --- /dev/null +++ b/utils/fpcres/jarparamparser.pas @@ -0,0 +1,38 @@ +unit jarparamparser; + +{$mode objfpc}{$h+} + +interface + +uses + paramparser; + +type + TJarParameters = class(TParameters) + procedure ParseOutputFormat(aList : TStringList; var index : integer; const parname : string);override; + procedure ParseArchitecture(aList : TStringList; var index : integer; const parname : string);override; + procedure ParseSubArchitecture(aList : TStringList; var index : integer; const parname : string);override; + end; + + +implementation + + +{ TJarParameters } + +procedure TJarParameters.ParseOutputFormat(aList: TStringList; var index: integer; const parname: string); +begin + raise EUnknownParameterException.Create(tmp); +end; + +procedure TJarParameters.ParseArchitecture(aList: TStringList; var index: integer; const parname: string); +begin + raise EUnknownParameterException.Create(tmp); +end; + +procedure TJarParameters.ParseSubArchitecture(aList: TStringList; var index: integer; const parname: string); +begin + raise EUnknownParameterException.Create(tmp); +end; + +end. diff --git a/utils/fpcres/jarsourcehandler.pas b/utils/fpcres/jarsourcehandler.pas new file mode 100644 index 0000000000..9c0311f3fb --- /dev/null +++ b/utils/fpcres/jarsourcehandler.pas @@ -0,0 +1,79 @@ +{ + + FPCRes - Free Pascal Resource Converter + Part of the Free Pascal distribution + Copyright (C) 2008 by Giulio Bernardi + + Source files handling + + See the file COPYING, 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. +} + +unit jarsourcehandler; + +{$MODE OBJFPC} {$H+} + +interface + +uses + Classes, SysUtils, sourcehandler, zipper; + +const + resbasedir = 'org'+DirectorySeparator+'freepascal'+DirectorySeparator+'rawresources'+DirectorySeparator; + +type + ESourceFilesException = class(Exception); + ECantOpenFileException = class(ESourceFilesException); + EUnknownInputFormatException = class(ESourceFilesException); + +type + + { TSourceFiles } + + TJarSourceFiles = class(TSourceFiles) + private + protected + public + procedure Load(aResources : TZipper);reintroduce; + end; + +implementation + +uses msghandler, closablefilestream; + +{ TJarSourceFiles } + +procedure TJarSourceFiles.Load(aResources: TZipper); +var aStream : TClosableFileStream; + i : integer; +begin + if fFileList.Count<>0 then + begin + aResources.Entries.AddFileEntry('org/'); + aResources.Entries.AddFileEntry('org/freepascal/'); + aResources.Entries.AddFileEntry(resbasedir); + end; + try + for i:=0 to fFileList.Count-1 do + begin + Messages.DoVerbose(Format('Trying to open file %s...',[fFileList[i]])); + try + aStream:=TClosableFileStream.Create(fFileList[i],fmOpenRead or fmShareDenyWrite); + except + raise ECantOpenFileException.Create(fFileList[i]); + end; + astream.Free; + aResources.Entries.AddFileEntry(fFileList[i],resbasedir+fFileList[i]); + end; + Messages.DoVerbose(Format('%d resources read.',[aResources.Entries.Count])); + finally + end; +end; + +end. + diff --git a/utils/fpcres/paramparser.pas b/utils/fpcres/paramparser.pas index b731c8fcb4..0980838638 100644 --- a/utils/fpcres/paramparser.pas +++ b/utils/fpcres/paramparser.pas @@ -48,9 +48,9 @@ type procedure ParseInputFiles(aList : TStringList; var index : integer; const parname : string); procedure ParseOutputFile(aList : TStringList; var index : integer; const parname : string); - procedure ParseOutputFormat(aList : TStringList; var index : integer; const parname : string); - procedure ParseArchitecture(aList : TStringList; var index : integer; const parname : string); - procedure ParseSubArchitecture(aList : TStringList; var index : integer; const parname : string); + procedure ParseOutputFormat(aList : TStringList; var index : integer; const parname : string);virtual; + procedure ParseArchitecture(aList : TStringList; var index : integer; const parname : string);virtual; + procedure ParseSubArchitecture(aList : TStringList; var index : integer; const parname : string);virtual; procedure ParseConfigFile(aList : TStringList; var index : integer; const parname : string); function DoOptionalArgument(aList : TStringList; const i : integer) : string; function DoMandatoryArgument(aList : TStringList; const i : integer) : string; diff --git a/utils/fpcres/sourcehandler.pas b/utils/fpcres/sourcehandler.pas index 1bdf8f8096..a47400d92b 100644 --- a/utils/fpcres/sourcehandler.pas +++ b/utils/fpcres/sourcehandler.pas @@ -34,9 +34,9 @@ type TSourceFiles = class private + protected fFileList : TStringList; fStreamList : TFPList; - protected public constructor Create; destructor Destroy; override;