Project locations are now inherited from the solution, if set.

This commit is contained in:
Jason Perkins 2013-09-30 10:16:56 -04:00
parent 91635859b9
commit 64c220b70a
13 changed files with 130 additions and 75 deletions

View File

@ -434,7 +434,7 @@
for _, incdir in ipairs(cfg.includedirs) do for _, incdir in ipairs(cfg.includedirs) do
local testname = path.join(incdir, pch) local testname = path.join(incdir, pch)
if os.isfile(testname) then if os.isfile(testname) then
pch = path.getrelative(cfg.location, testname) pch = project.getrelative(cfg.project, testname)
break break
end end
end end

View File

@ -57,9 +57,8 @@
function make.cleanrules(sln) function make.cleanrules(sln)
_p('clean:') _p('clean:')
for prj in solution.eachproject(sln) do for prj in solution.eachproject(sln) do
local slnpath = solution.getlocation(sln)
local prjpath = project.getfilename(prj, make.getmakefilename(prj, true)) local prjpath = project.getfilename(prj, make.getmakefilename(prj, true))
local prjdir = path.getdirectory(path.getrelative(slnpath, prjpath)) local prjdir = path.getdirectory(path.getrelative(sln.location, prjpath))
local prjname = path.getname(prjpath) local prjname = path.getname(prjpath)
_x(1,'@${MAKE} --no-print-directory -C %s -f %s clean', prjdir, prjname) _x(1,'@${MAKE} --no-print-directory -C %s -f %s clean', prjdir, prjname)
end end
@ -121,9 +120,8 @@
_p(1,'@echo "==== Building %s ($(%s_config)) ===="', prj.name, cfgvar) _p(1,'@echo "==== Building %s ($(%s_config)) ===="', prj.name, cfgvar)
local slnpath = solution.getlocation(sln)
local prjpath = project.getfilename(prj, make.getmakefilename(prj, true)) local prjpath = project.getfilename(prj, make.getmakefilename(prj, true))
local prjdir = path.getdirectory(path.getrelative(slnpath, prjpath)) local prjdir = path.getdirectory(path.getrelative(sln.location, prjpath))
local prjname = path.getname(prjpath) local prjname = path.getname(prjpath)
_x(1,'@${MAKE} --no-print-directory -C %s -f %s config=$(%s_config)', prjdir, prjname, cfgvar) _x(1,'@${MAKE} --no-print-directory -C %s -f %s config=$(%s_config)', prjdir, prjname, cfgvar)

View File

@ -306,9 +306,8 @@
local deps = project.getdependencies(prj) local deps = project.getdependencies(prj)
if #deps > 0 then if #deps > 0 then
local prjpath = project.getlocation(prj)
for _, dep in ipairs(deps) do for _, dep in ipairs(deps) do
local relpath = path.getrelative(prjpath, vstudio.projectfile(dep)) local relpath = project.getrelative(prj, vstudio.projectfile(dep))
_x(2,'<ProjectReference Include="%s">', path.translate(relpath)) _x(2,'<ProjectReference Include="%s">', path.translate(relpath))
_p(3,'<Project>{%s}</Project>', dep.uuid) _p(3,'<Project>{%s}</Project>', dep.uuid)
_x(3,'<Name>%s</Name>', dep.name) _x(3,'<Name>%s</Name>', dep.name)

View File

@ -90,9 +90,8 @@
local prj = n.project local prj = n.project
-- Build a relative path from the solution file to the project file -- Build a relative path from the solution file to the project file
local slnpath = premake.solution.getlocation(prj.solution)
local prjpath = vstudio.projectfile(prj) local prjpath = vstudio.projectfile(prj)
prjpath = path.translate(path.getrelative(slnpath, prjpath)) prjpath = path.translate(path.getrelative(prj.solution.location, prjpath))
_x('Project("{%s}") = "%s", "%s", "{%s}"', vstudio.tool(prj), prj.name, prjpath, prj.uuid) _x('Project("{%s}") = "%s", "%s", "{%s}"', vstudio.tool(prj), prj.name, prjpath, prj.uuid)
if _ACTION < "vs2012" then if _ACTION < "vs2012" then

