From b71a19353a2218417d7d2c4380527068620a637e Mon Sep 17 00:00:00 2001 From: "Dr.Best" Date: Tue, 3 Aug 2010 11:33:59 +0000 Subject: [PATCH] initial checkin Automatic Volume Adjustment Plugin --- Makefile.am | 1 + automaticvolumeadjustment/CONTROL/control | 10 + automaticvolumeadjustment/Makefile.am | 1 + automaticvolumeadjustment/meta/Makefile.am | 5 + .../meta/plugin_automaticvolumeadjustment.jpg | Bin 0 -> 70202 bytes .../meta/plugin_automaticvolumeadjustment.xml | 24 ++ automaticvolumeadjustment/src/Makefile.am | 5 + automaticvolumeadjustment/src/__init__.py | 0 automaticvolumeadjustment/src/maintainer.info | 2 + automaticvolumeadjustment/src/plugin.py | 149 ++++++++++ automaticvolumeadjustment/src/setup.py | 322 +++++++++++++++++++++ configure.ac | 4 + 12 files changed, 523 insertions(+) create mode 100644 automaticvolumeadjustment/CONTROL/control create mode 100755 automaticvolumeadjustment/Makefile.am create mode 100755 automaticvolumeadjustment/meta/Makefile.am create mode 100644 automaticvolumeadjustment/meta/plugin_automaticvolumeadjustment.jpg create mode 100755 automaticvolumeadjustment/meta/plugin_automaticvolumeadjustment.xml create mode 100755 automaticvolumeadjustment/src/Makefile.am create mode 100644 automaticvolumeadjustment/src/__init__.py create mode 100644 automaticvolumeadjustment/src/maintainer.info create mode 100644 automaticvolumeadjustment/src/plugin.py create mode 100644 automaticvolumeadjustment/src/setup.py diff --git a/Makefile.am b/Makefile.am index c433c7e..dee786f 100644 --- a/Makefile.am +++ b/Makefile.am @@ -4,6 +4,7 @@ SUBDIRS = \ aihdcontrol \ antiscrollbar \ automatictimerlistcleanup \ + automaticvolumeadjustment \ autoresolution \ autotimer \ babelzapper \ diff --git a/automaticvolumeadjustment/CONTROL/control b/automaticvolumeadjustment/CONTROL/control new file mode 100644 index 0000000..a513b0c --- /dev/null +++ b/automaticvolumeadjustment/CONTROL/control @@ -0,0 +1,10 @@ +Package: enigma2-plugin-systemplugins-automaticvolumeadjustment +Version: 1.0 +Description: Automatic Volume Adjustment +Architecture: mipsel +Section: extra +Priority: optional +Maintainer: Dr. Best +Homepage: http://www.dreambox-tools.info +Depends: enigma2 +Source: http://enigma2-plugins.schwerkraft.elitedvb.net/ diff --git a/automaticvolumeadjustment/Makefile.am b/automaticvolumeadjustment/Makefile.am new file mode 100755 index 0000000..ff1ac3d --- /dev/null +++ b/automaticvolumeadjustment/Makefile.am @@ -0,0 +1 @@ +SUBDIRS = src meta diff --git a/automaticvolumeadjustment/meta/Makefile.am b/automaticvolumeadjustment/meta/Makefile.am new file mode 100755 index 0000000..c8b93a9 --- /dev/null +++ b/automaticvolumeadjustment/meta/Makefile.am @@ -0,0 +1,5 @@ +installdir = $(datadir)/meta/ + +dist_install_DATA = plugin_automaticvolumeadjustment.xml + +EXTRA_DIST = plugin_automaticvolumeadjustment.jpg diff --git a/automaticvolumeadjustment/meta/plugin_automaticvolumeadjustment.jpg b/automaticvolumeadjustment/meta/plugin_automaticvolumeadjustment.jpg new file mode 100644 index 0000000000000000000000000000000000000000..79b4bf2667b0ebe52ef534ba134bd1c04953e166 GIT binary patch literal 70202 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 + + + + + Dr.Best + Automatic Volume Adjustment + enigma2-plugin-systemplugins-automaticvolumeadjustment + Automatic volume adjustment for ac3/dts services + Automatic volume adjustment for ac3/dts services + + + + Dr.Best + Automatic Volume Adjustment + enigma2-plugin-systemplugins-automaticvolumeadjustment + Automatische Lautstaerkenanpassung fuer AC3/DTS Tonspuren + Automatische Lautstaerkenanpassung fuer AC3/DTS Tonspuren + + + + + + diff --git a/automaticvolumeadjustment/src/Makefile.am b/automaticvolumeadjustment/src/Makefile.am new file mode 100755 index 0000000..75358b2 --- /dev/null +++ b/automaticvolumeadjustment/src/Makefile.am @@ -0,0 +1,5 @@ +installdir = /usr/lib/enigma2/python/Plugins/SystemPlugins/AutomaticVolumeAdjustment + +install_PYTHON = *.py + +install_DATA = maintainer.info diff --git a/automaticvolumeadjustment/src/__init__.py b/automaticvolumeadjustment/src/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/automaticvolumeadjustment/src/maintainer.info b/automaticvolumeadjustment/src/maintainer.info new file mode 100644 index 0000000..f378463 --- /dev/null +++ b/automaticvolumeadjustment/src/maintainer.info @@ -0,0 +1,2 @@ +dr.best@dreambox-tools.info +AutomaticVolumeAdjustment diff --git a/automaticvolumeadjustment/src/plugin.py b/automaticvolumeadjustment/src/plugin.py new file mode 100644 index 0000000..08a5aad --- /dev/null +++ b/automaticvolumeadjustment/src/plugin.py @@ -0,0 +1,149 @@ +# +# AutomaticVolumeAdjustment E2 +# +# $Id$ +# +# Coded by Dr.Best (c) 2010 +# Support: www.dreambox-tools.info +# +# This plugin is licensed under the Creative Commons +# Attribution-NonCommercial-ShareAlike 3.0 Unported +# License. To view a copy of this license, visit +# http://creativecommons.org/licenses/by-nc-sa/3.0/ or send a letter to Creative +# Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. +# +# Alternatively, this plugin may be distributed and executed on hardware which +# is licensed by Dream Multimedia GmbH. + +# This plugin is NOT free software. It is open source, you are allowed to +# modify it (if you keep the license), but it may not be commercially +# distributed other than under the conditions noted above. +# +from Plugins.Plugin import PluginDescriptor +from Screens.Screen import Screen +from Components.ActionMap import ActionMap +from Components.Sources.StaticText import StaticText +from Components.config import config +from setup import AutomaticVolumeAdjustmentConfigScreen, AutomaticVolumeAdjustmentConfig +from Components.ServiceEventTracker import ServiceEventTracker +from enigma import iPlayableService, iServiceInformation, eDVBVolumecontrol, eServiceCenter, eServiceReference +from ServiceReference import ServiceReference + +automaticvolumeadjustment = None # global, so setup can use method initializeConfigValues and enable/disable the plugin without gui restart + +class AutomaticVolumeAdjustment(Screen): + def __init__(self, session): + self.session = session + Screen.__init__(self, session) + print "[AutomaticVolumeAdjustment] Starting AutomaticVolumeAdjustment..." + self.__event_tracker = ServiceEventTracker(screen = self, eventmap = + { + iPlayableService.evUpdatedInfo: self.__evUpdatedInfo, + iPlayableService.evStart: self.__evStart, + iPlayableService.evEnd: self.__evEnd + }) + self.newService = False # switching flag + self.pluginStarted = False # is plugin started? + self.lastAdjustedValue = 0 # remember delta from last automatic volume up/down + self.currentVolume = 0 # only set when AC3 or DTS is available + self.enabled = False # AutomaticVolumeAdjustment enabled in setup? + self.serviceList = { } # values from config + configVA = AutomaticVolumeAdjustmentConfig() + self.initializeConfigValues(configVA, False) + self.volctrl = eDVBVolumecontrol.getInstance() + + def initializeConfigValues(self, configVA, fromOutside): + print "[AutomaticVolumeAdjustment] initialize config values..." + self.serviceList = { } + for c in configVA.config.Entries: + self.serviceList[c.servicereference.value] = int(c.adjustvalue.value) + self.defaultValue = int(configVA.config.adustvalue.value) + self.enabled = configVA.config.enable.value + if not self.pluginStarted and self.enabled and fromOutside: + self.newService = True + self.__evUpdatedInfo() + + def __evEnd(self): + if self.pluginStarted and self.enabled: + # if played service had AC3||DTS audio and volume value was changed with RC, take new delta value from the config + if self.currentVolume and self.volctrl.getVolume() != self.currentVolume: + self.lastAdjustedValue = self.serviceList.get(self.session.nav.getCurrentlyPlayingServiceReference().toString(), self.defaultValue) + + def __evStart(self): + self.newService = True + + def __evUpdatedInfo(self): + if self.newService and self.session.nav.getCurrentlyPlayingServiceReference() and self.enabled: + print "[AutomaticVolumeAdjustment] service changed" + self.newService = False + self.currentVolume = 0 # init + currentAC3DTS = self.isCurrentAudioAC3DTS() + if self.pluginStarted: + if currentAC3DTS: # ac3 dts? + vol = self.volctrl.getVolume() + currentvol = vol # remember current vol + vol -= self.lastAdjustedValue # go back to origin value first + ref = self.session.nav.getCurrentlyPlayingServiceReference() + if ref.getPath(): # check if a moving is playing + # it is , get the eServicereference if available + self.serviceHandler = eServiceCenter.getInstance() + info = self.serviceHandler.info(ref) + if info: + ref = eServiceReference(info.getInfoString(ref, iServiceInformation.sServiceref)) # set new eServicereference + ajvol = self.serviceList.get(ref.toString(), self.defaultValue) # get delta from config + if vol >= 100 - ajvol: # check if delta + vol < 100 + ajvol = 100 - vol # correct delta value + self.lastAdjustedValue = ajvol # save delta value + if ajvol !=0 and (vol+ajvol != currentvol): # only adjust volume when delta != 0 or current vol != new volume + self.volctrl.setVolume(vol+self.lastAdjustedValue, vol+self.lastAdjustedValue) + print "[AutomaticVolumeAdjustment] Change volume for service: %s (+%d) to %d"%(ServiceReference(ref).getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', ''), ajvol, self.volctrl.getVolume()) + self.currentVolume = self.volctrl.getVolume() # ac3||dts service , save current volume + else: + # mpeg or whatever audio + if self.lastAdjustedValue != 0: + # go back to origin value + vol = self.volctrl.getVolume() + self.volctrl.setVolume(vol-self.lastAdjustedValue, vol-self.lastAdjustedValue) + print "[AutomaticVolumeAdjustment] Change volume for service: %s (-%d) to %d"%(ServiceReference(self.session.nav.getCurrentlyPlayingServiceReference()).getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', ''), self.lastAdjustedValue, self.volctrl.getVolume()) + self.lastAdjustedValue = 0 # mpeg audio, no delta here + # save new volume in config + config.audio.volume.value = self.volctrl.getVolume() + config.audio.volume.save() + else: + # starting plugin, if service audio is ac3 or dts --> get delta from config...volume value is set by enigma2-system at start + if currentAC3DTS: + self.lastAdjustedValue = self.serviceList.get(self.session.nav.getCurrentlyPlayingServiceReference().toString(), self.defaultValue) + self.currentVolume = self.volctrl.getVolume() # ac3||dts service , save current volume + self.pluginStarted = True # plugin started... + + def isCurrentAudioAC3DTS(self): + service = self.session.nav.getCurrentService() + audio = service.audioTracks() + if audio: + try: # uhh, servicemp3 leads sometimes to OverflowError Error + tracknr = audio.getCurrentTrack() + i = audio.getTrackInfo(tracknr) + description = i.getDescription(); + if "AC3" in description or "DTS" in description: + return True + except: + return False + return False + +def autostart(reason, **kwargs): + if "session" in kwargs and automaticvolumeadjustment is None: + global automaticvolumeadjustment + session = kwargs["session"] + automaticvolumeadjustment = AutomaticVolumeAdjustment(session) + +def setup(session, **kwargs): + session.open(AutomaticVolumeAdjustmentConfigScreen) # start setup + +def startSetup(menuid): + if menuid != "system": # show setup only in system level menu + return [] + return [(_("Automatic Volume Adjustment"), setup, "AutomaticVolumeAdjustment", 46)] + +def Plugins(**kwargs): + return [PluginDescriptor(where = [PluginDescriptor.WHERE_SESSIONSTART], fnc = autostart), PluginDescriptor(name="Automatic Volume Adjustment", description=_("Automatic Volume Adjustment"), where = PluginDescriptor.WHERE_MENU, fnc=startSetup) ] + diff --git a/automaticvolumeadjustment/src/setup.py b/automaticvolumeadjustment/src/setup.py new file mode 100644 index 0000000..38badfb --- /dev/null +++ b/automaticvolumeadjustment/src/setup.py @@ -0,0 +1,322 @@ +# -*- coding: utf-8 -*- +# +# AutomaticVolumeAdjustment E2 +# +# $Id$ +# +# Coded by Dr.Best (c) 2009 +# Support: www.dreambox-tools.info +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# + +from enigma import eListboxPythonMultiContent, gFont, RT_HALIGN_LEFT, \ + RT_VALIGN_CENTER +from Screens.Screen import Screen +from Screens.MessageBox import MessageBox +from Components.MenuList import MenuList +from Components.Sources.StaticText import StaticText +from Components.ActionMap import ActionMap +from Components.ConfigList import ConfigList, ConfigListScreen +from Components.config import ConfigSubsection, ConfigText, \ + getConfigListEntry, config, ConfigInteger, Config, ConfigSubList, ConfigDirectory, NoSave, ConfigYesNo +from os import path as os_path, open as os_open, close as os_close, O_RDWR as os_O_RDWR, O_CREAT as os_O_CREAT +from Screens.ChannelSelection import SimpleChannelSelection +from enigma import eServiceReference +from ServiceReference import ServiceReference + +import plugin as AutomaticVolumeAdjustmentPlugin # import to submit config-values + +class AutomaticVolumeAdjustmentConfig(): + def __init__(self): + self.CONFIG_FILE = '/usr/lib/enigma2/python/Plugins/SystemPlugins/AutomaticVolumeAdjustment/config' + # load config file + self.loadConfigFile() + + # load config file and initialize + def loadConfigFile(self): + print "[AutomaticVolumeAdjustmentConfig] Loading config file..." + self.config = Config() + if not os_path.exists(self.CONFIG_FILE): + fd = os_open( self.CONFIG_FILE, os_O_RDWR|os_O_CREAT) + os_close( fd ) + self.config.loadFromFile(self.CONFIG_FILE) + self.config.entriescount = ConfigInteger(0) + self.config.Entries = ConfigSubList() + self.config.enable = ConfigYesNo(default = False) + self.config.adustvalue = ConfigInteger(default=25, limits=(0,50)) + self.initConfig() + + def initConfig(self): + count = self.config.entriescount.value + if count != 0: + i = 0 + while i < count: + self.initEntryConfig() + i += 1 + print "[AutomaticVolumeAdjustmentConfig] Loaded %s entries from config file..." % count + + def initEntryConfig(self): + self.config.Entries.append(ConfigSubsection()) + i = len(self.config.Entries) - 1 + self.config.Entries[i].servicereference = ConfigText(default = "") + self.config.Entries[i].name = NoSave(ConfigDirectory(default = _("Press OK to select a service"))) + self.config.Entries[i].adjustvalue = ConfigInteger(default=25, limits=(5,50)) + return self.config.Entries[i] + + def remove(self, configItem): + self.config.entriescount.value = self.config.entriescount.value - 1 + self.config.entriescount.save() + self.config.Entries.remove(configItem) + self.config.Entries.save() + self.save() + + def save(self): + print "[AutomaticVolumeAdjustmentConfig] saving config file..." + self.config.saveToFile(self.CONFIG_FILE) + +class AutomaticVolumeAdjustmentConfigScreen(ConfigListScreen, Screen): + skin = """ + + + + + + + + + + + """ + + def __init__(self, session): + Screen.__init__(self, session) + self.title = _("Automatic Volume Adjustment - Config") + self["actions"] = ActionMap(["SetupActions", "ColorActions"], + { + "green": self.keySave, + "red": self.keyCancel, + "blue": self.blue, + "cancel": self.keyCancel, + }, -2) + self["key_red"] = StaticText(_("Cancel")) + self["key_green"] = StaticText(_("OK")) + self["key_blue"] = StaticText(_("Services")) + self.configVA = AutomaticVolumeAdjustmentConfig() + self.list = [] + self.list.append(getConfigListEntry(_("Enable"), self.configVA.config.enable)) + self.list.append(getConfigListEntry(_("Default volume adjustment value for AC3/DTS"), self.configVA.config.adustvalue)) + ConfigListScreen.__init__(self, self.list, session) + + def blue(self): + self.session.open(AutomaticVolumeAdjustmentEntriesListConfigScreen, self.configVA) + + def keySave(self): + for x in self["config"].list: + x[1].save() + self.configVA.save() + if AutomaticVolumeAdjustmentPlugin.automaticvolumeadjustment is not None: + AutomaticVolumeAdjustmentPlugin.automaticvolumeadjustment.initializeConfigValues(self.configVA, True) # submit config values + self.close() + + def keyCancel(self): + ConfigListScreen.cancelConfirm(self, True) + + +class AutomaticVolumeAdjustmentEntriesListConfigScreen(Screen): + skin = """ + + + + + + + + + + + + + """ + + def __init__(self, session, configVA): + Screen.__init__(self, session) + self.title = _("Automatic Volume Adjustment - Service Config") + self["name"] = StaticText(_("Servicename")) + self["adjustvalue"] = StaticText(_("Adjustment value")) + self["key_red"] = StaticText(_("Add")) + self["key_green"] = StaticText(_("OK")) + self["key_yellow"] = StaticText(_("Edit")) + self["key_blue"] = StaticText(_("Delete")) + self["entrylist"] = AutomaticVolumeAdjustmentEntryList([]) + self["actions"] = ActionMap(["WizardActions","MenuActions","ShortcutActions"], + { + "ok" : self.keyOK, + "back" : self.keyClose, + "red" : self.keyRed, + "green": self.keyClose, + "yellow": self.keyYellow, + "blue": self.keyDelete, + }, -1) + self["entrylist"].setConfig(configVA) + self.updateList() + + def updateList(self): + self["entrylist"].buildList() + + def keyClose(self): + self.close(-1, None) + + def keyRed(self): + self.session.openWithCallback(self.updateList,AutomaticVolumeAdjustmentEntryConfigScreen,None, self["entrylist"].configVA) + + def keyOK(self): + try:sel = self["entrylist"].l.getCurrentSelection()[0] + except: sel = None + self.close(self["entrylist"].getCurrentIndex(), sel) + + def keyYellow(self): + try:sel = self["entrylist"].l.getCurrentSelection()[0] + except: sel = None + if sel is None: + return + self.session.openWithCallback(self.updateList,AutomaticVolumeAdjustmentEntryConfigScreen,sel, self["entrylist"].configVA) + + def keyDelete(self): + try:sel = self["entrylist"].l.getCurrentSelection()[0] + except: sel = None + if sel is None: + return + self.session.openWithCallback(self.deleteConfirm, MessageBox, _("Do you really want to delete this entry?")) + + def deleteConfirm(self, result): + if not result: + return + sel = self["entrylist"].l.getCurrentSelection()[0] + self["entrylist"].configVA.remove(sel) + if AutomaticVolumeAdjustmentPlugin.automaticvolumeadjustment is not None: + AutomaticVolumeAdjustmentPlugin.automaticvolumeadjustment.initializeConfigValues(self["entrylist"].configVA, True) # submit config values + self.updateList() + +class AutomaticVolumeAdjustmentEntryList(MenuList): + def __init__(self, list, enableWrapAround = True): + MenuList.__init__(self, list, enableWrapAround, eListboxPythonMultiContent) + self.l.setFont(0, gFont("Regular", 20)) + self.l.setFont(1, gFont("Regular", 18)) + self.configVA = None + + def postWidgetCreate(self, instance): + MenuList.postWidgetCreate(self, instance) + instance.setItemHeight(20) + + def getCurrentIndex(self): + return self.instance.getCurrentIndex() + + def setConfig(self, configVA): + self.configVA = configVA + + def buildList(self): + list = [] + for c in self.configVA.config.Entries: + c.name.value = ServiceReference(eServiceReference(c.servicereference.value)).getServiceName() + res = [ + c, + (eListboxPythonMultiContent.TYPE_TEXT, 5, 0, 350, 20, 1, RT_HALIGN_LEFT|RT_VALIGN_CENTER, c.name.value), + (eListboxPythonMultiContent.TYPE_TEXT, 355, 0,200, 20, 1, RT_HALIGN_LEFT|RT_VALIGN_CENTER, str(c.adjustvalue.value)), + ] + list.append(res) + self.list = list + self.l.setList(list) + self.moveToIndex(0) + +class AutomaticVolumeAdjustmentEntryConfigScreen(ConfigListScreen, Screen): + skin = """ + + + + + + + + + + """ + + def __init__(self, session, entry, configVA): + Screen.__init__(self, session) + self.title = _("Automatic Volume Adjustment - Entry Config") + self["actions"] = ActionMap(["SetupActions", "ColorActions"], + { + "green": self.keySave, + "red": self.keyCancel, + "cancel": self.keyCancel, + "ok": self.keySelect, + }, -2) + self["key_red"] = StaticText(_("Cancel")) + self["key_green"] = StaticText(_("OK")) + self.configVA = configVA + if entry is None: + self.newmode = 1 + self.current = self.configVA.initEntryConfig() + else: + self.newmode = 0 + self.current = entry + self.list = [ ] + self.service = getConfigListEntry(_("Servicename"), self.current.name) + self.list.append(self.service) + self.list.append(getConfigListEntry(_("Adjustment value"), self.current.adjustvalue)) + ConfigListScreen.__init__(self, self.list, session) + + def keySelect(self): + cur = self["config"].getCurrent() + if cur == self.service: + self.session.openWithCallback(self.channelSelected, ConfigChannelSelection) + + def channelSelected(self, ref = None): + if ref: + self.current.name.value = ServiceReference(ref).getServiceName() + self.current.servicereference.value = ref.toString() + self.current.save() + + def keySave(self): + if self.current.servicereference.value: + if self.newmode == 1: + self.configVA.config.entriescount.value = self.configVA.config.entriescount.value + 1 + self.configVA.config.entriescount.save() + for x in self["config"].list: + x[1].save() + self.configVA.save() + if AutomaticVolumeAdjustmentPlugin.automaticvolumeadjustment is not None: + AutomaticVolumeAdjustmentPlugin.automaticvolumeadjustment.initializeConfigValues(self.configVA, True) # submit config values + self.close() + else: + self.session.open(MessageBox, _("You must select a valid service!"), type = MessageBox.TYPE_INFO) + + def keyCancel(self): + if self.newmode == 1: + self.configVA.remove(self.current) + ConfigListScreen.cancelConfirm(self, True) + +class ConfigChannelSelection(SimpleChannelSelection): + def __init__(self, session): + SimpleChannelSelection.__init__(self, session, _("Channel Selection")) + self.skinName = ["SimpleChannelSelection"] + self["ChannelSelectEPGActions"] = ActionMap(["ChannelSelectEPGActions"], + { + "showEPGList": self.channelSelected + }) + + def channelSelected(self): + ref = self.getCurrentSelection() + if (ref.flags & 7) == 7: + self.enterPath(ref) + elif not (ref.flags & eServiceReference.isMarker): + self.close(ref) \ No newline at end of file diff --git a/configure.ac b/configure.ac index 76dff3d..42ccef9 100644 --- a/configure.ac +++ b/configure.ac @@ -48,6 +48,10 @@ automatictimerlistcleanup/meta/Makefile automatictimerlistcleanup/po/Makefile automatictimerlistcleanup/src/Makefile +automaticvolumeadjustment/Makefile +automaticvolumeadjustment/meta/Makefile +automaticvolumeadjustment/src/Makefile + autoresolution/Makefile autoresolution/meta/Makefile autoresolution/src/Makefile -- 2.7.4