Make builds repeatable.

We have been using the time of compilation to determine the
version string. This CL will keep doing that if the git repo has
uncommitted changes, but if the repo is clean we'll just use the
author date of the last commit. This ensures that the same source
will produce bitwise-identical builds (assuming no toolchain
changes, of course).

BUG=chrome-os-partner:45616
BRANCH=none
TEST=manual

  cd src/platform/ec
  make buildall
  mv build build.one
  make buildall
  md5sum build{,.one}/*/ec.bin | sort

Observe that successive builds produce identical binaries.

Change-Id: Ie2ef44b216586097589c9c15f12e05c87a53f991
Signed-off-by: Bill Richardson <wfrichar@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/302140
Reviewed-by: Randall Spangler <rspangler@chromium.org>
Reviewed-by: Shawn N <shawnn@chromium.org>
This commit is contained in:
Bill Richardson
2015-09-23 13:49:56 -07:00
committed by chrome-bot
parent 6190e15597
commit 5d138b379d
4 changed files with 9 additions and 27 deletions

View File

@@ -60,7 +60,6 @@ cmd_c_to_host = $(HOSTCC) $(HOST_CFLAGS) -MMD -MF $@.d -o $@ \
cmd_cxx_to_host = $(HOSTCXX) -std=c++0x $(COMMON_WARN) \
-I ./$($(notdir $@)_ROOT) -o $@ $(filter %.cc,$^) $($(notdir $@)_LIBS)
cmd_host_test = ./util/run_host_test $* $(silent)
cmd_date = $(if $(USE_GIT_DATE),cat /dev/null,./util/getdate.sh) > $@
cmd_version = ./util/getversion.sh > $@
cmd_mv_from_tmp = mv $(out)/$*.bin.tmp $(out)/$*.bin
cmd_extractrw-y = dd if=$(out)/$(PROJECT).bin.tmp of=$(out)/$(PROJECT).RW.bin \
@@ -260,7 +259,7 @@ ifneq ($(old_version_hash),$(new_version_hash))
endif
# All of the objects have an order only dependency on the ec_version header.
# This ensures that if ec_version.h needs to be build (because it was marked
# This ensures that if ec_version.h needs to be built (because it was marked
# PHONY above) then it will be rebuilt before any objects. This is important
# because some source files will include ec_version.h and fail to compile if
# it doesn't already exist. This dependency shouldn't be a normal dependency
@@ -275,12 +274,6 @@ $(sharedlib-objs): | $(out)/ec_version.h
$(out)/ec_version.h:
$(call quiet,version,VERSION)
$(out)/RO/common/version.o: $(out)/ec_date.h
$(out)/RW/common/version.o: $(out)/ec_date.h
$(out)/ec_date.h: $(filter-out $(out)/%/common/version.o,$(ro-objs) $(rw-objs))
$(call quiet,date,DATE )
$(out)/gen_pub_key.h: $(PEM)
$(call quiet,pubkey,PUBKEY )

View File

@@ -7,7 +7,6 @@
#include <stdint.h>
#include "common.h"
#include "ec_date.h"
#include "ec_version.h"
#include "version.h"

View File

@@ -1,12 +0,0 @@
#!/bin/bash
#
# Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# Generate build date information for the EC binary
echo "/* This file is generated by util/getdate.sh */"
echo "/* DATE is used to form build info string in common/version.c. */"
echo "#define DATE \"$(date '+%F %T')\""

View File

@@ -37,8 +37,6 @@ fi
ver="${BOARD}_${vbase}"
gitdate=$(git log -1 --format='%ai' HEAD | cut -d ' ' -f '1 2')
echo "/* This file is generated by util/getversion.sh */"
echo "/* Version string for use by common/version.c */"
@@ -56,7 +54,11 @@ echo " * in common/version.c. */"
echo "#define VERSION \"${ver}\""
echo "#define BUILDER \"${USER}@`hostname`\""
echo "/* Author date of last commit, in case compile-time is not used. */"
echo "#ifndef DATE"
echo "#define DATE \"${gitdate}\""
echo "#endif"
if [ -n "$dirty" ]; then
echo "/* Repo is dirty, using time of last compilation */"
echo "#define DATE \"$(date '+%F %T')\""
else
echo "/* Repo is clean, use the author date of the last commit */"
gitdate=$(git log -1 --format='%ai' HEAD | cut -d ' ' -f '1 2')
echo "#define DATE \"${gitdate}\""
fi