summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xtools/genboardscfg.py58
1 files changed, 56 insertions, 2 deletions
diff --git a/tools/genboardscfg.py b/tools/genboardscfg.py
index 8361fedef9..c0d7b94409 100755
--- a/tools/genboardscfg.py
+++ b/tools/genboardscfg.py
@@ -85,6 +85,52 @@ def get_make_cmd():
sys.exit('GNU Make not found')
return ret[0].rstrip()
+def output_is_new():
+ """Check if the boards.cfg file is up to date.
+
+ Returns:
+ True if the boards.cfg file exists and is newer than any of
+ *_defconfig, MAINTAINERS and Kconfig*. False otherwise.
+ """
+ try:
+ ctime = os.path.getctime(BOARD_FILE)
+ except OSError as exception:
+ if exception.errno == errno.ENOENT:
+ # return False on 'No such file or directory' error
+ return False
+ else:
+ raise
+
+ for (dirpath, dirnames, filenames) in os.walk(CONFIG_DIR):
+ for filename in fnmatch.filter(filenames, '*_defconfig'):
+ if fnmatch.fnmatch(filename, '.*'):
+ continue
+ filepath = os.path.join(dirpath, filename)
+ if ctime < os.path.getctime(filepath):
+ return False
+
+ for (dirpath, dirnames, filenames) in os.walk('.'):
+ for filename in filenames:
+ if (fnmatch.fnmatch(filename, '*~') or
+ not fnmatch.fnmatch(filename, 'Kconfig*') and
+ not filename == 'MAINTAINERS'):
+ continue
+ filepath = os.path.join(dirpath, filename)
+ if ctime < os.path.getctime(filepath):
+ return False
+
+ # Detect a board that has been removed since the current boards.cfg
+ # was generated
+ with open(BOARD_FILE) as f:
+ for line in f:
+ if line[0] == '#' or line == '\n':
+ continue
+ defconfig = line.split()[6] + '_defconfig'
+ if not os.path.exists(os.path.join(CONFIG_DIR, defconfig)):
+ return False
+
+ return True
+
### classes ###
class MaintainersDatabase:
@@ -503,7 +549,7 @@ class BoardsFileGenerator:
self.in_progress = False
-def gen_boards_cfg(jobs):
+def gen_boards_cfg(jobs=1, force=False):
"""Generate boards.cfg file.
The incomplete boards.cfg is deleted if an error (including
@@ -513,6 +559,10 @@ def gen_boards_cfg(jobs):
jobs: The number of jobs to run simultaneously
"""
check_top_directory()
+ if not force and output_is_new():
+ print "%s is up to date. Nothing to do." % BOARD_FILE
+ sys.exit(0)
+
generator = BoardsFileGenerator()
generator.generate(jobs)
@@ -521,7 +571,10 @@ def main():
# Add options here
parser.add_option('-j', '--jobs',
help='the number of jobs to run simultaneously')
+ parser.add_option('-f', '--force', action="store_true", default=False,
+ help='regenerate the output even if it is new')
(options, args) = parser.parse_args()
+
if options.jobs:
try:
jobs = int(options.jobs)
@@ -534,7 +587,8 @@ def main():
except (OSError, ValueError):
print 'info: failed to get the number of CPUs. Set jobs to 1'
jobs = 1
- gen_boards_cfg(jobs)
+
+ gen_boards_cfg(jobs, force=options.force)
if __name__ == '__main__':
main()