View File

@ -1111,11 +1111,9 @@
-- referencing. Which, in theory, would break if the project is included -- referencing. Which, in theory, would break if the project is included
-- in more than one solution. But that's how they do it. -- in more than one solution. But that's how they do it.
local prjpath = project.getlocation(prj.solution)
for _, dep in ipairs(deps) do for _, dep in ipairs(deps) do
local relpath = path.getrelative(prjpath, vstudio.projectfile(dep)) local relpath = path.getrelative(prj.solution.location, vstudio.projectfile(dep))
-- Visual Studio wants the path to start with ./ or ../ -- Visual Studio wants the path to start with ./ or ../
if not relpath:startswith(".") then if not relpath:startswith(".") then

View File

@ -591,11 +591,9 @@
function vc2010.projectReferences(prj) function vc2010.projectReferences(prj)
local deps = project.getdependencies(prj) local deps = project.getdependencies(prj)
if #deps > 0 then if #deps > 0 then
local prjpath = project.getlocation(prj)
_p(1,'<ItemGroup>') _p(1,'<ItemGroup>')
for _, dep in ipairs(deps) do for _, dep in ipairs(deps) do
local relpath = path.getrelative(prjpath, vstudio.projectfile(dep)) local relpath = project.getrelative(prj, vstudio.projectfile(dep))
_x(2,'<ProjectReference Include=\"%s\">', path.translate(relpath)) _x(2,'<ProjectReference Include=\"%s\">', path.translate(relpath))
_p(3,'<Project>{%s}</Project>', dep.uuid) _p(3,'<Project>{%s}</Project>', dep.uuid)
_p(2,'</ProjectReference>') _p(2,'</ProjectReference>')

View File

@ -22,6 +22,7 @@
cfg.shortname = cfg.shortname:gsub(" ", "_"):lower() cfg.shortname = cfg.shortname:gsub(" ", "_"):lower()
cfg.name = cfg.longname cfg.name = cfg.longname
-- compute build and link targets
if cfg.project and cfg.kind then if cfg.project and cfg.kind then
cfg.buildtarget = config.gettargetinfo(cfg) cfg.buildtarget = config.gettargetinfo(cfg)
cfg.buildtarget.relpath = project.getrelative(cfg.project, cfg.buildtarget.abspath) cfg.buildtarget.relpath = project.getrelative(cfg.project, cfg.buildtarget.abspath)
@ -49,7 +50,7 @@
-- --
local function buildtargetinfo(cfg, kind, field) local function buildtargetinfo(cfg, kind, field)
local basedir = project.getlocation(cfg.project) local basedir = cfg.project.location
local directory = cfg[field.."dir"] or cfg.targetdir or basedir local directory = cfg[field.."dir"] or cfg.targetdir or basedir
local basename = cfg[field.."name"] or cfg.targetname or cfg.project.name local basename = cfg[field.."name"] or cfg.targetname or cfg.project.name

View File

@ -112,7 +112,7 @@
-- (such as the custom build commands) will be made relative to -- (such as the custom build commands) will be made relative to
-- this path, ensuring a portable generated project. -- this path, ensuring a portable generated project.
context.basedir(fsub, project.getlocation(cfg.project)) context.basedir(fsub, cfg.project.location)
setmetatable(fsub, fileconfig.fsub_mt) setmetatable(fsub, fileconfig.fsub_mt)

View File

