+ support for {$linkframework x} to link to framework x (Darwin only)

+ support for {$frameworkpath x} and -Ffx to add x to the directories to
    search for frameworks (Darwin only)

git-svn-id: trunk@8165 -
This commit is contained in:
Jonas Maebe 2007-07-25 15:42:30 +00:00
parent bedf0151cc
commit a3c9dc5ec6
12 changed files with 517 additions and 385 deletions

2
.gitattributes vendored
View File

@ -6852,6 +6852,8 @@ tests/test/tfpu3.pp svneol=native#text/plain
tests/test/tfpu4.pp svneol=native#text/plain tests/test/tfpu4.pp svneol=native#text/plain
tests/test/tfpu5.pp svneol=native#text/plain tests/test/tfpu5.pp svneol=native#text/plain
tests/test/tfpuover.pp svneol=native#text/plain tests/test/tfpuover.pp svneol=native#text/plain
tests/test/tfwork1.pp svneol=native#text/plain
tests/test/tfwork2.pp svneol=native#text/plain
tests/test/tgeneric1.pp svneol=native#text/plain tests/test/tgeneric1.pp svneol=native#text/plain
tests/test/tgeneric10.pp svneol=native#text/plain tests/test/tgeneric10.pp svneol=native#text/plain
tests/test/tgeneric11.pp svneol=native#text/plain tests/test/tgeneric11.pp svneol=native#text/plain

View File

