Bug 1290026 - Automatically set INCLUDE from configure. r?chmanchester
--- a/build/moz.configure/windows.configure
+++ b/build/moz.configure/windows.configure
@@ -146,16 +146,123 @@ add_old_configure_assignment(
'WINDOWSSDKDIR',
delayed_getattr(valid_windows_sdk_dir, 'path'))
add_old_configure_assignment(
'MOZ_WINSDK_MAXVER',
depends(valid_windows_sdk_dir)(
lambda x: '0x%04X0000' % x.version if x else None))
+@imports(_from='mozbuild.shellutil', _import='quote')
+def valid_ucrt_sdk_dir_result(value):
+ if value:
+ return '%s in %s' % (value.version, quote(value.path))
+
+@depends_win(windows_sdk_dir, 'WINDOWSSDKDIR')
+@checking('for Universal CRT SDK', valid_ucrt_sdk_dir_result)
+@imports(_from='__builtin__', _import='sorted')
+def valid_ucrt_sdk_dir(windows_sdk_dir, windows_sdk_dir_env):
+ if windows_sdk_dir_env:
+ windows_sdk_dir_env = windows_sdk_dir_env[0]
+ sdks = {}
+ for d in windows_sdk_dir:
+ ucrt_dir = get_include_dir(d, 'ucrt')
+ if ucrt_dir:
+ version = os.path.basename(os.path.dirname(ucrt_dir))
+ # We're supposed to always find a version in the directory, because
+ # the 8.1 SDK, which doesn't have a version in the directory, doesn't
+ # contain the Universal CRT SDK. When the main SDK is 8.1, there
+ # is, however, supposed to be a reduced install of the SDK 10
+ # with the UCRT.
+ if version != 'include':
+ sdks[d] = Version(version)
+ continue
+ if d == windows_sdk_dir_env:
+ raise FatalCheckError(
+ 'The SDK in WINDOWSSDKDIR (%s) does not contain the Universal '
+ 'CRT.' % windows_sdk_dir_env)
+
+ valid_sdks = sorted(sdks, key=lambda x: sdks[x], reverse=True)
+ if not valid_sdks:
+ raise FatalCheckError('Cannot find the Universal CRT SDK. '
+ 'Please install it.')
+
+ return namespace(
+ path=valid_sdks[0],
+ version=sdks[valid_sdks[0]],
+ )
+
+
+@depends_win(c_compiler)
+@imports('os')
+def vc_path(c_compiler):
+ if c_compiler.type != 'msvc':
+ return
+ # Normally, we'd start from c_compiler.compiler, but for now, it's not the
+ # ideal full path to the compiler. At least, we're guaranteed find_program
+ # will get us the one we found in toolchain.configure.
+ cl = find_program(c_compiler.compiler)
+ result = os.path.dirname(cl)
+ while True:
+ next, p = os.path.split(result)
+ if next == result:
+ die('Cannot determine the Visual C++ directory the compiler (%s) '
+ 'is in' % cl)
+ result = next
+ if p.lower() == 'bin':
+ break
+ return result
+
+
+@depends_win(vc_path)
+@checking('for the Debug Interface Access SDK', lambda x: x or 'not found')
+def dia_sdk_dir(vc_path):
+ if vc_path:
+ path = os.path.join(os.path.dirname(vc_path), 'DIA SDK')
+ if os.path.isdir(path):
+ return path
+
+
+@depends_win(vc_path, valid_windows_sdk_dir, valid_ucrt_sdk_dir, dia_sdk_dir)
+@imports('os')
+def include_path(vc_path, windows_sdk_dir, ucrt_sdk_dir, dia_sdk_dir):
+ if not vc_path:
+ return
+ atlmfc_dir = os.path.join(vc_path, 'atlmfc', 'include')
+ if not os.path.isdir(atlmfc_dir):
+ die('Cannot find the ATL/MFC headers in the Visual C++ directory (%s). '
+ 'Please install them.' % vc_path)
+
+ winrt_dir = get_include_dir(windows_sdk_dir.path, 'winrt')
+ if not os.path.isdir(winrt_dir):
+ die('Cannot find the WinRT headers in the Windows SDK directory (%s). '
+ 'Please install them.' % windows_sdk_dir.path)
+
+ includes = []
+ include_env = os.environ.get('INCLUDE')
+ if include_env:
+ includes.append(include_env)
+ includes.extend((
+ os.path.join(vc_path, 'include'),
+ atlmfc_dir,
+ get_include_dir(windows_sdk_dir.path, 'shared'),
+ get_include_dir(windows_sdk_dir.path, 'um'),
+ winrt_dir,
+ get_include_dir(ucrt_sdk_dir.path, 'ucrt'),
+ ))
+ if dia_sdk_dir:
+ includes.append(os.path.join(dia_sdk_dir, 'include'))
+ # Set in the environment for old-configure
+ includes = os.pathsep.join(includes)
+ os.environ['INCLUDE'] = includes
+ return includes
+
+set_config('INCLUDE', include_path)
+
+
option(env='MT', nargs=1, help='Path to the Microsoft Manifest Tool')
@depends_win(valid_windows_sdk_dir)
@imports(_from='os', _import='environ')
@imports('platform')
def sdk_bin_path(valid_windows_sdk_dir):
if not valid_windows_sdk_dir:
return
--- a/config/config.mk
+++ b/config/config.mk
@@ -353,16 +353,22 @@ SDK_LIB_DIR = $(DIST)/sdk/lib
SDK_BIN_DIR = $(DIST)/sdk/bin
DEPENDENCIES = .md
ifdef MACOSX_DEPLOYMENT_TARGET
export MACOSX_DEPLOYMENT_TARGET
endif # MACOSX_DEPLOYMENT_TARGET
+# Export to propagate to cl and submake for third-party code.
+# Eventually, we'll want to just use -I.
+ifdef INCLUDE
+export INCLUDE
+endif
+
ifdef MOZ_USING_CCACHE
ifdef CLANG_CXX
export CCACHE_CPP2=1
endif
endif
# Set link flags according to whether we want a console.
ifeq ($(OS_ARCH),WINNT)