@ -30,11 +30,8 @@
prj.script = _SCRIPT prj.script = _SCRIPT
prj.blocks = {} prj.blocks = {}
local cwd = os.getcwd()
local cset = configset.new(sln.configset) local cset = configset.new(sln.configset)
cset.basedir = cwd cset.basedir = os.getcwd()
cset.location = cwd
cset.filename = name cset.filename = name
cset.uuid = os.uuid(name) cset.uuid = os.uuid(name)
prj.configset = cset prj.configset = cset
@ -122,7 +119,8 @@
-- location. Any path tokens which are expanded in non-path fields -- location. Any path tokens which are expanded in non-path fields
-- are made relative to this, ensuring a portable generated project. -- are made relative to this, ensuring a portable generated project.
context.basedir(ctx, project.getlocation(ctx)) ctx.location = ctx.location or sln.location or prj.basedir
context.basedir(ctx, ctx.location)
-- This bit could use some work: create a canonical set of configurations -- This bit could use some work: create a canonical set of configurations
-- for the project, along with a mapping from the solution's configurations. -- for the project, along with a mapping from the solution's configurations.
@ -391,7 +389,7 @@
ctx.buildcfg = buildcfg ctx.buildcfg = buildcfg
ctx.platform = platform ctx.platform = platform
ctx.action = _ACTION ctx.action = _ACTION
ctx.language = prj.language ctx.language = ctx.language
-- Allow the configuration information to accessed by tokens contained -- Allow the configuration information to accessed by tokens contained
-- within the configuration itself -- within the configuration itself
@ -419,14 +417,15 @@
context.addterms(ctx, ctx.kind) context.addterms(ctx, ctx.kind)
context.compile(ctx) context.compile(ctx)
context.basedir(ctx, project.getlocation(prj))
ctx.location = ctx.location or prj.location
context.basedir(ctx, ctx.location)
-- Fill in a few calculated for the configuration, including the long -- Fill in a few calculated for the configuration, including the long
-- and short names and the build and link target. -- and short names and the build and link target.
-- TODO: Merge these two functions -- TODO: Merge these two functions
premake.config.bake(ctx) premake.config.bake(ctx)
return ctx return ctx
end end
@ -612,7 +611,7 @@
-- --
function project.getfilename(prj, ext) function project.getfilename(prj, ext)
local fn = project.getlocation(prj) local fn = prj.location
if ext and not ext:startswith(".") then if ext and not ext:startswith(".") then
fn = path.join(fn, ext) fn = path.join(fn, ext)
else else
@ -643,33 +642,6 @@
end end
--
-- Retrieve the project's file system location. Also works with solutions.
--
-- @param prj
-- The project object to query.
-- @param relativeto
-- Optional; if supplied, the project location will be made relative
-- to this path.
-- @return
-- The path to the project's file system location.
--
function project.getlocation(prj, relativeto)
local location = prj.location
if not location and prj.solution then
location = prj.solution.location
end
if not location then
location = prj.basedir
end
if relativeto then
location = path.getrelative(relativeto, location)
end
return location
end
-- --
-- Return the relative path from the project to the specified file. -- Return the relative path from the project to the specified file.
-- --
@ -690,7 +662,7 @@
return result return result
else else
if filename then if filename then
return path.getrelative(project.getlocation(prj), filename) return path.getrelative(prj.location, filename)
end end
end end
end end

View File

