fn main() {
    let mut defines = Vec::new();

    let ay = cfg!(feature = "ay");
    if ay { defines.push("USE_GME_AY") }

    let gbs = cfg!(feature = "gbs");
    if gbs { defines.push("USE_GME_GBS") }

    let gym = cfg!(feature = "gym");
    if gym { defines.push("USE_GME_GYM") }

    let hes = cfg!(feature = "hes");
    if hes { defines.push("USE_GME_HES") }

    let kss = cfg!(feature = "kss");
    if kss { defines.push("USE_GME_KSS") }

    let nsf = cfg!(feature = "nsf");
    if nsf { defines.push("USE_GME_NSF") }

    let nsfe = cfg!(feature = "nsfe");
    if nsfe { defines.push("USE_GME_NSFE") }

    let sap = cfg!(feature = "sap");
    if sap { defines.push("USE_GME_SAP") }

    let spc = cfg!(feature = "spc");
    if spc { defines.push("USE_GME_SPC") }

    let vgm = cfg!(feature = "vgm");
    if vgm { defines.push("USE_GME_VGM"); }

    let mut files = Vec::new();

    files.extend_from_slice(&vec![
        "Blip_Buffer.cpp",
        "Classic_Emu.cpp",
        "Data_Reader.cpp",
        "Dual_Resampler.cpp",
        "Effects_Buffer.cpp",
        "Fir_Resampler.cpp",
        "gme.cpp",
        "Gme_File.cpp",
        "M3u_Playlist.cpp",
        "Multi_Buffer.cpp",
        "Music_Emu.cpp"
    ]);

    if ay || kss {
        files.push("Ay_Apu.cpp")
    }

    if vgm || gym {
        if cfg!(feature = "ym2612_emu_nuked") {
            defines.push("VGM_YM2612_NUKED");
            files.push("Ym2612_Nuked.cpp");
        } else if cfg!(feature = "ym2612_emu_mame") {
            defines.push("VGM_YM2612_MAME");
            files.push("Ym2612_MAME.cpp");
        } else {
            defines.push("VGM_YM2612_GENS");
            files.push("Ym2612_GENS.cpp");
        }
    }

    if vgm || gym || kss {
        files.push("Sms_Apu.cpp");
    }

    if ay {
        files.extend_from_slice(&vec![
            "Ay_Cpu.cpp",
            "Ay_Emu.cpp"
        ]);
    }

    if gbs {
        files.extend_from_slice(&vec![
            "Gb_Apu.cpp",
            "Gb_Cpu.cpp",
            "Gb_Oscs.cpp",
            "Gbs_Emu.cpp"
        ]);
    }

    if gym {
        files.push("Gym_Emu.cpp")
    }

    if hes {
        files.extend_from_slice(&vec![
            "Hes_Apu.cpp",
            "Hes_Cpu.cpp",
            "Hes_Emu.cpp"
        ]);
    }

    if kss {
        files.extend_from_slice(&vec![
            "Kss_Cpu.cpp",
            "Kss_Emu.cpp",
            "Kss_Scc_Apu.cpp",
        ]);
    }


    if nsf || nsfe {
        files.extend_from_slice(&vec![
            "Nes_Apu.cpp",
            "Nes_Cpu.cpp",
            "Nes_Fme7_Apu.cpp",
            "Nes_Namco_Apu.cpp",
            "Nes_Oscs.cpp",
            "Nes_Vrc6_Apu.cpp",
            "Nsf_Emu.cpp"
        ]);
    }

    if nsfe {
        files.push("Nsfe_Emu.cpp");
    }

    if sap {
        files.extend_from_slice(&vec![
            "Sap_Apu.cpp",
            "Sap_Cpu.cpp",
            "Sap_Emu.cpp"
        ]);
    }

    if spc {
        files.extend_from_slice(&vec![
            "Snes_Spc.cpp",
            "Spc_Cpu.cpp",
            "Spc_Dsp.cpp",
            "Spc_Emu.cpp",
            "Spc_Filter.cpp"
        ]);
    }

    if vgm {
        files.extend_from_slice(&vec![
            "Vgm_Emu.cpp",
            "Vgm_Emu_Impl.cpp",
            "Ym2413_Emu.cpp",
        ]);
    }


    let mut build = cc::Build::new();
    build.cpp(true);
    build.flag("-std=c++11");

    for file in files {
        build.file(format!("src/gme/{}", file));
    }

    for flag in defines {
        build.flag(&format!("-D {}", flag));
    }

    build.compile("gme");
}