File: gen_buildid.py

package info (click to toggle)
firefox-esr 128.13.0esr-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 4,230,012 kB
  • sloc: cpp: 7,103,971; javascript: 6,088,450; ansic: 3,653,980; python: 1,212,330; xml: 594,604; asm: 420,652; java: 182,969; sh: 71,124; makefile: 20,747; perl: 13,449; objc: 12,399; yacc: 4,583; cs: 3,846; pascal: 2,973; lex: 1,720; ruby: 1,194; exp: 762; php: 436; lisp: 258; awk: 247; sql: 66; sed: 54; csh: 10
file content (99 lines) | stat: -rw-r--r-- 2,789 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this file,
# You can obtain one at http://mozilla.org/MPL/2.0/.

# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
# vim: set filetype=python:
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distibuted with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.


import os
from io import StringIO

import buildconfig
from mozbuild.preprocessor import Preprocessor


def main(output, input_file):
    with open(input_file) as fh:
        objs = [l.strip() for l in fh.readlines()]

    write_file(output, None)

    return set(
        os.path.join("build", o)
        for o in objs
        if os.path.splitext(os.path.basename(o))[0] != "buildid"
    )


def tests(output, buildid):
    write_file(output, buildid)


def write_file(output, maybe_buildid):
    pp = Preprocessor()
    pp.out = StringIO()
    pp.do_include(os.path.join(buildconfig.topobjdir, "buildid.h"))
    buildid = pp.context["MOZ_BUILDID"] if maybe_buildid is None else maybe_buildid

    keyword_extern = "extern" if maybe_buildid is None else ""
    attribute_used = "__attribute__((used))" if maybe_buildid is not None else ""

    output.write(
        """
#include "buildid_section.h"

#if defined(XP_DARWIN) || defined(XP_WIN)
#define SECTION_NAME_ATTRIBUTE __attribute__((section(MOZ_BUILDID_SECTION_NAME)))
#else
#define SECTION_NAME_ATTRIBUTE
#endif

{extern} const char gToolkitBuildID[] SECTION_NAME_ATTRIBUTE {used} = "{buildid}";
""".format(
            extern=keyword_extern,
            used=attribute_used,
            buildid=buildid,
        )
    )

    if buildconfig.substs.get("TARGET_KERNEL") not in (
        "Darwin",
        "WINNT",
    ):
        elf_note = """
#include <elf.h>

#define note_name "mzbldid"
#define note_desc "{buildid}"

// This is not defined on Android?
// Android also hardcodes "1"
// https://android.googlesource.com/platform/ndk/+/refs/tags/ndk-r26c/sources/crt/crtbrand.S#35
#ifndef NT_VERSION
#define NT_VERSION 1
#endif

struct note {{
    Elf32_Nhdr header; // Elf32 or Elf64 doesn't matter, they're the same size
    char name[(sizeof(note_name) + 3) / 4 * 4];
    char desc[(sizeof(note_desc) + 3) / 4 * 4];
}};

{extern} const struct note gNoteToolkitBuildID __attribute__((section(MOZ_BUILDID_SECTION_NAME), aligned(4), used)) = {{
    {{ sizeof(note_name), sizeof(note_desc), NT_VERSION }},
    note_name,
    note_desc
}};
"""
        output.write(
            "{}".format(
                elf_note.format(
                    extern=keyword_extern,
                    buildid=buildid,
                )
            )
        )