@ -142,7 +142,8 @@ interface
linkunitsharedlibs, linkunitsharedlibs,
linkotherofiles, { objects,libs loaded from the source } linkotherofiles, { objects,libs loaded from the source }
linkothersharedlibs, { using $L or $LINKLIB or import lib (for linux) } linkothersharedlibs, { using $L or $LINKLIB or import lib (for linux) }
linkotherstaticlibs : tlinkcontainer; linkotherstaticlibs,
linkotherframeworks : tlinkcontainer;
used_units : tlinkedlist; used_units : tlinkedlist;
dependent_units : tlinkedlist; dependent_units : tlinkedlist;
@ -150,7 +151,8 @@ interface
localunitsearchpath, { local searchpaths } localunitsearchpath, { local searchpaths }
localobjectsearchpath, localobjectsearchpath,
localincludesearchpath, localincludesearchpath,
locallibrarysearchpath : TSearchPathList; locallibrarysearchpath,
localframeworksearchpath : TSearchPathList;
{create creates a new module which name is stored in 's'. LoadedFrom {create creates a new module which name is stored in 's'. LoadedFrom
points to the module calling it. It is nil for the first compiled points to the module calling it. It is nil for the first compiled
@ -433,6 +435,7 @@ implementation
localobjectsearchpath:=TSearchPathList.Create; localobjectsearchpath:=TSearchPathList.Create;
localincludesearchpath:=TSearchPathList.Create; localincludesearchpath:=TSearchPathList.Create;
locallibrarysearchpath:=TSearchPathList.Create; locallibrarysearchpath:=TSearchPathList.Create;
localframeworksearchpath:=TSearchPathList.Create;
used_units:=TLinkedList.Create; used_units:=TLinkedList.Create;
dependent_units:=TLinkedList.Create; dependent_units:=TLinkedList.Create;
resourcefiles:=TCmdStrList.Create; resourcefiles:=TCmdStrList.Create;
@ -442,6 +445,7 @@ implementation
linkotherofiles:=TLinkContainer.Create; linkotherofiles:=TLinkContainer.Create;
linkotherstaticlibs:=TLinkContainer.Create; linkotherstaticlibs:=TLinkContainer.Create;
linkothersharedlibs:=TLinkContainer.Create; linkothersharedlibs:=TLinkContainer.Create;
linkotherframeworks:=TLinkContainer.Create;
FImportLibraryList:=TFPHashObjectList.Create(true); FImportLibraryList:=TFPHashObjectList.Create(true);
crc:=0; crc:=0;
interface_crc:=0; interface_crc:=0;
@ -533,6 +537,7 @@ implementation
linkotherofiles.Free; linkotherofiles.Free;
linkotherstaticlibs.Free; linkotherstaticlibs.Free;
linkothersharedlibs.Free; linkothersharedlibs.Free;
linkotherframeworks.Free;
FImportLibraryList.Free; FImportLibraryList.Free;
stringdispose(objfilename); stringdispose(objfilename);
stringdispose(asmfilename); stringdispose(asmfilename);
@ -550,6 +555,7 @@ implementation
localobjectsearchpath.free; localobjectsearchpath.free;
localincludesearchpath.free; localincludesearchpath.free;
locallibrarysearchpath.free; locallibrarysearchpath.free;
localframeworksearchpath.free;
{$ifdef MEMDEBUG} {$ifdef MEMDEBUG}
memsymtable.start; memsymtable.start;
{$endif} {$endif}
@ -672,6 +678,8 @@ implementation
linkotherstaticlibs:=TLinkContainer.Create; linkotherstaticlibs:=TLinkContainer.Create;
linkothersharedlibs.Free; linkothersharedlibs.Free;
linkothersharedlibs:=TLinkContainer.Create; linkothersharedlibs:=TLinkContainer.Create;
linkotherframeworks.Free;
linkotherframeworks:=TLinkContainer.Create;
FImportLibraryList.Free; FImportLibraryList.Free;
FImportLibraryList:=TFPHashObjectList.Create; FImportLibraryList:=TFPHashObjectList.Create;
do_compile:=false; do_compile:=false;

View File

@ -199,7 +199,8 @@ interface
librarysearchpath, librarysearchpath,
unitsearchpath, unitsearchpath,
objectsearchpath, objectsearchpath,
includesearchpath : TSearchPathList; includesearchpath,
frameworksearchpath : TSearchPathList;
autoloadunits : string; autoloadunits : string;
{ linking } { linking }
@ -1064,6 +1065,7 @@ implementation
unitsearchpath.Free; unitsearchpath.Free;
objectsearchpath.Free; objectsearchpath.Free;
includesearchpath.Free; includesearchpath.Free;
frameworksearchpath.Free;
LinkLibraryAliases.Free; LinkLibraryAliases.Free;
LinkLibraryOrder.Free; LinkLibraryOrder.Free;
end; end;
@ -1102,6 +1104,7 @@ implementation
unitsearchpath:=TSearchPathList.Create; unitsearchpath:=TSearchPathList.Create;
includesearchpath:=TSearchPathList.Create; includesearchpath:=TSearchPathList.Create;
objectsearchpath:=TSearchPathList.Create; objectsearchpath:=TSearchPathList.Create;
frameworksearchpath:=TSearchPathList.Create;
{ Def file } { Def file }
usewindowapi:=false; usewindowapi:=false;

View File

@ -51,7 +51,8 @@ interface
SysInitUnit : string[20]; SysInitUnit : string[20];
ObjectFiles, ObjectFiles,
SharedLibFiles, SharedLibFiles,
StaticLibFiles : TCmdStrList; StaticLibFiles,
FrameworkFiles : TCmdStrList;
Constructor Create;virtual; Constructor Create;virtual;
Destructor Destroy;override; Destructor Destroy;override;
procedure AddModuleFiles(hp:tmodule); procedure AddModuleFiles(hp:tmodule);
@ -60,6 +61,7 @@ interface
Procedure AddSharedLibrary(S : TCmdStr); Procedure AddSharedLibrary(S : TCmdStr);
Procedure AddStaticCLibrary(const S : TCmdStr); Procedure AddStaticCLibrary(const S : TCmdStr);
Procedure AddSharedCLibrary(S : TCmdStr); Procedure AddSharedCLibrary(S : TCmdStr);
Procedure AddFramework(S : TCmdStr);
procedure AddImportSymbol(const libname,symname:TCmdStr;OrdNr: longint;isvar:boolean);virtual; procedure AddImportSymbol(const libname,symname:TCmdStr;OrdNr: longint;isvar:boolean);virtual;
Procedure InitSysInitUnitName;virtual; Procedure InitSysInitUnitName;virtual;
Function MakeExecutable:boolean;virtual; Function MakeExecutable:boolean;virtual;
@ -290,6 +292,7 @@ Implementation
ObjectFiles:=TCmdStrList.Create_no_double; ObjectFiles:=TCmdStrList.Create_no_double;
SharedLibFiles:=TCmdStrList.Create_no_double; SharedLibFiles:=TCmdStrList.Create_no_double;
StaticLibFiles:=TCmdStrList.Create_no_double; StaticLibFiles:=TCmdStrList.Create_no_double;
FrameworkFiles:=TCmdStrList.Create_no_double;
end; end;
@ -298,6 +301,7 @@ Implementation
ObjectFiles.Free; ObjectFiles.Free;
SharedLibFiles.Free; SharedLibFiles.Free;
StaticLibFiles.Free; StaticLibFiles.Free;
FrameworkFiles.Free;
end; end;
@ -386,6 +390,8 @@ Implementation
AddStaticCLibrary(linkotherstaticlibs.Getusemask(mask)); AddStaticCLibrary(linkotherstaticlibs.Getusemask(mask));
while not linkothersharedlibs.empty do while not linkothersharedlibs.empty do
AddSharedCLibrary(linkothersharedlibs.Getusemask(mask)); AddSharedCLibrary(linkothersharedlibs.Getusemask(mask));
while not linkotherframeworks.empty do
AddFramework(linkotherframeworks.Getusemask(mask));
{ Known Library/DLL Imports } { Known Library/DLL Imports }
for i:=0 to ImportLibraryList.Count-1 do for i:=0 to ImportLibraryList.Count-1 do
begin begin
@ -455,6 +461,15 @@ Implementation
end; end;
Procedure TLinker.AddFramework(S:TCmdStr);
begin
if s='' then
exit;
{ ready to be added }
FrameworkFiles.Concat(S);
end;
Procedure TLinker.AddStaticCLibrary(const S:TCmdStr); Procedure TLinker.AddStaticCLibrary(const S:TCmdStr);
var var
ns : TCmdStr; ns : TCmdStr;

View File

@ -125,7 +125,7 @@ general_i_number_of_notes=01023_I_$1 note(s) issued
# #
# Scanner # Scanner
# #
# 02063 is the last used one # 02084 is the last used one
# #
% \section{Scanner messages.} % \section{Scanner messages.}
% This section lists the messages that the scanner emits. The scanner takes % This section lists the messages that the scanner emits. The scanner takes
@ -350,6 +350,8 @@ scan_w_pic_ignored=02081_W_PIC directive or switch ignored
% ignored. % ignored.
scan_w_unsupported_switch_by_target=02082_W_The switch "$1" is not supported by the currently selected target scan_w_unsupported_switch_by_target=02082_W_The switch "$1" is not supported by the currently selected target
% Some compiler switches like $E are not supported by all targets. % Some compiler switches like $E are not supported by all targets.
scan_w_frameworks_darwin_only=02084_W_Framework-related options are only supported for Darwin/Mac OS X
% Frameworks are not a known concept, or at least not supported by FPC, on operating systems other than Darwin/Mac OS X.
% \end{description} % \end{description}
# #
# Parser # Parser
@ -2522,6 +2524,7 @@ S*2Aas_assemble using GNU AS
**2FC<x>_sets RC compiler binary name to <x> **2FC<x>_sets RC compiler binary name to <x>
**2FD<x>_sets the directory where to search for compiler utilities **2FD<x>_sets the directory where to search for compiler utilities
**2Fe<x>_redirect error output to <x> **2Fe<x>_redirect error output to <x>
**2Ff<x>_adds <x> to framework path (Darwin only)
**2FE<x>_set exe/unit output path to <x> **2FE<x>_set exe/unit output path to <x>
**2Fi<x>_adds <x> to include path **2Fi<x>_adds <x> to include path
**2Fl<x>_adds <x> to library path **2Fl<x>_adds <x> to library path

View File

@ -103,6 +103,7 @@ const
scan_e_only_packset=02080; scan_e_only_packset=02080;
scan_w_pic_ignored=02081; scan_w_pic_ignored=02081;
scan_w_unsupported_switch_by_target=02082; scan_w_unsupported_switch_by_target=02082;
scan_w_frameworks_darwin_only=02084;
parser_e_syntax_error=03000; parser_e_syntax_error=03000;
parser_e_dont_nest_interrupt=03004; parser_e_dont_nest_interrupt=03004;
parser_w_proc_directive_ignored=03005; parser_w_proc_directive_ignored=03005;
@ -729,9 +730,9 @@ const
option_info=11024; option_info=11024;
option_help_pages=11025; option_help_pages=11025;
MsgTxtSize = 43827; MsgTxtSize = 43950;
MsgIdxMax : array[1..20] of longint=( MsgIdxMax : array[1..20] of longint=(
24,83,237,83,63,49,107,22,135,60, 24,85,237,83,63,49,107,22,135,60,
42,1,1,1,1,1,1,1,1,1 42,1,1,1,1,1,1,1,1,1
); );

File diff suppressed because it is too large Load Diff

View File

@ -40,7 +40,8 @@ Type
ParaIncludePath, ParaIncludePath,
ParaUnitPath, ParaUnitPath,
ParaObjectPath, ParaObjectPath,
ParaLibraryPath : TSearchPathList; ParaLibraryPath,
ParaFrameworkPath : TSearchPathList;
ParaAlignment : TAlignmentInfo; ParaAlignment : TAlignmentInfo;
Constructor Create; Constructor Create;
Destructor Destroy;override; Destructor Destroy;override;
@ -712,6 +713,14 @@ begin
SetRedirectFile(More); SetRedirectFile(More);
'E' : 'E' :
OutputExeDir:=FixPath(More,true); OutputExeDir:=FixPath(More,true);
'f' :
if (target_info.system in systems_darwin) then
if ispara then
ParaFrameworkPath.AddPath(More,false)
else
frameworksearchpath.AddPath(More,true)
else
IllegalPara(opt);
'i' : 'i' :
begin begin
if ispara then if ispara then
@ -1886,6 +1895,7 @@ begin
ParaObjectPath:=TSearchPathList.Create; ParaObjectPath:=TSearchPathList.Create;
ParaUnitPath:=TSearchPathList.Create; ParaUnitPath:=TSearchPathList.Create;
ParaLibraryPath:=TSearchPathList.Create; ParaLibraryPath:=TSearchPathList.Create;
ParaFrameworkPath:=TSearchPathList.Create;
FillChar(ParaAlignment,sizeof(ParaAlignment),0); FillChar(ParaAlignment,sizeof(ParaAlignment),0);
end; end;
@ -1896,6 +1906,7 @@ begin
ParaObjectPath.Free; ParaObjectPath.Free;
ParaUnitPath.Free; ParaUnitPath.Free;
ParaLibraryPath.Free; ParaLibraryPath.Free;
ParaFrameworkPath.Free;
end; end;
@ -2257,6 +2268,7 @@ begin
ObjectSearchPath.AddList(option.ParaObjectPath,true); ObjectSearchPath.AddList(option.ParaObjectPath,true);
IncludeSearchPath.AddList(option.ParaIncludePath,true); IncludeSearchPath.AddList(option.ParaIncludePath,true);
LibrarySearchPath.AddList(option.ParaLibraryPath,true); LibrarySearchPath.AddList(option.ParaLibraryPath,true);
FrameworkSearchPath.AddList(option.ParaFrameworkPath,true);
{ add unit environment and exepath to the unit search path } { add unit environment and exepath to the unit search path }
if inputfilepath<>'' then if inputfilepath<>'' then

View File

@ -389,6 +389,23 @@ implementation
def_system_macro('FPU'+fputypestr[current_settings.fputype]); def_system_macro('FPU'+fputypestr[current_settings.fputype]);
end; end;
procedure dir_frameworkpath;
begin
if not current_module.in_global then
Message(scan_w_switch_is_global)
else if not(target_info.system in systems_darwin) then
begin
Message(scan_w_frameworks_darwin_only);
current_scanner.skipspace;
current_scanner.readcomment
end
else
begin
current_scanner.skipspace;
current_module.localframeworksearchpath.AddPath(current_scanner.readcomment,false);
end;
end;
procedure dir_goto; procedure dir_goto;
begin begin
do_moduleswitch(cs_support_goto); do_moduleswitch(cs_support_goto);
@ -495,6 +512,25 @@ implementation
current_module.linkotherofiles.add(s,link_always); current_module.linkotherofiles.add(s,link_always);
end; end;
procedure dir_linkframework;
var
s : string;
begin
current_scanner.skipspace;
if scanner.c = '''' then
begin
s:= current_scanner.readquotedstring;
current_scanner.readcomment
end
else
s:= trimspace(current_scanner.readcomment);
s:=FixFileName(s);
if (target_info.system in systems_darwin) then
current_module.linkotherframeworks.add(s,link_always)
else
Message(scan_w_frameworks_darwin_only);
end;
procedure dir_linklib; procedure dir_linklib;
type type
tLinkMode=(lm_shared,lm_static); tLinkMode=(lm_shared,lm_static);
@ -1258,6 +1294,7 @@ implementation
AddDirective('EXTERNALSYM',directive_all, @dir_externalsym); AddDirective('EXTERNALSYM',directive_all, @dir_externalsym);
AddDirective('FATAL',directive_all, @dir_fatal); AddDirective('FATAL',directive_all, @dir_fatal);
AddDirective('FPUTYPE',directive_all, @dir_fputype); AddDirective('FPUTYPE',directive_all, @dir_fputype);
AddDirective('FRAMEWORKPATH',directive_all, @dir_frameworkpath);
AddDirective('GOTO',directive_all, @dir_goto); AddDirective('GOTO',directive_all, @dir_goto);
AddDirective('HINT',directive_all, @dir_hint); AddDirective('HINT',directive_all, @dir_hint);
AddDirective('HINTS',directive_all, @dir_hints); AddDirective('HINTS',directive_all, @dir_hints);
@ -1273,6 +1310,7 @@ implementation
AddDirective('LIBEXPORT',directive_mac, @dir_libexport); AddDirective('LIBEXPORT',directive_mac, @dir_libexport);
AddDirective('LIBRARYPATH',directive_all, @dir_librarypath); AddDirective('LIBRARYPATH',directive_all, @dir_librarypath);
AddDirective('LINK',directive_all, @dir_link); AddDirective('LINK',directive_all, @dir_link);
AddDirective('LINKFRAMEWORK',directive_all, @dir_linkframework);
AddDirective('LINKLIB',directive_all, @dir_linklib); AddDirective('LINKLIB',directive_all, @dir_linklib);
AddDirective('LOCALSYMBOLS',directive_all, @dir_localsymbols); AddDirective('LOCALSYMBOLS',directive_all, @dir_localsymbols);
AddDirective('LONGSTRINGS',directive_all, @dir_longstrings); AddDirective('LONGSTRINGS',directive_all, @dir_longstrings);

View File

@ -397,6 +397,22 @@ begin
HPath:=TCmdStrListItem(HPath.Next); HPath:=TCmdStrListItem(HPath.Next);
end; end;
if (target_info.system in systems_darwin) then
begin
HPath:=TCmdStrListItem(current_module.localframeworksearchpath.First);
while assigned(HPath) do
begin
LinkRes.Add(maybequoted('-F'+HPath.Str));
HPath:=TCmdStrListItem(HPath.Next);
end;
HPath:=TCmdStrListItem(FrameworkSearchPath.First);
while assigned(HPath) do
begin
LinkRes.Add(maybequoted('-F'+HPath.Str));
HPath:=TCmdStrListItem(HPath.Next);
end;
end;
if not LdSupportsNoResponseFile then if not LdSupportsNoResponseFile then
LinkRes.Add('INPUT('); LinkRes.Add('INPUT(');
{ add objectfiles, start with prt0 always } { add objectfiles, start with prt0 always }
@ -475,6 +491,12 @@ begin
if not LdSupportsNoResponseFile then if not LdSupportsNoResponseFile then
LinkRes.Add(')'); LinkRes.Add(')');
end; end;
{ frameworks for Darwin }
if IsDarwin then
while not FrameworkFiles.empty do
LinkRes.Add('-framework '+FrameworkFiles.GetFirst);
{ objects which must be at the end } { objects which must be at the end }
if linklibc and if linklibc and
not IsDarwin Then not IsDarwin Then

13
tests/test/tfwork1.pp Normal file
View File

@ -0,0 +1,13 @@
{ %target=darwin }
{ %cpu=i386,powerpc }
{$linkframework Carbon}
type
CFStringRef = pointer;
function CFSTR( c: PChar ): CFStringRef; external name '___CFStringMakeConstantString'; mwpascal;
begin
CFSTR('hello');
end.

16
tests/test/tfwork2.pp Normal file
View File

@ -0,0 +1,16 @@
{ %target=linux,solaris,freebsd,win32 }
{ %fail }
{ %opt=-Sew }
{ just some random non-darwin targets }
{$linkframework Carbon}
type
CFStringRef = pointer;
function CFSTR( c: PChar ): CFStringRef; external name '___CFStringMakeConstantString'; mwpascal;
begin
CFSTR('hello');
end.