# generate vcxproj file from os.path import normpath, join, split, relpath from enum import IntEnum class Project_Type(IntEnum): APP = 0 LIB = 1 DLL = 2 app_ext = ('.exe', '.lib', '.dll') app_str = ('Application', 'StaticLibrary', 'DynamicLibrary') def vcx_proj_cfg(plat, outf): f1 = r''' ''' f2 = r''' {1:s} {0:s} ''' f3 = r''' ''' outf.write(f1) for pl in plat: for conf in ('Release', 'Debug'): outf.write(f2.format(pl, conf)) outf.write(f3) def vcx_globals(name, guid, outf): f1 = r''' {0:s} Win32Proj {1:s} ''' outf.write(f1.format(name, guid)) def vcx_default_cpp_props(outf): f1 = r''' ''' outf.write(f1) def vcx_library_type(plat, proj_type, vs_info, outf): f1 = r''' {2:s} {3:s} v{4:s} ''' for pl in plat: for conf, bool in (('Release', 'false'), ('Debug', 'true')): outf.write(f1.format(pl, conf, app_str[proj_type], bool, vs_info['platform_toolset'])) def vcx_cpp_props(outf): f1 = r''' ''' outf.write(f1) def vcx_extensions(outf): f1 = r''' ''' outf.write(f1) def vcx_user_props(plat, proj_type, outf): f1 = r''' ''' for pl in plat: for conf in ('Release', 'Debug'): outf.write(f1.format(pl, conf, conf.lower(), app_ext[proj_type][1:])) def vcx_target_name_and_dirs(name, plat, proj_type, outf): f1 = r''' <_ProjectFileVersion>10.0.21006.1 ''' f2 = r''' {2:s} ''' f3 = r''' ''' outf.write(f1) for pl in plat: for conf in ('Release', 'Debug'): outf.write(f2.format(pl, conf, name)) outf.write(f3) def yasm_options(plat, proj_type, outf): f1 = r''' {0:s} ..\..\mpn\x86{1:s}w\ true $(IntDir)mpn\ ''' outf.write(f1.format('DLL' if proj_type == Project_Type.DLL else '', '' if plat == 'Win32' else '_64')) def compiler_options(plat, proj_type, is_debug, outf): f1 = r''' ..\..\ {0:s}%(PreprocessorDefinitions) ''' if proj_type == Project_Type.APP: s1 = 'DEBUG;WIN32;_CONSOLE;' if proj_type == Project_Type.DLL: s1 = 'DEBUG;WIN32;HAVE_CONFIG_H;MSC_BUILD_DLL;' elif proj_type == Project_Type.LIB: s1 = 'DEBUG;WIN32;_LIB;HAVE_CONFIG_H;' else: pass if plat == 'x64': s1 = s1 + '_WIN64;' s1 = ('_' if is_debug else 'N') + s1 outf.write(f1.format(s1)) def linker_options(outf): f1 = r''' ''' outf.write(f1) def vcx_pre_build(name, plat, msvc_ver, outf): f1 = r''' cd ..\..\build.vc prebuild {0:s} {1:s} {2:s} ''' outf.write(f1.format(name, plat, msvc_ver)) def vcx_post_build(is_cpp, msvc_ver, outf): f1 = r''' cd ..\..\build.vc postbuild "$(TargetPath)" {0:s} ''' outf.write(f1.format(msvc_ver)) def vcx_tool_options(config, plat, proj_type, is_cpp, af_list, add_prebuild, msvc_ver, outf): f1 = r''' ''' f2 = r''' ''' for pl in plat: for is_debug in (False, True): outf.write(f1.format(pl, 'Debug' if is_debug else 'Release')) if add_prebuild and not is_cpp: vcx_pre_build(config, pl, msvc_ver, outf) if af_list: yasm_options(pl, proj_type, outf) compiler_options(pl, proj_type, is_debug, outf) if proj_type != Project_Type.LIB: linker_options(outf) vcx_post_build(is_cpp, msvc_ver, outf) outf.write(f2) def vcx_external_props(outf): f1 = r''' ''' outf.write(f1) def vcx_hdr_items(hdr_list, relp, outf): f1 = r''' ''' f2 = r''' ''' f3 = r''' ''' outf.write(f1) for i in hdr_list: outf.write(f2.format(relp, i)) outf.write(f3) def vcx_c_items(cf_list, plat, relp, outf): f1 = r''' ''' f2 = r''' ''' f3 = r''' ''' f6 = r''' ''' outf.write(f1) for nxd in cf_list: if nxd[2] == '': outf.write(f2.format(relp, nxd)) else: outf.write(f3.format(relp, nxd)) outf.write(f6) def vcx_a_items(af_list, relp, outf): f1 = r''' ''' f2 = r''' ''' f3 = r''' ''' outf.write(f1) for nxd in af_list: outf.write(f2.format(relp, nxd)) outf.write(f3) def gen_vcxproj(path, root_dir, proj_name, guid, config, plat, proj_type, is_cpp, hf_list, cf_list, af_list, add_prebuild, vs_info): f1 = r''' ''' f2 = r''' ''' f3 = r''' ''' f4 = r''' ''' f5 = r''' ''' relp = split(relpath(root_dir, path))[0] + '\\' with open(path, 'w') as outf: outf.write(f1.format(vs_info['vcx_tool'])) vcx_proj_cfg(plat, outf) vcx_globals(proj_name, guid, outf) vcx_default_cpp_props(outf) vcx_library_type(plat, proj_type, vs_info, outf) vcx_cpp_props(outf) if af_list: vcx_extensions(outf) vcx_user_props(plat, proj_type, outf) outf.write(f2) vcx_target_name_and_dirs(proj_name, plat, proj_type, outf) vcx_tool_options(config, plat, proj_type, is_cpp, af_list, add_prebuild, vs_info['msvc'], outf) vcx_external_props(outf) if hf_list: vcx_hdr_items(hf_list, relp, outf) vcx_c_items(cf_list, plat, relp, outf) vcx_a_items(af_list, relp, outf) outf.write(f3) if af_list: outf.write(f4) outf.write(f5)