Bug 1290026 - Automatically set INCLUDE from configure. r=chmanchester
☠☠ backed out by a9d6bdcdb18d ☠ ☠
authorMike Hommey <mh+mozilla@glandium.org>
Wed, 27 Jul 2016 17:03:09 +0900
changeset 349496 a4a381f85dc805e4ef288ef1f747a05d19f48931
parent 349495 07e0af7fc5d9cc41f143a8ae0cc566dfca494626
child 349497 90559af62774f42daa4aab8500c6bd6a8a39d3d2
push id1230
push userjlund@mozilla.com
push dateMon, 31 Oct 2016 18:13:35 +0000
treeherdermozilla-release@5e06e3766db2 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewerschmanchester
bugs1290026
milestone50.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1290026 - Automatically set INCLUDE from configure. r=chmanchester
build/moz.configure/windows.configure
config/config.mk
--- 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)