mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-21 01:29:29 +02:00
* static/shared linking updates
This commit is contained in:
parent
7936f4e13b
commit
cc64a929aa
@ -31,25 +31,24 @@ const
|
||||
{$ifdef tp}
|
||||
AsmOutSize=1024;
|
||||
{$else}
|
||||
AsmOutSize=10000;
|
||||
AsmOutSize=32768;
|
||||
{$endif}
|
||||
|
||||
type
|
||||
PAsmList=^TAsmList;
|
||||
TAsmList=object
|
||||
{filenames}
|
||||
path : dirstr;
|
||||
path : pathstr;
|
||||
name : namestr;
|
||||
asmfile,
|
||||
asmfile, { current .s and .o file }
|
||||
objfile,
|
||||
srcfile,
|
||||
as_bin : string;
|
||||
{outfile}
|
||||
AsmSize,
|
||||
outcnt : longint;
|
||||
outbuf : array[0..AsmOutSize-1] of char;
|
||||
outfile : file;
|
||||
Constructor Init(const fn:string);
|
||||
Constructor Init;
|
||||
Destructor Done;
|
||||
Function FindAssembler:string;
|
||||
Function CallAssembler(const command,para:string):Boolean;
|
||||
@ -67,12 +66,11 @@ type
|
||||
procedure WriteAsmList;virtual;
|
||||
end;
|
||||
|
||||
Procedure GenerateAsm(const fn:string);
|
||||
Procedure OnlyAsm(const fn:string);
|
||||
Procedure GenerateAsm;
|
||||
Procedure OnlyAsm;
|
||||
|
||||
var
|
||||
SmartLinkFilesCnt : longint;
|
||||
Function SmartLinkPath(const s:string):string;
|
||||
|
||||
Implementation
|
||||
|
||||
@ -107,20 +105,6 @@ uses
|
||||
;
|
||||
|
||||
|
||||
{*****************************************************************************
|
||||
SmartLink Helpers
|
||||
*****************************************************************************}
|
||||
|
||||
Function SmartLinkPath(const s:string):string;
|
||||
var
|
||||
p : dirstr;
|
||||
n : namestr;
|
||||
e : extstr;
|
||||
begin
|
||||
FSplit(s,p,n,e);
|
||||
SmartLinkPath:=FixFileName(n+target_info.smartext);
|
||||
end;
|
||||
|
||||
{*****************************************************************************
|
||||
TAsmList
|
||||
*****************************************************************************}
|
||||
@ -191,10 +175,10 @@ begin
|
||||
if cs_asm_leave in aktglobalswitches then
|
||||
exit;
|
||||
if cs_asm_extern in aktglobalswitches then
|
||||
AsmRes.AddDeleteCommand(asmfile)
|
||||
AsmRes.AddDeleteCommand(AsmFile)
|
||||
else
|
||||
begin
|
||||
assign(g,asmfile);
|
||||
assign(g,AsmFile);
|
||||
{$I-}
|
||||
erase(g);
|
||||
{$I+}
|
||||
@ -364,28 +348,29 @@ begin
|
||||
end;
|
||||
|
||||
|
||||
Constructor TAsmList.Init(const fn:string);
|
||||
Constructor TAsmList.Init;
|
||||
var
|
||||
ext : extstr;
|
||||
i : word;
|
||||
i : word;
|
||||
begin
|
||||
{Create filenames for easier access}
|
||||
fsplit(fn,path,name,ext);
|
||||
srcfile:=fn;
|
||||
asmfile:=path+name+target_info.asmext;
|
||||
objfile:=path+name+target_info.objext;
|
||||
{ load start values }
|
||||
|
||||
asmfile:=current_module^.asmfilename^;
|
||||
objfile:=current_module^.objfilename^;
|
||||
name:=FixFileName(current_module^.modulename^);
|
||||
OutCnt:=0;
|
||||
{Smartlinking}
|
||||
SmartLinkFilesCnt:=0;
|
||||
{ Which path will be used ? }
|
||||
if (cs_smartlink in aktmoduleswitches) then
|
||||
begin
|
||||
path:=SmartLinkPath(name);
|
||||
path:=current_module^.path^+FixFileName(current_module^.modulename^)+target_info.smartext;
|
||||
{$I-}
|
||||
mkdir(path);
|
||||
{$I+}
|
||||
i:=ioresult;
|
||||
end;
|
||||
path:=FixPath(path);
|
||||
path:=FixPath(path);
|
||||
end
|
||||
else
|
||||
path:=current_module^.path^;
|
||||
end;
|
||||
|
||||
|
||||
@ -398,34 +383,34 @@ end;
|
||||
Generate Assembler Files Main Procedure
|
||||
*****************************************************************************}
|
||||
|
||||
Procedure GenerateAsm(const fn:string);
|
||||
Procedure GenerateAsm;
|
||||
var
|
||||
a : PAsmList;
|
||||
begin
|
||||
case aktoutputformat of
|
||||
{$ifdef i386}
|
||||
{$ifndef NoAg386Att}
|
||||
as_o : a:=new(pi386attasmlist,Init(fn));
|
||||
as_o : a:=new(pi386attasmlist,Init);
|
||||
{$endif NoAg386Att}
|
||||
{$ifndef NoAg386Nsm}
|
||||
as_nasmcoff,
|
||||
as_nasmelf,
|
||||
as_nasmobj : a:=new(pi386nasmasmlist,Init(fn));
|
||||
as_nasmobj : a:=new(pi386nasmasmlist,Init);
|
||||
{$endif NoAg386Nsm}
|
||||
{$ifndef NoAg386Int}
|
||||
as_tasm : a:=new(pi386intasmlist,Init(fn));
|
||||
as_tasm : a:=new(pi386intasmlist,Init);
|
||||
{$endif NoAg386Int}
|
||||
{$endif}
|
||||
{$ifdef m68k}
|
||||
{$ifndef NoAg68kGas}
|
||||
as_o,
|
||||
as_gas : a:=new(pm68kgasasmlist,Init(fn));
|
||||
as_gas : a:=new(pm68kgasasmlist,Init);
|
||||
{$endif NoAg86KGas}
|
||||
{$ifndef NoAg68kMot}
|
||||
as_mot : a:=new(pm68kmotasmlist,Init(fn));
|
||||
as_mot : a:=new(pm68kmotasmlist,Init);
|
||||
{$endif NoAg86kMot}
|
||||
{$ifndef NoAg68kMit}
|
||||
as_mit : a:=new(pm68kmitasmlist,Init(fn));
|
||||
as_mit : a:=new(pm68kmitasmlist,Init);
|
||||
{$endif NoAg86KMot}
|
||||
{$endif}
|
||||
else
|
||||
@ -439,11 +424,11 @@ begin
|
||||
end;
|
||||
|
||||
|
||||
Procedure OnlyAsm(const fn:string);
|
||||
Procedure OnlyAsm;
|
||||
var
|
||||
a : PAsmList;
|
||||
begin
|
||||
a:=new(pasmlist,Init(fn));
|
||||
a:=new(pasmlist,Init);
|
||||
a^.DoAssemble;
|
||||
dispose(a,Done);
|
||||
end;
|
||||
@ -452,7 +437,10 @@ end;
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.16 1998-08-14 21:56:30 peter
|
||||
Revision 1.17 1998-08-17 09:17:43 peter
|
||||
* static/shared linking updates
|
||||
|
||||
Revision 1.16 1998/08/14 21:56:30 peter
|
||||
* setting the outputfile using -o works now to create static libs
|
||||
|
||||
Revision 1.15 1998/08/14 18:16:09 peter
|
||||
|
@ -126,7 +126,8 @@ unit files;
|
||||
objfilename, { fullname of the objectfile }
|
||||
asmfilename, { fullname of the assemblerfile }
|
||||
ppufilename, { fullname of the ppufile }
|
||||
libfilename, { fullname of the libraryfile/exefile }
|
||||
staticlibfilename, { fullname of the static libraryfile }
|
||||
sharedlibfilename, { fullname of the shared libraryfile }
|
||||
exefilename, { fullname of the exefile }
|
||||
asmprefix, { prefix for the smartlink asmfiles }
|
||||
mainsource : pstring; { name of the main sourcefile }
|
||||
@ -229,13 +230,13 @@ unit files;
|
||||
|
||||
{ unit flags }
|
||||
uf_init = $1;
|
||||
uf_has_dbx = $2;
|
||||
uf_has_browser = $4;
|
||||
uf_in_library = $8;
|
||||
uf_shared_library = $10;
|
||||
uf_big_endian = $20;
|
||||
uf_smartlink = $40;
|
||||
uf_finalize = $80;
|
||||
uf_finalize = $2;
|
||||
uf_big_endian = $4;
|
||||
uf_has_dbx = $8;
|
||||
uf_has_browser = $10;
|
||||
uf_in_library = $20;
|
||||
uf_static_library = $40;
|
||||
uf_shared_library = $80;
|
||||
{$endif}
|
||||
|
||||
var
|
||||
@ -410,7 +411,8 @@ unit files;
|
||||
stringdispose(objfilename);
|
||||
stringdispose(asmfilename);
|
||||
stringdispose(ppufilename);
|
||||
stringdispose(libfilename);
|
||||
stringdispose(staticlibfilename);
|
||||
stringdispose(sharedlibfilename);
|
||||
stringdispose(exefilename);
|
||||
stringdispose(path);
|
||||
fsplit(fn,p,n,e);
|
||||
@ -422,7 +424,8 @@ unit files;
|
||||
{ lib and exe could be loaded with a file specified with -o }
|
||||
if OutputFile<>'' then
|
||||
s:=OutputFile;
|
||||
libfilename:=stringdup(s+target_os.staticlibext);
|
||||
staticlibfilename:=stringdup(target_os.libprefix+s+target_os.staticlibext);
|
||||
sharedlibfilename:=stringdup(target_os.libprefix+s+target_os.sharedlibext);
|
||||
exefilename:=stringdup(s+target_os.exeext);
|
||||
end;
|
||||
|
||||
@ -489,12 +492,19 @@ unit files;
|
||||
do_compile:=false;
|
||||
if (flags and uf_in_library)=0 then
|
||||
begin
|
||||
if (flags and uf_smartlink)<>0 then
|
||||
if (flags and uf_static_linked)<>0 then
|
||||
begin
|
||||
objfiletime:=getnamedfiletime(libfilename^);
|
||||
objfiletime:=getnamedfiletime(staticlibfilename^);
|
||||
if (ppufiletime<0) or (objfiletime<0) or (ppufiletime>objfiletime) then
|
||||
do_compile:=true;
|
||||
end
|
||||
else
|
||||
if (flags and uf_shared_linked)<>0 then
|
||||
begin
|
||||
objfiletime:=getnamedfiletime(sharedlibfilename^);
|
||||
if (ppufiletime<0) or (objfiletime<0) or (ppufiletime>objfiletime) then
|
||||
do_compile:=true;
|
||||
end
|
||||
else
|
||||
begin
|
||||
{ the objectfile should be newer than the ppu file }
|
||||
@ -548,7 +558,7 @@ unit files;
|
||||
singlepathstring:=FixPath(copy(unitpath,start,i-start));
|
||||
delete(unitpath,start,i-start+1);
|
||||
{ Check for PPL file }
|
||||
if not (cs_link_static in aktglobalswitches) then
|
||||
if not Found then
|
||||
begin
|
||||
Found:=UnitExists(target_info.unitlibext);
|
||||
if Found then
|
||||
@ -558,7 +568,7 @@ unit files;
|
||||
End;
|
||||
end;
|
||||
{ Check for PPU file }
|
||||
if not (cs_link_dynamic in aktglobalswitches) and not Found then
|
||||
if not Found then
|
||||
begin
|
||||
Found:=UnitExists(target_info.unitext);
|
||||
if Found then
|
||||
@ -869,14 +879,15 @@ unit files;
|
||||
ppufilename:=nil;
|
||||
objfilename:=nil;
|
||||
asmfilename:=nil;
|
||||
libfilename:=nil;
|
||||
staticlibfilename:=nil;
|
||||
sharedlibfilename:=nil;
|
||||
exefilename:=nil;
|
||||
{ go32v2 has the famous 8.3 limit ;) }
|
||||
{$ifdef go32v2}
|
||||
asmprefix:=stringdup('as');
|
||||
{$else}
|
||||
asmprefix:=stringdup(Lower(n));
|
||||
{$endif}
|
||||
{$endif}
|
||||
|
||||
path:=nil;
|
||||
setfilename(p+n);
|
||||
@ -933,7 +944,8 @@ unit files;
|
||||
stringdispose(objfilename);
|
||||
stringdispose(asmfilename);
|
||||
stringdispose(ppufilename);
|
||||
stringdispose(libfilename);
|
||||
stringdispose(staticlibfilename);
|
||||
stringdispose(sharedlibfilename);
|
||||
stringdispose(exefilename);
|
||||
stringdispose(path);
|
||||
stringdispose(modulename);
|
||||
@ -1024,7 +1036,10 @@ unit files;
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.34 1998-08-14 21:56:31 peter
|
||||
Revision 1.35 1998-08-17 09:17:44 peter
|
||||
* static/shared linking updates
|
||||
|
||||
Revision 1.34 1998/08/14 21:56:31 peter
|
||||
* setting the outputfile using -o works now to create static libs
|
||||
|
||||
Revision 1.33 1998/08/11 14:09:08 peter
|
||||
|
@ -46,12 +46,12 @@ Type
|
||||
function FindLibraryFile(s:string;const ext:string) : string;
|
||||
Procedure AddObject(const S : String);
|
||||
Procedure AddStaticLibrary(const S : String);
|
||||
Procedure AddSharedLibrary(const S : String);
|
||||
Procedure AddSharedLibrary(S : String);
|
||||
Function FindLinker:String; { Find linker, sets Name }
|
||||
Function DoExec(const command,para:string;info,useshell:boolean):boolean;
|
||||
Function WriteResponseFile:Boolean;
|
||||
Function MakeExecutable:boolean;
|
||||
Procedure MakeStaticLibrary(const path:string;filescnt:longint);
|
||||
Procedure MakeStaticLibrary(filescnt:longint);
|
||||
Procedure MakeSharedLibrary;
|
||||
end;
|
||||
PLinker=^TLinker;
|
||||
@ -191,8 +191,17 @@ begin
|
||||
end;
|
||||
|
||||
|
||||
Procedure TLinker.AddSharedLibrary(const S:String);
|
||||
Procedure TLinker.AddSharedLibrary(S:String);
|
||||
begin
|
||||
{ remove prefix 'lib' }
|
||||
if Copy(s,1,length(target_os.libprefix))=target_os.libprefix then
|
||||
Delete(s,1,length(target_os.libprefix));
|
||||
{ remove extension if any }
|
||||
|
||||
if Copy(s,length(s)-length(target_os.sharedlibext)+1,length(target_os.sharedlibext))=target_os.sharedlibext then
|
||||
Delete(s,length(s)-length(target_os.sharedlibext)+1,length(target_os.sharedlibext)+1);
|
||||
{ ready to be inserted }
|
||||
|
||||
SharedLibFiles.Insert (S);
|
||||
end;
|
||||
|
||||
@ -232,7 +241,7 @@ begin
|
||||
if cs_link_extern in aktglobalswitches then
|
||||
begin
|
||||
if info then
|
||||
AsmRes.AddLinkCommand(Command,Para,current_module^.libfilename^)
|
||||
AsmRes.AddLinkCommand(Command,Para,current_module^.exefilename^)
|
||||
else
|
||||
AsmRes.AddLinkCommand(Command,Para,'');
|
||||
end;
|
||||
@ -291,7 +300,7 @@ begin
|
||||
{ Fix command line options }
|
||||
If not SharedLibFiles.Empty then
|
||||
LinkOptions:='-dynamic-linker='+DynamicLinker+' '+LinkOptions;
|
||||
if Strip then
|
||||
if Strip and not(cs_debuginfo in aktmoduleswitches) then
|
||||
LinkOptions:=LinkOptions+target_link.stripopt;
|
||||
|
||||
{ Open linkresponse and write header }
|
||||
@ -376,9 +385,7 @@ function TLinker.MakeExecutable:boolean;
|
||||
var
|
||||
bindbin : string[80];
|
||||
bindfound : boolean;
|
||||
i : longint;
|
||||
s : string;
|
||||
dummy : file;
|
||||
success : boolean;
|
||||
begin
|
||||
{$ifdef linux}
|
||||
@ -419,26 +426,27 @@ begin
|
||||
end;
|
||||
{Remove ReponseFile}
|
||||
if (success) and not(cs_link_extern in aktglobalswitches) then
|
||||
begin
|
||||
assign(dummy,LinkResName);
|
||||
{$I-}
|
||||
erase(dummy);
|
||||
{$I+}
|
||||
i:=ioresult;
|
||||
end;
|
||||
RemoveFile(LinkResName);
|
||||
MakeExecutable:=success; { otherwise a recursive call to link method }
|
||||
end;
|
||||
|
||||
|
||||
Procedure TLinker.MakeStaticLibrary(const path:string;filescnt:longint);
|
||||
Procedure TLinker.MakeStaticLibrary(filescnt:longint);
|
||||
{
|
||||
FilesCnt holds the amount of .o files created, if filescnt=0 then
|
||||
no smartlinking is used
|
||||
}
|
||||
var
|
||||
smartpath,
|
||||
s,
|
||||
arbin : string;
|
||||
arfound : boolean;
|
||||
cnt : longint;
|
||||
i : word;
|
||||
f : file;
|
||||
begin
|
||||
smartpath:=current_module^.path^+FixPath(FixFileName(current_module^.modulename^)+target_info.smartext);
|
||||
{ find ar binary }
|
||||
|
||||
arbin:=FindExe(target_ar.arbin,arfound);
|
||||
if (not arfound) and not(cs_link_extern in aktglobalswitches) then
|
||||
begin
|
||||
@ -446,38 +454,51 @@ begin
|
||||
aktglobalswitches:=aktglobalswitches+[cs_link_extern];
|
||||
end;
|
||||
s:=target_ar.arcmd;
|
||||
Replace(s,'$LIB',current_module^.libfilename^);
|
||||
Replace(s,'$FILES',FixPath(path)+current_module^.asmprefix^+'*'+target_info.objext);
|
||||
Replace(s,'$LIB',current_module^.staticlibfilename^);
|
||||
if filescnt=0 then
|
||||
Replace(s,'$FILES',current_module^.objfilename^)
|
||||
else
|
||||
|
||||
Replace(s,'$FILES',smartpath+current_module^.asmprefix^+'*'+target_info.objext);
|
||||
DoExec(arbin,s,false,true);
|
||||
{ Clean up }
|
||||
if not(cs_asm_leave in aktglobalswitches) and not(cs_link_extern in aktglobalswitches) then
|
||||
begin
|
||||
for cnt:=1to filescnt do
|
||||
if filescnt=0 then
|
||||
RemoveFile(current_module^.objfilename^)
|
||||
else
|
||||
begin
|
||||
assign(f,FixPath(path)+current_module^.asmprefix^+tostr(cnt)+target_info.objext);
|
||||
|
||||
for cnt:=1 to filescnt do
|
||||
RemoveFile(smartpath+current_module^.asmprefix^+tostr(cnt)+target_info.objext);
|
||||
{$I-}
|
||||
erase(f);
|
||||
rmdir(smartpath);
|
||||
{$I+}
|
||||
i:=ioresult;
|
||||
end;
|
||||
{$I-}
|
||||
rmdir(path);
|
||||
{$I+}
|
||||
i:=ioresult;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
Procedure TLinker.MakeSharedLibrary;
|
||||
var
|
||||
s : string;
|
||||
begin
|
||||
DoExec(FindLinker,' -shared -o '+current_module^.libfilename^+' link.res',false,false);
|
||||
s:=' -shared -o $LIB $FILES';
|
||||
Replace(s,'$LIB',current_module^.sharedlibfilename^);
|
||||
Replace(s,'$FILES',current_module^.objfilename^);
|
||||
if DoExec(FindLinker,s,false,false) then
|
||||
RemoveFile(current_module^.objfilename^);
|
||||
end;
|
||||
|
||||
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.18 1998-08-14 21:56:34 peter
|
||||
Revision 1.19 1998-08-17 09:17:47 peter
|
||||
* static/shared linking updates
|
||||
|
||||
Revision 1.18 1998/08/14 21:56:34 peter
|
||||
* setting the outputfile using -o works now to create static libs
|
||||
|
||||
Revision 1.17 1998/08/14 18:16:08 peter
|
||||
|
@ -132,9 +132,7 @@ unit parser;
|
||||
oldaktoutputformat : tasm;
|
||||
oldaktoptprocessor : tprocessors;
|
||||
oldaktasmmode : tasmmode;
|
||||
|
||||
label
|
||||
done;
|
||||
|
||||
|
||||
begin
|
||||
inc(compile_level);
|
||||
@ -252,45 +250,21 @@ unit parser;
|
||||
{ reset lexical level }
|
||||
lexlevel:=0;
|
||||
|
||||
{ parse source }
|
||||
{ If the compile level > 1 we get a nice "unit expected" error
|
||||
message if we are trying to use a program as unit.}
|
||||
if (token=_UNIT) or (compile_level>1) then
|
||||
begin
|
||||
current_module^.is_unit:=true;
|
||||
{ If the compile level > 1 we get a nice "unit expected" error
|
||||
message if we are trying to use a program as unit.}
|
||||
proc_unit;
|
||||
if current_module^.compiled then
|
||||
goto done;
|
||||
end
|
||||
else
|
||||
begin
|
||||
proc_program(token=_LIBRARY);
|
||||
end;
|
||||
proc_program(token=_LIBRARY);
|
||||
|
||||
|
||||
if status.errorcount=0 then
|
||||
begin
|
||||
GenerateAsm(filename);
|
||||
|
||||
if (cs_smartlink in aktmoduleswitches) then
|
||||
Linker.MakeStaticLibrary(SmartLinkPath(FileName),SmartLinkFilesCnt);
|
||||
|
||||
{ add the files for the linker from current_module, this must be
|
||||
after the makestaticlibrary, because it will add the library
|
||||
name (PFV) }
|
||||
Linker.AddModuleFiles(current_module);
|
||||
|
||||
{ Check linking => we are at first level in compile }
|
||||
if (compile_level=1) then
|
||||
begin
|
||||
if (cs_link_deffile in aktglobalswitches) then
|
||||
deffile.writefile;
|
||||
if (not current_module^.is_unit) then
|
||||
Linker.MakeExecutable;
|
||||
end;
|
||||
end
|
||||
else
|
||||
if status.errorcount>0 then
|
||||
Message1(unit_f_errors_in_unit,tostr(status.errorcount));
|
||||
done:
|
||||
|
||||
|
||||
{ clear memory }
|
||||
{$ifdef Splitheap}
|
||||
if testsplit then
|
||||
@ -398,7 +372,10 @@ done:
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.36 1998-08-14 21:56:36 peter
|
||||
Revision 1.37 1998-08-17 09:17:49 peter
|
||||
* static/shared linking updates
|
||||
|
||||
Revision 1.36 1998/08/14 21:56:36 peter
|
||||
* setting the outputfile using -o works now to create static libs
|
||||
|
||||
Revision 1.35 1998/08/12 19:22:09 peter
|
||||
|
@ -38,7 +38,7 @@ unit pmodules;
|
||||
uses
|
||||
cobjects,verbose,comphook,systems,globals,
|
||||
symtable,aasm,hcodegen,
|
||||
link,assemble,import
|
||||
link,assemble,import,gendef
|
||||
{$ifndef OLDPPU}
|
||||
,ppu
|
||||
{$endif OLDPPU}
|
||||
@ -50,17 +50,38 @@ unit pmodules;
|
||||
{$endif}
|
||||
,scanner,pbase,psystem,pdecl,psub,parser;
|
||||
|
||||
|
||||
procedure setlinkerfile;
|
||||
procedure create_objectfile;
|
||||
begin
|
||||
{ Add Object File }
|
||||
if (cs_smartlink in aktmoduleswitches) then
|
||||
current_module^.linkstaticlibs.insert(current_module^.libfilename^)
|
||||
{ create the .s file and assemble it }
|
||||
GenerateAsm;
|
||||
|
||||
{ When creating a library call the linker. And insert the output
|
||||
of the linker files }
|
||||
if (cs_create_staticlib in aktmoduleswitches) then
|
||||
Linker.MakeStaticLibrary(SmartLinkFilesCnt)
|
||||
else
|
||||
if (cs_create_sharedlib in aktmoduleswitches) then
|
||||
Linker.MakeSharedLibrary;
|
||||
{ add the files for the linker from current_module }
|
||||
Linker.AddModuleFiles(current_module);
|
||||
end;
|
||||
|
||||
|
||||
procedure insertobjectfile;
|
||||
{ Insert the used object file for this unit in the used list for this unit }
|
||||
begin
|
||||
if (cs_create_staticlib in aktmoduleswitches) then
|
||||
current_module^.linkstaticlibs.insert(current_module^.staticlibfilename^)
|
||||
else
|
||||
if (cs_create_sharedlib in aktmoduleswitches) then
|
||||
current_module^.linksharedlibs.insert(current_module^.sharedlibfilename^)
|
||||
else
|
||||
current_module^.linkofiles.insert(current_module^.objfilename^);
|
||||
end;
|
||||
|
||||
|
||||
|
||||
|
||||
procedure insertsegment;
|
||||
|
||||
procedure fixseg(p:paasmoutput;sec:tsection);
|
||||
@ -89,6 +110,7 @@ unit pmodules;
|
||||
fixseg(consts,sec_data);
|
||||
end;
|
||||
|
||||
|
||||
procedure insertheap;
|
||||
begin
|
||||
if (cs_smartlink in aktmoduleswitches) then
|
||||
@ -265,7 +287,7 @@ unit pmodules;
|
||||
begin
|
||||
{ only reassemble ? }
|
||||
if (current_module^.do_assemble) then
|
||||
OnlyAsm(current_module^.asmfilename^);
|
||||
OnlyAsm;
|
||||
{ add the files for the linker }
|
||||
Linker.AddModuleFiles(current_module);
|
||||
end;
|
||||
@ -814,16 +836,7 @@ unit pmodules;
|
||||
|
||||
{ a unit compiled at command line must be inside the loaded_unit list }
|
||||
if (compile_level=1) then
|
||||
begin
|
||||
loaded_units.insert(current_module);
|
||||
if cs_createlib in initmoduleswitches then
|
||||
begin
|
||||
current_module^.flags:=current_module^.flags or uf_in_library;
|
||||
if cs_shared_lib in initmoduleswitches then
|
||||
current_module^.flags:=current_module^.flags or uf_shared_library;
|
||||
end;
|
||||
end;
|
||||
|
||||
loaded_units.insert(current_module);
|
||||
|
||||
{ insert qualifier for the system unit (allows system.writeln) }
|
||||
if not(cs_compilesystem in aktmoduleswitches) then
|
||||
@ -971,9 +984,6 @@ unit pmodules;
|
||||
{$endif dummy}
|
||||
consume(POINT);
|
||||
|
||||
{ add files which need to be linked }
|
||||
setlinkerfile;
|
||||
|
||||
{ size of the static data }
|
||||
datasize:=symtablestack^.datasize;
|
||||
|
||||
@ -983,12 +993,12 @@ unit pmodules;
|
||||
{$ifdef GDB}
|
||||
{ add all used definitions even for implementation}
|
||||
if (cs_debuginfo in aktmoduleswitches) then
|
||||
begin
|
||||
{ all types }
|
||||
punitsymtable(symtablestack)^.concattypestabto(debuglist);
|
||||
{ and all local symbols}
|
||||
symtablestack^.concatstabto(debuglist);
|
||||
end;
|
||||
begin
|
||||
{ all types }
|
||||
punitsymtable(symtablestack)^.concattypestabto(debuglist);
|
||||
{ and all local symbols}
|
||||
symtablestack^.concatstabto(debuglist);
|
||||
end;
|
||||
{$endif GDB}
|
||||
|
||||
current_module^.in_implementation:=false;
|
||||
@ -1001,6 +1011,10 @@ unit pmodules;
|
||||
symtablestack^.symtabletype:=unitsymtable;
|
||||
punitsymtable(symtablestack)^.is_stab_written:=false;
|
||||
|
||||
{ insert own objectfile }
|
||||
insertobjectfile;
|
||||
|
||||
|
||||
{Write out the unit if the compile was succesfull.}
|
||||
if status.errorcount=0 then
|
||||
writeunitas(current_module^.ppufilename^,punitsymtable(symtablestack));
|
||||
@ -1013,12 +1027,21 @@ unit pmodules;
|
||||
end;
|
||||
inc(datasize,symtablestack^.datasize);
|
||||
|
||||
{ leave when we got an error }
|
||||
if status.errorcount>0 then
|
||||
exit;
|
||||
|
||||
|
||||
{ generate imports }
|
||||
if current_module^.uses_imports then
|
||||
importlib^.generatelib;
|
||||
|
||||
{ finish asmlist by adding segment starts }
|
||||
insertsegment;
|
||||
|
||||
|
||||
{ assemble }
|
||||
create_objectfile;
|
||||
end;
|
||||
|
||||
|
||||
@ -1122,7 +1145,10 @@ unit pmodules;
|
||||
|
||||
consume(POINT);
|
||||
|
||||
setlinkerfile;
|
||||
{ leave when we got an error }
|
||||
if status.errorcount>0 then
|
||||
exit;
|
||||
|
||||
|
||||
{ insert heap }
|
||||
insertheap;
|
||||
@ -1137,12 +1163,32 @@ unit pmodules;
|
||||
|
||||
{ finish asmlist by adding segment starts }
|
||||
insertsegment;
|
||||
|
||||
{ insert own objectfile }
|
||||
insertobjectfile;
|
||||
|
||||
|
||||
{ assemble and link }
|
||||
create_objectfile;
|
||||
|
||||
|
||||
{ create the executable when we are at level 1 }
|
||||
if (compile_level=1) then
|
||||
begin
|
||||
if (cs_link_deffile in aktglobalswitches) then
|
||||
deffile.writefile;
|
||||
if (not current_module^.is_unit) then
|
||||
Linker.MakeExecutable;
|
||||
end;
|
||||
end;
|
||||
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.39 1998-08-14 21:56:37 peter
|
||||
Revision 1.40 1998-08-17 09:17:50 peter
|
||||
* static/shared linking updates
|
||||
|
||||
Revision 1.39 1998/08/14 21:56:37 peter
|
||||
* setting the outputfile using -o works now to create static libs
|
||||
|
||||
Revision 1.38 1998/08/10 14:50:13 peter
|
||||
|
@ -88,14 +88,16 @@ const
|
||||
ibwidestringdef = 56;
|
||||
|
||||
{ unit flags }
|
||||
uf_init = $1;
|
||||
uf_has_dbx = $2;
|
||||
uf_has_browser = $4;
|
||||
uf_big_endian = $8;
|
||||
uf_in_library = $10;
|
||||
uf_shared_library = $20;
|
||||
uf_smartlink = $40;
|
||||
uf_finalize = $80;
|
||||
uf_init = $1;
|
||||
uf_finalize = $2;
|
||||
uf_big_endian = $4;
|
||||
uf_has_dbx = $8;
|
||||
uf_has_browser = $10;
|
||||
uf_smartlink = $20;
|
||||
uf_in_library = $40; { is the file in another file than <ppufile>.* ? }
|
||||
uf_static_linked = $80;
|
||||
uf_shared_linked = $100;
|
||||
|
||||
|
||||
type
|
||||
{$ifdef m68k}
|
||||
@ -760,7 +762,10 @@ end;
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.8 1998-08-11 15:31:40 peter
|
||||
Revision 1.9 1998-08-17 09:17:51 peter
|
||||
* static/shared linking updates
|
||||
|
||||
Revision 1.8 1998/08/11 15:31:40 peter
|
||||
* write extended to ppu file
|
||||
* new version 0.99.7
|
||||
|
||||
|
@ -180,12 +180,20 @@
|
||||
{ create unit flags }
|
||||
with Current_Module^ do
|
||||
begin
|
||||
if cs_smartlink in aktmoduleswitches then
|
||||
if cs_create_staticlib in aktmoduleswitches then
|
||||
begin
|
||||
flags:=flags or uf_smartlink;
|
||||
if SplitName(ppufilename^)<>SplitName(libfilename^) then
|
||||
flags:=flags or uf_static_linked;
|
||||
if SplitName(ppufilename^)<>SplitName(staticlibfilename^) then
|
||||
flags:=flags or uf_in_library;
|
||||
end;
|
||||
if cs_create_sharedlib in aktmoduleswitches then
|
||||
begin
|
||||
flags:=flags or uf_shared_linked;
|
||||
if SplitName(ppufilename^)<>SplitName(sharedlibfilename^) then
|
||||
flags:=flags or uf_in_library;
|
||||
end;
|
||||
if cs_smartlink in aktmoduleswitches then
|
||||
flags:=flags or uf_smartlink;
|
||||
if use_dbx then
|
||||
flags:=flags or uf_has_dbx;
|
||||
if target_os.endian=en_big_endian then
|
||||
@ -315,7 +323,7 @@
|
||||
procedure readsourcefiles;
|
||||
var
|
||||
temp,hs : string;
|
||||
incfile_found : boolean;
|
||||
{ incfile_found : boolean; }
|
||||
ppufiletime,
|
||||
source_time : longint;
|
||||
{$ifdef UseBrowser}
|
||||
@ -344,18 +352,23 @@
|
||||
begin
|
||||
{ check the date of the source files }
|
||||
Source_Time:=GetNamedFileTime(current_module^.path^+hs);
|
||||
if Source_Time=-1 then
|
||||
{ search for include files in the includepathlist, this
|
||||
can't be done, becuase a .inc file with the same name as
|
||||
used by a unit will cause the unit to recompile which is
|
||||
not the intention (PFV) }
|
||||
{ if Source_Time=-1 then
|
||||
begin
|
||||
{ search for include files in the includepathlist }
|
||||
temp:=search(hs,includesearchpath,incfile_found);
|
||||
if incfile_found then
|
||||
begin
|
||||
hs:=temp+hs;
|
||||
Source_Time:=GetNamedFileTime(hs);
|
||||
end;
|
||||
|
||||
end
|
||||
else
|
||||
hs:=current_module^.path^+hs;
|
||||
|
||||
else }
|
||||
hs:=current_module^.path^+hs;
|
||||
if Source_Time=-1 then
|
||||
begin
|
||||
current_module^.sources_avail:=false;
|
||||
@ -697,7 +710,10 @@
|
||||
|
||||
{
|
||||
$Log$
|
||||
Revision 1.11 1998-08-16 20:32:49 peter
|
||||
Revision 1.12 1998-08-17 09:17:53 peter
|
||||
* static/shared linking updates
|
||||
|
||||
Revision 1.11 1998/08/16 20:32:49 peter
|
||||
* crcs of used units are not important for the current crc, reduces the
|
||||
amount of recompiles
|
||||
|
||||
|
@ -99,7 +99,6 @@ unit systems;
|
||||
);
|
||||
|
||||
|
||||
|
||||
tosinfo = record
|
||||
name : string[30];
|
||||
sharedlibext,
|
||||
@ -108,6 +107,7 @@ unit systems;
|
||||
pasext,
|
||||
exeext,
|
||||
scriptext : string[4];
|
||||
libprefix : string[3];
|
||||
Cprefix : string[2];
|
||||
newline : string[2];
|
||||
endian : tendian;
|
||||
@ -205,6 +205,7 @@ implementation
|
||||
pasext : '.PAS';
|
||||
exeext : ''; { No .exe, the linker only output a.out ! }
|
||||
scriptext : '.BAT';
|
||||
libprefix : '';
|
||||
Cprefix : '_';
|
||||
newline : #13#10;
|
||||
endian : endian_little;
|
||||
@ -218,6 +219,7 @@ implementation
|
||||
pasext : '.PAS';
|
||||
exeext : '.EXE';
|
||||
scriptext : '.BAT';
|
||||
libprefix : '';
|
||||
Cprefix : '_';
|
||||
newline : #13#10;
|
||||
endian : endian_little;
|
||||
@ -231,6 +233,7 @@ implementation
|
||||
pasext : '.pas';
|
||||
exeext : '';
|
||||
scriptext : '.sh';
|
||||
libprefix : 'lib';
|
||||
Cprefix : '';
|
||||
newline : #10;
|
||||
endian : endian_little;
|
||||
@ -244,6 +247,7 @@ implementation
|
||||
pasext : '.pp';
|
||||
exeext : '.exe';
|
||||
scriptext : '.cmd';
|
||||
libprefix : '';
|
||||
Cprefix : '_';
|
||||
newline : #13#10;
|
||||
endian : endian_little;
|
||||
@ -257,6 +261,7 @@ implementation
|
||||
pasext : '.pas';
|
||||
exeext : '.exe';
|
||||
scriptext : '.bat';
|
||||
libprefix : 'lib';
|
||||
Cprefix : '_';
|
||||
newline : #13#10;
|
||||
endian : endian_little;
|
||||
@ -272,6 +277,7 @@ implementation
|
||||
pasext : '.pas';
|
||||
exeext : '';
|
||||
scriptext : '';
|
||||
libprefix : '';
|
||||
Cprefix : '';
|
||||
newline : #10;
|
||||
endian : en_big_endian;
|
||||
@ -285,6 +291,7 @@ implementation
|
||||
pasext : '.pas';
|
||||
exeext : '.tpp';
|
||||
scriptext : '';
|
||||
libprefix : '';
|
||||
Cprefix : '';
|
||||
newline : #10;
|
||||
endian : en_big_endian;
|
||||
@ -298,6 +305,7 @@ implementation
|
||||
pasext : '.pas';
|
||||
exeext : '.tpp';
|
||||
scriptext : '';
|
||||
libprefix : '';
|
||||
Cprefix : '';
|
||||
newline : #13;
|
||||
endian : en_big_endian;
|
||||
@ -311,6 +319,7 @@ implementation
|
||||
pasext : '.pas';
|
||||
exeext : '';
|
||||
scriptext : '.sh';
|
||||
libprefix : 'lib';
|
||||
Cprefix : '';
|
||||
newline : #10;
|
||||
endian : en_big_endian;
|
||||
@ -866,7 +875,10 @@ begin
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.23 1998-06-25 08:48:20 florian
|
||||
Revision 1.24 1998-08-17 09:17:54 peter
|
||||
* static/shared linking updates
|
||||
|
||||
Revision 1.23 1998/06/25 08:48:20 florian
|
||||
* first version of rtti support
|
||||
|
||||
Revision 1.22 1998/06/17 14:10:21 peter
|
||||
|
Loading…
Reference in New Issue
Block a user