#!/usr/bin/env perl ## ## Copyright (c) 2016, Alliance for Open Media. All rights reserved ## ## This source code is subject to the terms of the BSD 2 Clause License and ## the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License ## was not distributed with this source code in the LICENSE file, you can ## obtain it at www.aomedia.org/license/software. If the Alliance for Open ## Media Patent License 1.0 was not distributed with this source code in the ## PATENTS file, you can obtain it at www.aomedia.org/license/patent. ## use strict; use warnings; use 5.010; use Getopt::Long; my $git_desc = ''; my $version_data; my $version_filename; GetOptions('version_data=s' => \$version_data, 'version_filename=s' => \$version_filename) or die("Invalid arg(s): $!"); if (!defined $version_data || length($version_data) == 0 || !defined $version_filename || length($version_filename) == 0) { die("--version_data and --version_filename are required."); } # Determine if $version_data is a filename or a git tag/description. my $version_string; chomp($version_data); if (-r $version_data) { # $version_data is the path to the CHANGELOG. Parse the most recent version. my $changelog_filename = $version_data; open(my $changelog_file, '<', $changelog_filename) or die("Unable to open CHANGELOG @ $changelog_filename: $!."); while (my $line = <$changelog_file>) { my @split_line = split(" ", $line, 3); next if @split_line < 2; $version_string = $split_line[1]; last if substr($version_string, 0, 1) eq "v"; } close($changelog_file); } else { # $version_data is either a tag name or a full git description, one of: # tagName OR tagName-commitsSinceTag-shortCommitHash # In either case we want the first element of the array returned by split. $version_string = (split("-", $version_data))[0]; $git_desc = $version_data; } if (substr($version_string, 0, 1) eq "v") { $version_string = substr($version_string, 1); } my @version_components = split('\.', $version_string, 4); my $version_major = $version_components[0]; my $version_minor = $version_components[1]; my $version_patch = $version_components[2]; my $version_extra = ""; if (length($git_desc) > 0) { my @git_desc_components = split('-', $git_desc, 2); $version_extra = $git_desc_components[1]; } open(my $version_file, '>', $version_filename) or die("Cannot open $version_filename: $!"); my $version_packed = "((VERSION_MAJOR << 16) | (VERSION_MINOR << 8) | (VERSION_PATCH))"; my $year = (localtime)[5] + 1900; my $lic_block = << "EOF"; /* * Copyright (c) $year, Alliance for Open Media. All rights reserved * * This source code is subject to the terms of the BSD 2 Clause License and * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License * was not distributed with this source code in the LICENSE file, you can * obtain it at www.aomedia.org/license/software. If the Alliance for Open * Media Patent License 1.0 was not distributed with this source code in the * PATENTS file, you can obtain it at www.aomedia.org/license/patent. */ EOF select $version_file; if (length($git_desc)) { print << "EOF"; $lic_block #define VERSION_MAJOR $version_major #define VERSION_MINOR $version_minor #define VERSION_PATCH $version_patch #define VERSION_EXTRA \"$version_extra\" #define VERSION_PACKED \\ $version_packed #define VERSION_STRING_NOSP \"$git_desc\" #define VERSION_STRING \" $git_desc\" EOF } else { print << "EOF"; $lic_block #define VERSION_MAJOR $version_major #define VERSION_MINOR $version_minor #define VERSION_PATCH $version_patch #define VERSION_EXTRA \"$version_extra\" #define VERSION_PACKED \\ $version_packed #define VERSION_STRING_NOSP \"v$version_string\" #define VERSION_STRING \" v$version_string\" EOF } close($version_file);