Skip to content

Commit

Permalink
Introduce a getrelative toolset function to allow customization.
Browse files Browse the repository at this point in the history
This just centralizes all `getrelative`, allowing for customization by
external code, by overriding this function.

This is needed for instance in Ninja generators, where the location of a
project is not the workspace location, but the code of the Ninja file
itself should still refer to workspace-relative paths.
  • Loading branch information
tritao committed Sep 16, 2024
1 parent db072b4 commit 6d817ad
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 16 deletions.
13 changes: 12 additions & 1 deletion src/tools/dotnet.lua
Original file line number Diff line number Diff line change
Expand Up @@ -255,6 +255,17 @@
end


--
-- Returns the relative path to passed value for the given project.
-- This can be overriden by actions to allow for more customized relative
-- path behaviors.
--

function dotnet.getrelative(cfg, value)
return project.getrelative(cfg.project, value)
end



--
-- Returns a list of compiler flags, based on the supplied configuration.
Expand Down Expand Up @@ -286,7 +297,7 @@
table.insert(flags, '/noconfig')

if cfg.project.icon then
local fn = project.getrelative(cfg.project, cfg.project.icon)
local fn = dotnet.getrelative(cfg.project, cfg.project.icon)
table.insert(flags, string.format('/win32icon:"%s"', fn))
end

Expand Down
29 changes: 19 additions & 10 deletions src/tools/gcc.lua
Original file line number Diff line number Diff line change
Expand Up @@ -274,6 +274,15 @@
return result
end

--
-- Returns the relative path to passed value for the given project.
-- This can be overriden by actions to allow for more customized relative
-- path behaviors.
--

function gcc.getrelative(cfg, value)
return project.getrelative(cfg.project, value)
end

--
-- Returns a list of forced include files, decorated for the compiler
Expand All @@ -289,7 +298,7 @@
local result = {}

table.foreachi(cfg.forceincludes, function(value)
local fn = project.getrelative(cfg.project, value)
local fn = gcc.getrelative(cfg.project, value)
table.insert(result, string.format('-include %s', p.quoted(fn)))
end)

Expand Down Expand Up @@ -322,24 +331,24 @@
function gcc.getincludedirs(cfg, dirs, extdirs, frameworkdirs, includedirsafter)
local result = {}
for _, dir in ipairs(dirs) do
dir = project.getrelative(cfg.project, dir)
dir = gcc.getrelative(cfg.project, dir)
table.insert(result, '-I' .. p.quoted(dir))
end

if table.contains(os.getSystemTags(cfg.system), "darwin") then
for _, dir in ipairs(frameworkdirs or {}) do
dir = project.getrelative(cfg.project, dir)
dir = gcc.getrelative(cfg.project, dir)
table.insert(result, '-F' .. p.quoted(dir))
end
end

for _, dir in ipairs(extdirs or {}) do
dir = project.getrelative(cfg.project, dir)
dir = gcc.getrelative(cfg.project, dir)
table.insert(result, '-isystem ' .. p.quoted(dir))
end

for _, dir in ipairs(includedirsafter or {}) do
dir = project.getrelative(cfg.project, dir)
dir = gcc.getrelative(cfg.project, dir)
table.insert(result, '-idirafter ' .. p.quoted(dir))
end

Expand Down Expand Up @@ -370,18 +379,18 @@
-- test locally in the project folder first (this is the most likely location)
local testname = path.join(cfg.project.basedir, pch)
if os.isfile(testname) then
return project.getrelative(cfg.project, testname)
return gcc.getrelative(cfg.project, testname)
else
-- else scan in all include dirs.
for _, incdir in ipairs(cfg.includedirs) do
testname = path.join(incdir, pch)
if os.isfile(testname) then
return project.getrelative(cfg.project, testname)
return gcc.getrelative(cfg.project, testname)
end
end
end

return project.getrelative(cfg.project, path.getabsolute(pch))
return gcc.getrelative(cfg.project, path.getabsolute(pch))
end

--
Expand Down Expand Up @@ -535,14 +544,14 @@

if table.contains(os.getSystemTags(cfg.system), "darwin") then
for _, dir in ipairs(cfg.frameworkdirs) do
dir = project.getrelative(cfg.project, dir)
dir = gcc.getrelative(cfg.project, dir)
table.insert(flags, '-F' .. p.quoted(dir))
end
end

if cfg.flags.RelativeLinks then
for _, dir in ipairs(config.getlinks(cfg, "siblings", "directory")) do
local libFlag = "-L" .. p.project.getrelative(cfg.project, dir)
local libFlag = "-L" .. gcc.getrelative(cfg.project, dir)
if not table.contains(flags, libFlag) then
table.insert(flags, libFlag)
end
Expand Down
21 changes: 16 additions & 5 deletions src/tools/msc.lua
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,17 @@
end


--
-- Returns the relative path to passed value for the given project.
-- This can be overriden by actions to allow for more customized relative
-- path behaviors.
--

function msc.getrelative(cfg, value)
return project.getrelative(cfg.project, value)
end


--
-- Returns a list of forced include files, decorated for the compiler
-- command line.
Expand All @@ -280,7 +291,7 @@
local result = {}

table.foreachi(cfg.forceincludes, function(value)
local fn = project.getrelative(cfg.project, value)
local fn = msc.getrelative(cfg.project, value)
table.insert(result, "/FI" .. p.quoted(fn))
end)

Expand All @@ -298,12 +309,12 @@
function msc.getincludedirs(cfg, dirs, extdirs, frameworkdirs, includedirsafter)
local result = {}
for _, dir in ipairs(dirs) do
dir = project.getrelative(cfg.project, dir)
dir = msc.getrelative(cfg.project, dir)
table.insert(result, '-I' .. p.quoted(dir))
end

for _, dir in ipairs(extdirs or {}) do
dir = project.getrelative(cfg.project, dir)
dir = msc.getrelative(cfg.project, dir)
if isVersionGreaterOrEqualTo(cfg.toolset, "msc-v142") then
table.insert(result, '/external:I' .. p.quoted(dir))
else
Expand All @@ -312,7 +323,7 @@
end

for _, dir in ipairs(includedirsafter or {}) do
dir = project.getrelative(cfg.project, dir)
dir = msc.getrelative(cfg.project, dir)
if isVersionGreaterOrEqualTo(cfg.toolset, "msc-v142") then
table.insert(result, '/external:I' .. p.quoted(dir))
else
Expand Down Expand Up @@ -394,7 +405,7 @@
local flags = {}
local dirs = table.join(cfg.libdirs, cfg.syslibdirs)
for i, dir in ipairs(dirs) do
dir = project.getrelative(cfg.project, dir)
dir = msc.getrelative(cfg.project, dir)
table.insert(flags, '/LIBPATH:"' .. dir .. '"')
end
return flags
Expand Down

0 comments on commit 6d817ad

Please sign in to comment.