Scopes & Inheritance
As you may have noticed from the previous samples, Premake uses a pseudo-declarative syntax for specifying project information. You specify a scope (i.e. a workspace or project) for the settings, and then the settings to be placed in that scope.
Scopes have a hierarchy: a global scope containing workspaces, which in turn contains projects. Values placed into the outer scopes are inherited by the inner ones, so workspaces inherit the values stored at the global scope, and projects inherit values stored in workspaces.
-- global scope, all workspaces will receive these values
defines { "GLOBAL" }
workspace "MyWorkspaces"
-- workspace scope inherits the global scope; the list value
-- will now be { "GLOBAL", "WORKSPACE" }
defines { "WORKSPACE" }
project "MyProject"
-- project scope inherits from its workspace; the list value
-- will now be { "GLOBAL", "WORKSPACE", "PROJECT" }
defines { "PROJECT" }
Sometimes it can be helpful to go back and add values to a previously declared scope. You can do this the same way you declared it in the first place: by calling workspace
or project
, using the same name.
-- declare my workspace
workspace "MyWorkspace"
defines { "WORKSPACE1" }
-- declare a project or two
project "MyProject"
defines { "PROJECT" }
-- re-select my workspace to add more settings, which will be inherited
-- by all projects in the workspace
workspace "MyWorkspace"
defines { "WORKSPACE2" } -- value is now { "WORKSPACE1", "WORKSPACE2" }
You can also select the parent or container of the current scope without having to know its name by using the special "*" name.
-- declare my workspace
workspace "MyWorkspace"
defines { "WORKSPACE1" }
-- declare a project or two
project "MyProject"
defines { "PROJECT" }
-- re-select my workspace to add more settings
project "*"
defines { "WORKSPACE2" } -- value is now { "WORKSPACE1", "WORKSPACE2" }
-- re-select the global scope
workspace "*"
Think of the "*" as a wilcard meaning "all projects in my parent container" or "all workspaces in the global scope".