#### Version String Readme ####

    ## Customrc ##

    Create a file at the top level of op-build called 'customrc'
    to specify custom $(OPBUILD_VENDOR), $(OPBUILD_PLATFORM), and $(OPBUILD_VERSION).

    Example:
    #!/bin/sh
    #export OPBUILD_VENDOR=IBM
    #export OPBUILD_PLATFORM=plat-ibm
    #export OPBUILD_VERSION=v-1.0.1

    ## Op-build Commands ##

    # Display subpackage version
    op-build $(package)-version

    # Display entire pnor version
    op-build openpower-pnor-version

    # Force a rebuild of a subpackage version
    op-build $(package)-build-version

    # Force a rebuild of all subpackage versions
    op-build openpower-pnor-build-version-all

    ##  Version String (ASCII) ##

    General:
    $(op-build)\n
    \t$(subpackage0)\n
    \t$(subpackage1)\n
    \0

    ## Version String Details ##

    $(op-build):
    - Clean
        + $(vendor)-$(platform)-$(op-version)
    - Dirty.
        + $(vendor)-$(platform)-$(gitcommit+dirty)
    $(sub-package):
    - Directly upstream, no patches, op-build clean.
        + $(package)-$(version)
    - Directly upstream, no patches, op-build dirty.
        + $(package)-$(version)-$(op-dirty)
    - Directly upstream, op-build patches, op-build clean
        + $(package)-$(version)-$(patch-level)
    - Directly upstream, op-build patches, op-build dirty.
        + $(package)-$(version)-$(op-dirty)-$(patch-level)
    - SITE=local
        + $(package)-site_local-$(user)-$(gitcommit+dirty)

    ## Variable Details ##

    - $(vendor) = $(OPBUILD_VENDOR) or 'open-power'.
    - $(platform) = $(OPBUILD_PLATFORM) or defconfig
        + Order $(OPBUILD_PLATFORM), defconfig
    - $(op-version) = git tag or first 7 characters of commit or $(OPBUILD_VERSION) or 'unknown'.
        + Order $(OPBUILD_VERSION), tag, commit, unknown
    - **$(gitcommit+dirty) = abcd123 or abcd123-dirty or 'unknown'
    - $(version) = git tag or first 7 characters of commit
    - $(user) = `whoami`
    - **$(op-dirty) = opdirty or 'unknown'
    - $(patch-level) = $(first 7 characters of 'sha512sum *.patch | sha512sum')
        + the output of this gives us a quick way to check all the patches with one string

    ** Indicates possible unknown case when source downloaded versus git clone due to git commands required

    ## Sub Packages ##

    Current sub packages included in openpower-pnor.mk $(OPENPOWER_VERSIONED_SUBPACKAGES)

    - skiboot
    - hostboot
    - petitboot kernel
    - petitboot
    - $(platform)-xml
    - occ
    - hostboot-binaries
    - capp-ucode

    ## PNOR section ##

    - There is one version PNOR section per side
    - Each is one page w/o ECC so 4K
    - The data in the section will just be ASCII

    ## Op-build Command Examples ##

    cmd> op-build openpower-pnor-version
    === OPENPOWER_PNOR_VERSION ===
    IBM-plat-ibm-v-1.2.3-dirty
        hostboot-3593853-99cca2b
        occ-cc8376d
        skiboot-9a3f68b-7c66ab4
        hostboot-binaries-e3c9356
        habanero-xml-4c1e936
        capp-ucode-d4b2683

    cmd> op-build hostboot-version
    === HOSTBOOT_VERSION ===
        hostboot-3593853-opdirty-99cca2b

    If a version does not already exist, the commands to make one will be run.
    Additionally you can force with op-build $(package)-build-version

    cmd> op-build hostboot-version (or op-build hostboot-build-version)
    === HOSTBOOT_VERSION ===
            Searching for patches...
    op-build/openpower/package/hostboot/hostboot-0001-Increase-uart-delay.patch
    op-build/openpower/package/hostboot/hostboot-0002-Disable-centaur-memory-throttle.patch
    op-build/openpower/package/hostboot/hostboot-0003-GCC-4.9-Make-compiler-use-ELFv1-ABI-and-use-O2.patch
    op-build/openpower/package/hostboot/hostboot-0004-Revert-SW294127-INITPROC-FSP-Hostboot-fast-exit-powe.patch
    op-build/openpower/package/hostboot/hostboot-0005-Disable-SPD-writes-workaround-for-DRAM-repairs-error.patch
    op-build/openpower/package/hostboot/hostboot-0006-Runtime-fixes-for-IPMI.patch
    op-build/openpower/package/hostboot/hostboot-0007-Update-DIMM_TEMP-Sensor-Enum.patch
    op-build/openpower/package/hostboot/hostboot-0008-mss-thermal-init-SW297647.patch
    op-build/openpower/package/hostboot/hostboot-0009-Sel-instead-of-eSel.patch
    op-build/openpower/package/hostboot/hostboot-0010-Reset-occ-when-fails-to-activate.patch
    op-build/openpower/package/hostboot/hostboot-0011-eRepair-MBVPD-size-check-for-CDIMM-and-ISDIMM.patch
            End of patches...
            Creating version string (various output may display)...
    heads/pnor_version-dirty
            End creating version string...
            version: hostboot-3593853-99cca2b
