%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 "+
      "/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");
  <%
    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;

  }
