| #!/usr/bin/env perl |
| ## |
| ## Copyright (c) 2021, Alliance for Open Media. All rights reserved |
| ## |
| ## This source code is subject to the terms of the BSD 3-Clause Clear License and the |
| ## Alliance for Open Media Patent License 1.0. If the BSD 3-Clause Clear License was |
| ## not distributed with this source code in the LICENSE file, you can obtain it |
| ## at aomedia.org/license/software-license/bsd-3-c-c/. 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 aomedia.org/license/patent-license/. |
| ## |
| 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); |