%YAML 1.2
--- |
  // $Id$
  // vim:ft=javascript

  ARG_WITH("grpc", "grpc support", "no");

  if (PHP_GRPC != "no") {

    grpc_source =
      % for source in php_config_m4.src:
      "${source.replace('/','\\\\')} " +
      % endfor
      % for lib in libs:
      % if lib.name in php_config_m4.get('deps', []) and lib.name != 'ares':
      % for source in lib.src:
      "${source.replace('/','\\\\')} " +
      % endfor
      % endif
      % endfor
      "";

    EXTENSION("grpc", grpc_source, null,
      "/DOPENSSL_NO_ASM /D_GNU_SOURCE /DWIN32_LEAN_AND_MEAN "+
      "/D_HAS_EXCEPTIONS=0 /DNOMINMAX /DGRPC_ARES=0 /D_WIN32_WINNT=0x600 "+
      "/DPB_FIELD_16BIT "+
      "/I"+configure_module_dirname+" "+
      "/I"+configure_module_dirname+"\\include "+
      "/I"+configure_module_dirname+"\\src\\php\\ext\\grpc "+
      "/I"+configure_module_dirname+"\\third_party\\boringssl\\include "+
      "/I"+configure_module_dirname+"\\third_party\\zlib "+
      "/I"+configure_module_dirname+"\\third_party\\address_sorting\\include");
  <%
    dirs = {}
    for lib in libs:
      if lib.name in php_config_m4.get('deps', []) and lib.name != 'ares':
        for source in lib.src:
          tmp = source
          prev = ''
          while (True):
            idx = tmp.find('/');
            if (idx == -1):
              break
            dirs[prev + '\\\\' + tmp[:idx]] = 1
            prev += ('\\\\' + tmp[:idx]);
            tmp = tmp[idx+1:]
            
    dirs['\\\\src'] = 1;
    dirs['\\\\src\\\\php'] = 1;
    dirs['\\\\src\\\\php\\\\ext'] = 1;
    dirs['\\\\src\\\\php\\\\ext\\\\grpc'] = 1;
    dirs = dirs.keys()
    dirs.sort()
  %>
    base_dir = get_define('BUILD_DIR');
    FSO.CreateFolder(base_dir+"\\ext");
    FSO.CreateFolder(base_dir+"\\ext\\grpc");
    % for dir in dirs:
    FSO.CreateFolder(base_dir+"\\ext\\grpc${dir}");
    % endfor
    _build_dirs = new Array();
    for (i = 0; i < build_dirs.length; i++) {
      if (build_dirs[i].indexOf('grpc') == -1) {
        _build_dirs[_build_dirs.length] = build_dirs[i];
      }
    }
    build_dirs = _build_dirs;

  }