@ -37,11 +37,8 @@
sln.blocks = {} sln.blocks = {}
sln.projects = {} sln.projects = {}
local cwd = os.getcwd()
local cset = configset.new(configset.root) local cset = configset.new(configset.root)
cset.basedir = cwd cset.basedir = os.getcwd()
cset.location = cwd
cset.filename = name cset.filename = name
sln.configset = cset sln.configset = cset
@ -127,7 +124,8 @@
-- Specify the solution's file system location; when path tokens are -- Specify the solution's file system location; when path tokens are
-- expanded in solution values, they will be made relative to this. -- expanded in solution values, they will be made relative to this.
context.basedir(ctx, project.getlocation(sln)) ctx.location = ctx.location or sln.basedir
context.basedir(ctx, ctx.location)
-- Now bake down all of the projects contained in the solution, and -- Now bake down all of the projects contained in the solution, and
-- store that for future reference -- store that for future reference
@ -140,6 +138,10 @@
ctx.projects = projects ctx.projects = projects
-- Synthesize a default solution file output location
ctx.location = ctx.location or sln.basedir
-- I now have enough information to assign unique object directories -- I now have enough information to assign unique object directories
-- to each project configuration in the solution. -- to each project configuration in the solution.
@ -203,7 +205,7 @@
local function getobjdirs(cfg) local function getobjdirs(cfg)
local dirs = {} local dirs = {}
local dir = path.getabsolute(path.join(project.getlocation(cfg.project), cfg.objdir or "obj")) local dir = path.getabsolute(path.join(cfg.project.location, cfg.objdir or "obj"))
table.insert(dirs, dir) table.insert(dirs, dir)
if cfg.platform then if cfg.platform then
@ -402,21 +404,6 @@
end end
--
-- Retrieve the solution's file system location.
--
-- @param sln
-- The solution object to query.
-- @param relativeto
-- Optional; if supplied, the location will be made relative
-- to this path.
-- @return
-- The path to the solution's file system location.
--
solution.getlocation = project.getlocation
-- --
-- Retrieve the project configuration at a particular index. -- Retrieve the project configuration at a particular index.
-- --

View File

@ -56,6 +56,7 @@
-- Solution object tests -- Solution object tests
dofile("solution/test_eachconfig.lua") dofile("solution/test_eachconfig.lua")
dofile("solution/test_location.lua")
dofile("solution/test_objdirs.lua") dofile("solution/test_objdirs.lua")
-- Project object tests -- Project object tests
@ -64,6 +65,7 @@
dofile("project/test_filename.lua") dofile("project/test_filename.lua")
dofile("project/test_getconfig.lua") dofile("project/test_getconfig.lua")
dofile("project/test_hasconfig.lua") dofile("project/test_hasconfig.lua")
dofile("project/test_location.lua")
dofile("project/test_vpaths.lua") dofile("project/test_vpaths.lua")
-- Configuration object tests -- Configuration object tests

View File

@ -0,0 +1,57 @@
--
-- tests/project/test_location.lua
-- Test handling of the projects's location field.
-- Copyright (c) 2013 Jason Perkins and the Premake project
--
local suite = test.declare("project_location")
--
-- Setup and teardown
--
local sln, prj
function suite.setup()
sln = test.createsolution()
end
local function prepare()
prj = premake.solution.getproject(sln, 1)
end
--
-- If no explicit location is set, the location should be set to the
-- directory containing the script which defined the project.
--
function suite.usesScriptLocation_onNoLocation()
prepare()
test.isequal(os.getcwd(), prj.location)
end
--
-- If an explicit location has been set, use it.
--
function suite.usesLocation_onLocationSet()
location "build"
prepare()
test.isequal(path.join(os.getcwd(), "build"), prj.location)
end
--
-- If the solution sets a location, and the project does not, it should
-- inherit the value from the solution.
--
function suite.inheritsSolutionLocation_onNoProjectLocation()
solution ()
location "build"
prepare()
test.isequal(path.join(os.getcwd(), "build"), prj.location)
end

View File

@ -0,0 +1,44 @@
--
-- tests/solution/test_location.lua
-- Test handling of the solution's location field.
-- Copyright (c) 2013 Jason Perkins and the Premake project
--
local suite = test.declare("solution_location")
--
-- Setup and teardown
--
local sln
function suite.setup()
sln = solution("MySolution")
end
local function prepare()
sln = premake.solution.bake(sln)
end
--
-- If no explicit location is set, the location should be set to the
-- directory containing the script which defined the solution.
--
function suite.usesScriptLocation_onNoLocation()
prepare()
test.isequal(os.getcwd(), sln.location)
end
--
-- If an explicit location has been set, use it.
--
function suite.usesLocation_onLocationSet()
location "build"
prepare()
test.isequal(path.join(os.getcwd(), "build"), sln.location)
end