mirror of
https://github.com/boostorg/build.git
synced 2026-02-15 13:02:11 +00:00
Port cast
[SVN r64434]
This commit is contained in:
69
v2/tools/cast.py
Normal file
69
v2/tools/cast.py
Normal file
@@ -0,0 +1,69 @@
|
||||
# Status: ported
|
||||
# Base revision: 64432.
|
||||
# Copyright 2005-2010 Vladimir Prus.
|
||||
# Distributed under the Boost Software License, Version 1.0. (See
|
||||
# accompanying file LICENSE_1_0.txt or copy at
|
||||
# http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
# Defines main target 'cast', used to change type for target. For example, in Qt
|
||||
# library one wants two kinds of CPP files -- those that just compiled and those
|
||||
# that are passed via the MOC tool.
|
||||
#
|
||||
# This is done with:
|
||||
#
|
||||
# exe main : main.cpp [ cast _ moccable-cpp : widget.cpp ] ;
|
||||
#
|
||||
# Boost.Build will assing target type CPP to both main.cpp and widget.cpp. Then,
|
||||
# the cast rule will change target type of widget.cpp to MOCCABLE-CPP, and Qt
|
||||
# support will run the MOC tool as part of the build process.
|
||||
#
|
||||
# At the moment, the 'cast' rule only works for non-derived (source) targets.
|
||||
#
|
||||
# TODO: The following comment is unclear or incorrect. Clean it up.
|
||||
# > Another solution would be to add a separate main target 'moc-them' that
|
||||
# > would moc all the passed sources, no matter what their type is, but I prefer
|
||||
# > cast, as defining a new target type + generator for that type is somewhat
|
||||
# > simpler than defining a main target rule.
|
||||
|
||||
import b2.build.targets as targets
|
||||
import b2.build.virtual_target as virtual_target
|
||||
|
||||
from b2.manager import get_manager
|
||||
from b2.util import bjam_signature
|
||||
|
||||
class CastTargetClass(targets.TypedTarget):
|
||||
|
||||
def construct(name, source_targets, ps):
|
||||
result = []
|
||||
for s in source_targets:
|
||||
if not isinstance(s, virtual_targets.FileTarget):
|
||||
get_manager().errors()("Source to the 'cast' metatager is not a file")
|
||||
|
||||
if s.action():
|
||||
get_manager().errors()("Only non-derived targets allowed as sources for 'cast'.")
|
||||
|
||||
|
||||
r = s.clone_with_different_type(self.type())
|
||||
result.append(get_manager().virtual_targets().register(r))
|
||||
|
||||
return result
|
||||
|
||||
|
||||
@bjam_signature((["name", "type"], ["sources", "*"], ["requirements", "*"],
|
||||
["default_build", "*"], ["usage_requirements", "*"]))
|
||||
def cast(name, type, sources, requirements, default_build, usage_requirements):
|
||||
|
||||
from b2.manager import get_manager
|
||||
t = get_manager().targets()
|
||||
|
||||
project = get_manager().projects().current()
|
||||
|
||||
return t.main_target_alternative(
|
||||
CastTargetClass(name, project, type,
|
||||
t.main_target_sources(sources, name),
|
||||
t.main_target_requirements(requirements, project),
|
||||
t.main_target_default_build(default_build, project),
|
||||
t.main_target_usage_requirements(usage_requirements, project)))
|
||||
|
||||
|
||||
get_manager().projects().add_rule("cast", cast)
|
||||
Reference in New Issue
Block a user