154d2f6fe6d8a7b9d9786bd1f8540df6b4f46b83fsbc@chromium.org#!/usr/bin/env python
254d2f6fe6d8a7b9d9786bd1f8540df6b4f46b83fsbc@chromium.org# Copyright (c) 2012 Google Inc. All rights reserved.
354d2f6fe6d8a7b9d9786bd1f8540df6b4f46b83fsbc@chromium.org# Use of this source code is governed by a BSD-style license that can be
454d2f6fe6d8a7b9d9786bd1f8540df6b4f46b83fsbc@chromium.org# found in the LICENSE file.
554d2f6fe6d8a7b9d9786bd1f8540df6b4f46b83fsbc@chromium.org"""
654d2f6fe6d8a7b9d9786bd1f8540df6b4f46b83fsbc@chromium.orgVerifies that the user can override the compiler and linker using CC/CXX/LD
754d2f6fe6d8a7b9d9786bd1f8540df6b4f46b83fsbc@chromium.orgenvironment variables.
854d2f6fe6d8a7b9d9786bd1f8540df6b4f46b83fsbc@chromium.org"""
954d2f6fe6d8a7b9d9786bd1f8540df6b4f46b83fsbc@chromium.org
1054d2f6fe6d8a7b9d9786bd1f8540df6b4f46b83fsbc@chromium.orgimport TestGyp
1154d2f6fe6d8a7b9d9786bd1f8540df6b4f46b83fsbc@chromium.orgimport os
1254d2f6fe6d8a7b9d9786bd1f8540df6b4f46b83fsbc@chromium.orgimport copy
1354d2f6fe6d8a7b9d9786bd1f8540df6b4f46b83fsbc@chromium.orgimport sys
1454d2f6fe6d8a7b9d9786bd1f8540df6b4f46b83fsbc@chromium.org
1554d2f6fe6d8a7b9d9786bd1f8540df6b4f46b83fsbc@chromium.orghere = os.path.dirname(os.path.abspath(__file__))
1654d2f6fe6d8a7b9d9786bd1f8540df6b4f46b83fsbc@chromium.org
1754d2f6fe6d8a7b9d9786bd1f8540df6b4f46b83fsbc@chromium.orgif sys.platform == 'win32':
1802717b7ddda2293e7152c260999035d122b21c09dimator@google.com  # cross compiling not supported by ninja on windows
1954d2f6fe6d8a7b9d9786bd1f8540df6b4f46b83fsbc@chromium.org  # and make not supported on windows at all.
2054d2f6fe6d8a7b9d9786bd1f8540df6b4f46b83fsbc@chromium.org  sys.exit(0)
2154d2f6fe6d8a7b9d9786bd1f8540df6b4f46b83fsbc@chromium.org
223ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.org# Clear any existing compiler related env vars.
2344c1a6c35b0c9762c1066afff961068be4808423thakis@chromium.orgfor key in ['CC', 'CXX', 'LINK', 'CC_host', 'CXX_host', 'LINK_host']:
243ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.org  if key in os.environ:
253ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.org    del os.environ[key]
263ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.org
2754d2f6fe6d8a7b9d9786bd1f8540df6b4f46b83fsbc@chromium.org
283ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.orgdef CheckCompiler(test, gypfile, check_for, run_gyp):
293ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.org  if run_gyp:
303ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.org    test.run_gyp(gypfile)
3154d2f6fe6d8a7b9d9786bd1f8540df6b4f46b83fsbc@chromium.org  test.build(gypfile)
3254d2f6fe6d8a7b9d9786bd1f8540df6b4f46b83fsbc@chromium.org
3354d2f6fe6d8a7b9d9786bd1f8540df6b4f46b83fsbc@chromium.org  test.must_contain_all_lines(test.stdout(), check_for)
3454d2f6fe6d8a7b9d9786bd1f8540df6b4f46b83fsbc@chromium.org
353ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.org
363ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.orgtest = TestGyp.TestGyp(formats=['ninja', 'make'])
373ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.org
383ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.orgdef TestTargetOveride():
3944c1a6c35b0c9762c1066afff961068be4808423thakis@chromium.org  expected = ['my_cc.py', 'my_cxx.py', 'FOO' ]
4044c1a6c35b0c9762c1066afff961068be4808423thakis@chromium.org  if test.format != 'ninja':  # ninja just uses $CC / $CXX as linker.
4144c1a6c35b0c9762c1066afff961068be4808423thakis@chromium.org    expected.append('FOO_LINK')
4244c1a6c35b0c9762c1066afff961068be4808423thakis@chromium.org
4354d2f6fe6d8a7b9d9786bd1f8540df6b4f46b83fsbc@chromium.org  # Check that CC, CXX and LD set target compiler
443ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.org  oldenv = os.environ.copy()
453ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.org  try:
463ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.org    os.environ['CC'] = 'python %s/my_cc.py FOO' % here
473ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.org    os.environ['CXX'] = 'python %s/my_cxx.py FOO' % here
4844c1a6c35b0c9762c1066afff961068be4808423thakis@chromium.org    os.environ['LINK'] = 'python %s/my_ld.py FOO_LINK' % here
493ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.org
5002717b7ddda2293e7152c260999035d122b21c09dimator@google.com    CheckCompiler(test, 'compiler-exe.gyp', expected, True)
513ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.org  finally:
523ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.org    os.environ.clear()
533ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.org    os.environ.update(oldenv)
543ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.org
553ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.org  # Run the same tests once the eviron has been restored.  The
563ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.org  # generated should have embedded all the settings in the
573ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.org  # project files so the results should be the same.
5802717b7ddda2293e7152c260999035d122b21c09dimator@google.com  CheckCompiler(test, 'compiler-exe.gyp', expected, False)
5902717b7ddda2293e7152c260999035d122b21c09dimator@google.com
603ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.org
613ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.orgdef TestTargetOverideCompilerOnly():
623ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.org  # Same test again but with that CC, CXX and not LD
633ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.org  oldenv = os.environ.copy()
643ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.org  try:
653ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.org    os.environ['CC'] = 'python %s/my_cc.py FOO' % here
663ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.org    os.environ['CXX'] = 'python %s/my_cxx.py FOO' % here
6754d2f6fe6d8a7b9d9786bd1f8540df6b4f46b83fsbc@chromium.org
6802717b7ddda2293e7152c260999035d122b21c09dimator@google.com    CheckCompiler(test, 'compiler-exe.gyp',
693ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.org                  ['my_cc.py', 'my_cxx.py', 'FOO'],
703ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.org                  True)
713ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.org  finally:
723ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.org    os.environ.clear()
733ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.org    os.environ.update(oldenv)
743ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.org
753ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.org  # Run the same tests once the eviron has been restored.  The
763ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.org  # generated should have embedded all the settings in the
773ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.org  # project files so the results should be the same.
7802717b7ddda2293e7152c260999035d122b21c09dimator@google.com  CheckCompiler(test, 'compiler-exe.gyp',
793ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.org                ['my_cc.py', 'my_cxx.py', 'FOO'],
803ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.org                False)
813ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.org
823ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.org
833ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.orgdef TestHostOveride():
8444c1a6c35b0c9762c1066afff961068be4808423thakis@chromium.org  expected = ['my_cc.py', 'my_cxx.py', 'HOST' ]
8544c1a6c35b0c9762c1066afff961068be4808423thakis@chromium.org  if test.format != 'ninja':  # ninja just uses $CC / $CXX as linker.
8644c1a6c35b0c9762c1066afff961068be4808423thakis@chromium.org    expected.append('HOST_LINK')
8744c1a6c35b0c9762c1066afff961068be4808423thakis@chromium.org
8854d2f6fe6d8a7b9d9786bd1f8540df6b4f46b83fsbc@chromium.org  # Check that CC_host sets host compilee
893ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.org  oldenv = os.environ.copy()
903ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.org  try:
913ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.org    os.environ['CC_host'] = 'python %s/my_cc.py HOST' % here
923ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.org    os.environ['CXX_host'] = 'python %s/my_cxx.py HOST' % here
9344c1a6c35b0c9762c1066afff961068be4808423thakis@chromium.org    os.environ['LINK_host'] = 'python %s/my_ld.py HOST_LINK' % here
9444c1a6c35b0c9762c1066afff961068be4808423thakis@chromium.org    CheckCompiler(test, 'compiler-host.gyp', expected, True)
953ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.org  finally:
963ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.org    os.environ.clear()
973ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.org    os.environ.update(oldenv)
983ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.org
993ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.org  # Run the same tests once the eviron has been restored.  The
1003ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.org  # generated should have embedded all the settings in the
1013ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.org  # project files so the results should be the same.
10244c1a6c35b0c9762c1066afff961068be4808423thakis@chromium.org  CheckCompiler(test, 'compiler-host.gyp', expected, False)
1033ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.org
1043ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.org
1053ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.orgTestTargetOveride()
1063ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.orgTestTargetOverideCompilerOnly()
1073ae45ea0689cdd8777d13f943ac3b73d87c6c0e7sbc@chromium.orgTestHostOveride()
10854d2f6fe6d8a7b9d9786bd1f8540df6b4f46b83fsbc@chromium.org
10954d2f6fe6d8a7b9d9786bd1f8540df6b4f46b83fsbc@chromium.orgtest.pass_test()
110