SUMMARY = "Phosphor hwmon configuration generator"
DESCRIPTION = "Generate phosphor-hwmon configuration from an MRW."
PR = "r1"
LICENSE = "Apache-2.0"
LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"

inherit allarch
inherit mrw-xml

DEPENDS += "mrw-perl-tools-native mrw-native"

do_compile:append() {
    ${STAGING_BINDIR_NATIVE}/perl-native/perl \
        ${STAGING_BINDIR_NATIVE}/hwmon.pl \
        -x ${mrw_datadir}/${MRW_XML} \
        -d ${WORKDIR}/mrw-config-files
}

def find_conf_files(dir):
    from fnmatch import fnmatch
    myfiles = []

    #These conf files generated by hwmon.pl are in
    #subdirectories which we need to preserve the path to.
    for root, dirs, files in os.walk(dir):
        for name in files:
            if fnmatch(name, "*.conf"):
                myfiles.append(os.path.join(root, name))

    return  myfiles

python install_conf_files() {
    from shutil import copy

    conf_file_dir = os.path.join(
        d.getVar("WORKDIR", True),
        'mrw-config-files')
    files = find_conf_files(conf_file_dir)

    install_dir = os.path.join(d.getVar("D", True),
                               "etc", "default", "obmc", "hwmon")

    dir_len = len(conf_file_dir)

    for f in files:
        dest = os.path.join(install_dir, f[dir_len + 1:])
        parent = os.path.dirname(dest)
        if not os.path.exists(parent):
            os.makedirs(parent)

        copy(f, dest)
}

do_install[postfuncs] += "install_conf_files"
