mirror of
https://github.com/mpv-player/mpv
synced 2024-12-25 00:02:13 +00:00
7e2edad8ef
This commit adds a new build system based on waf. configure and Makefile are deprecated effective immediately and someday in the future they will be removed (they are still available by running ./old-configure). You can find how the choice for waf came to be in `DOCS/waf-buildsystem.rst`. TL;DR: we couldn't get the same level of abstraction and customization with other build systems we tried (CMake and autotools). For guidance on how to build the software now, take a look at README.md and the cross compilation guide. CREDITS: This is a squash of ~250 commits. Some of them are not by me, so here is the deserved attribution: - @wm4 contributed some Windows fixes, renamed configure to old-configure and contributed to the bootstrap script. Also, GNU/Linux testing. - @lachs0r contributed some Windows fixes and the bootstrap script. - @Nikoli contributed a lot of testing and discovered many bugs. - @CrimsonVoid contributed changes to the bootstrap script.
70 lines
2.2 KiB
Python
70 lines
2.2 KiB
Python
from waflib.Options import OptionsContext
|
|
|
|
class Feature(object):
|
|
def __init__(self, group, feature):
|
|
self.group = group
|
|
self.identifier, self.attributes = feature['name'], feature
|
|
|
|
def add_options(self):
|
|
[self.add_option(option_rule) for option_rule in self.option_rules()]
|
|
|
|
def add_option(self, rule):
|
|
self.group.add_option(self.option(rule['state']),
|
|
action=rule['action'],
|
|
default=rule['default'],
|
|
dest=self.storage(),
|
|
help=self.help(rule['state']))
|
|
|
|
# private
|
|
def option_rules(self):
|
|
return {
|
|
'autodetect': [
|
|
{'state': 'disable', 'action': 'store_false', 'default': None},
|
|
{'state': 'enable', 'action': 'store_true', 'default': None},
|
|
],
|
|
'disable': [
|
|
{'state': 'disable', 'action': 'store_false', 'default': False},
|
|
{'state': 'enable', 'action': 'store_true', 'default': False},
|
|
],
|
|
'enable': [
|
|
{'state': 'disable', 'action': 'store_false', 'default': True},
|
|
],
|
|
}[self.behaviour()]
|
|
|
|
|
|
def behaviour(self):
|
|
if 'default' in self.attributes:
|
|
return self.attributes['default']
|
|
else:
|
|
return 'autodetect'
|
|
|
|
|
|
def option(self, state):
|
|
return "--{0}-{1}".format(state, self.identifier)
|
|
|
|
def help(self, state):
|
|
return "{0} {1} [{2}]" \
|
|
.format(state, self.attributes['desc'], self.behaviour())
|
|
|
|
def storage(self):
|
|
return "enable_{0}".format(self.identifier)
|
|
|
|
def add_feature(group, feature):
|
|
Feature(group, feature).add_options()
|
|
|
|
def parse_features(opt, group_name, features):
|
|
def is_feature(dep):
|
|
return dep['name'].find('--') >= 0
|
|
|
|
def strip_feature(dep):
|
|
dep['name'] = dep['name'].lstrip('-')
|
|
return dep
|
|
|
|
features = [strip_feature(dep) for dep in features if is_feature(dep)]
|
|
group = opt.get_option_group(group_name)
|
|
if not group:
|
|
group = opt.add_option_group(group_name)
|
|
[add_feature(group, feature) for feature in features]
|
|
|
|
OptionsContext.parse_features = parse_features
|