Commit e6518ebe authored by Mart Lubbers's avatar Mart Lubbers

Search hierarchically for imported object files

Previously an imported object file:
```
implementation module test.test

import code from "obj.o"
```

Would only search in the roots of the project paths. Now it will als
search in the test/ folder in the root.
parent 790de761
Pipeline #20910 passed with stage
in 58 seconds
......@@ -833,18 +833,18 @@ step intr (DLink ds=:{ok, newpaths, fileinfo, libsinfo, modpaths, abccache, proj
// runtime objects and dynamic libs
# stdl = Concat sys_libs (standardStaticLibraries tp lo.method)
# stdo = Concat sys_objs (standardObjectFiles ao.stack_traces ao.profiling tp use_64_bit_processor)
# (stdoOk,ofiles,abcPathsCache)
# ((stdoOk,ofiles,abcPathsCache), ps)
= case ao.standard_rte of
True -> GetPathNames stdo Nil abcPathsCache
False -> (True,Nil,abcPathsCache)
True -> accFiles (AccTuple4 (GetPathNames (Map (\x->("", x)) stdo) Nil srcpaths abcPathsCache)) ps
False -> ((True,Nil,abcPathsCache), ps)
| not stdoOk
# line = Level3 ["Link error: File: '" +++ (Head ofiles) +++ "' not found."]
# ps = showInfo line ps
= continue False newpaths False fileinfo libsinfo modpaths project intr (abccache, ps)
# (stdlOk,lfiles,abcPathsCache)
# ((stdlOk,lfiles,abcPathsCache), ps)
= case ao.standard_rte of
True -> GetPathNames stdl Nil abcPathsCache
False -> (True,Nil,abcPathsCache)
True -> accFiles (AccTuple4 (GetPathNames (Map (\x->("", x)) stdl) Nil srcpaths abcPathsCache)) ps
False -> ((True,Nil,abcPathsCache), ps)
| not stdlOk
# line = Level3 ["Link error: File: '" +++ (Head lfiles) +++ "' not found."]
# ps = showInfo line ps
......@@ -868,13 +868,14 @@ step intr (DLink ds=:{ok, newpaths, fileinfo, libsinfo, modpaths, abccache, proj
# ofiles = Reverse2 clmodpaths ofiles
// module imported objects and dynamic libs
# abcLinkInfo = PR_GetABCLinkInfo project
# linkObjFileNames = Map (append_object_file_extension_if_dot_at_end tp use_64_bit_processor) abcLinkInfo.linkObjFileNames
# (objPathsOk,ofiles,abcPathsCache)
= GetPathNames linkObjFileNames ofiles abcPathsCache
# (_,ofiles`,abcPathsCache) = GetPathNames /*abcLinkInfo.*/linkObjFileNames ofiles` abcPathsCache
# (libPathsOk,lfiles,abcPathsCache)
= GetPathNames abcLinkInfo.linkLibraryNames lfiles abcPathsCache
# (objs, libs) = PR_GetABCLinkInfo project
# linkObjFileNames = Map (\(d, a)->(d, append_object_file_extension_if_dot_at_end tp use_64_bit_processor a)) objs
# ((objPathsOk,ofiles,abcPathsCache), ps)
= accFiles (AccTuple4 (GetPathNames linkObjFileNames ofiles srcpaths abcPathsCache)) ps
# ((_,ofiles`,abcPathsCache), ps)
= accFiles (AccTuple4 (GetPathNames /*abcLinkInfo.*/linkObjFileNames ofiles` srcpaths abcPathsCache)) ps
# ((libPathsOk,lfiles,abcPathsCache), ps)
= accFiles (AccTuple4 (GetPathNames libs lfiles srcpaths abcPathsCache)) ps
| not objPathsOk
# line = Level3 ["Link error: File: '" +++ (Head ofiles) +++ "' not found."]
# ps = showInfo line ps
......@@ -1597,15 +1598,23 @@ CheckExecOutOfDate gen execpath fileinfo project ps
= (False,ps)
//-- dircache functions
GetPathNames :: !(List String) !(List String) !*DirCache -> (.Bool,List String,!*DirCache)
GetPathNames Nil acc cache
= (True, acc, cache)
GetPathNames (fn:!fns) acc cache
GetPathNames :: !(List (String, String)) !(List String) !(List String) !*DirCache !*Files -> (.Bool,List String,!*DirCache, !*Files)
GetPathNames Nil acc srcpaths cache files
= (True, acc, cache, files)
GetPathNames ((mod, fn):!fns) acc srcpaths cache files
# (ok,pn,_,cache) = DC_Search fn cache
| ok
= GetPathNames fns (pn +++ DirSeparatorString +++ fn :! acc) cache
= (False, (fn :! Nil), cache)
= GetPathNames fns (pn +++ DirSeparatorString +++ fn :! acc) srcpaths cache files
# ((ok, pn), files) = FindHModule (dropLastComponent mod (size mod - 2)) ("/Clean System Files/" +++ fn) srcpaths files
| ok
= GetPathNames fns (pn :! acc) srcpaths cache files
= (False, (fn :! Nil), cache, files)
where
dropLastComponent :: !String !Int -> !String
dropLastComponent s 0 = s
dropLastComponent s i
| s.[i] == '.' = s % (0, i-1)
= dropLastComponent s (i - 1)
// Lookup Module Paths in Directory Cache
LookupModulePaths :: !(List .String) !*DirCache !*Files -> (Bool,.[!ModuleDirAndName],*DirCache,!*Files);
......
......@@ -96,7 +96,8 @@ PR_GetLinkOptions :: !Project -> LinkOptions
PR_AddABCInfo :: !ModuleDirAndName !(List LinkObjFileName) !(List LinkLibraryName) !CompilerOptions !Project -> Project
PR_GetABCLinkInfo :: !Project -> ABCLinkInfo
// Retrieves the import object files and libraries together with their modules
PR_GetABCLinkInfo :: !Project -> (!(List (Modulename, LinkObjFileName)), !(List (Modulename, LinkLibraryName)))
PR_GetStaticLibsInfo :: !Project -> StaticLibInfo
PR_SetStaticLibsInfo :: !StaticLibInfo !Project -> Project
......
......@@ -745,18 +745,14 @@ SubstitutePaths applicationDir projectDir list
SubstitutePath applicationDir projectDir path
:== symPath applicationDir projectDir path
PR_GetABCLinkInfo :: !Project -> ABCLinkInfo;
PR_GetABCLinkInfo :: !Project -> (!(List (Modulename, LinkObjFileName)), !(List (Modulename, LinkLibraryName)))
PR_GetABCLinkInfo project=:{inflist}
# allLinkInfoRecords = map (\{InfListItem | info={abcLinkInfo}} -> abcLinkInfo) (StrictListToList inflist);
oneLinkInfoRecord = foldl mergeTwoRecords emptyRecord allLinkInfoRecords;
= oneLinkInfoRecord;
# allLinkInfoRecords = map toRecord (StrictListToList inflist);
= foldl mergeTwoRecords emptyRecord allLinkInfoRecords;
where
mergeTwoRecords { linkObjFileNames=linkObjFileNames1, linkLibraryNames=linkLibraryNames1}
{ linkObjFileNames=linkObjFileNames2, linkLibraryNames=linkLibraryNames2}
= { linkObjFileNames = UnionStringList linkObjFileNames2 linkObjFileNames1,
linkLibraryNames = UnionStringList linkLibraryNames2 linkLibraryNames1};
emptyRecord
= { linkObjFileNames = Nil, linkLibraryNames = Nil};
toRecord {InfListItem | mn,info={abcLinkInfo}} = (Map (\x->(mn, x)) abcLinkInfo.linkObjFileNames ,Map (\x->(mn, x)) abcLinkInfo.linkLibraryNames)
mergeTwoRecords (objs, libs) (cobjs, clibs) = (UnionList objs cobjs, UnionList libs clibs)
emptyRecord = (Nil, Nil);
PR_GetStaticLibsInfo :: !Project -> StaticLibInfo
PR_GetStaticLibsInfo {Project | staticLibInfo} = staticLibInfo
......
......@@ -35,6 +35,7 @@ RemoveStringFromList :: !String !(List String) -> List String
RemoveMember :: a !u:(List a) -> v:List a | == a, [u <= v]
RemoveMembers :: !u:(List a) !.(List a) -> v:List a | == a, [u <= v]
UnionStringList :: !(List String) !(List String) -> List String
UnionList :: !(List a) !(List a) -> List a | Ord a
StringOccurs :: !String !.(List String) -> Bool
SortStrings :: !.(List String) -> .List String
EQStrings :: !(List String) !(List String) -> Bool
......
......@@ -131,6 +131,14 @@ UnionStringList xl=:(x:!xs) yl=:(y:!ys)
| x > y = y :! UnionStringList xl ys;
= x :! UnionStringList xs ys;
UnionList :: !(List a) !( List a) -> (List a) | Ord a;
UnionList Nil ys = ys;
UnionList xs Nil = xs;
UnionList xl=:(x:!xs) yl=:(y:!ys)
| x < y = x :! UnionList xs yl;
| x > y = y :! UnionList xl ys;
= x :! UnionList xs ys;
StringOccurs :: !String !.(List String) -> Bool;
StringOccurs s Nil = False;
StringOccurs s (x:!xs) | x == s = True;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment