Заставить SCons использовать 32-разрядный компилятор MSVC в 64-разрядной Windows

я пытаюсь использовать cl из Visual Studio 2010 для создания 32-разрядной версии программа mixxx. Mixxx использует SCons для сборки. Мой компьютер-Windows 7 64-разрядная версия с слишком большим количеством версий Visual Studio.

после эти инструкции, я пробовал всевозможные комбинации и вариации setenv и vsvars но независимо от того, что я делаю, я оказываюсь в командной строке в этой ситуации:

> cl
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.40219.01 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

usage: cl [ option... ] filename... [ /link linkoption... ]

Итак,cl is указание на "Версия 16, x86" - отлично.

> scons toolchain=msvs force32=1 winlib=%cd%winlibx86 sqlitedll=0 staticlibs=1 asmlib=0

[... bunch of output truncated, until we start using the compiler ...]

cl /Foresqrc_mixxx.obj /c resqrc_mixxx.cc /TP /Zc:wchar_t- /GL /MP /fp:fast /G
[truncated]
Microsoft (R) C/C++ Optimizing Compiler Version 18.00.21005.1 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

(Примечание-я взломал SCons, чтобы удалить /nologo) что? Как это cl теперь означает "версия 18, x64"? Изменило ли это мое окружение? Давайте выясним:

Terminate batch job (Y/N)? y

>cl
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.40219.01 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

usage: cl [ option... ] filename... [ /link linkoption... ]

так cl по-прежнему означает "версия 16, x86" для терминала. Но SCons всегда использует "последнюю версию x64".

(основываясь на моем понимании оболочки Windows, это даже не должно быть возможным. Я убил сценарий, так что он ничего не сделал. очистка. Как может значение cl изменить подобное?)

я нашел пару намеков:

основываясь на этом, я добавил

Environment(MSVC_VERSION = '10.0')
Environment(TARGET_ARCH = 'x86')
print 'hello world'

для к sconstruct. Я не знаю SCons, и сценарии сборки нетривиальны, поэтому, вероятно, я делаю это неправильно. Несмотря на это, SCons по-прежнему всегда использует "новейшую версию x64".

3 ответов


окружающая среда кварги вы разместили работу для меня (Scons 2.3.4):

env = Environment(
    MSVC_VERSION='12.0',
    TARGET_ARCH='x86')

env.Program('src.cpp')

значение для 64-разрядной программы должно быть TARGET_ARCH='x86_64' согласно http://scons.1086193.n5.nabble.com/32-and-64-bit-builds-on-MSVC-td25425.html. Другие значения MSVC_VERSION также работать.


Я включил ведение журнала на комментарий диркбехла (set SCONS_MSCOMMON_DEBUG=-). Это было очень полезно. Когда я добавил Environment(MSVC_VERSION='10.0') чтобы SConstruct, я мог видеть на выходе

get_default_version(): msvc_version:10.0 msvs_version:None
msvc_setup_env: using specified MSVC version '10.0'

[ ... truncated ... ]

get_default_version()
get_default_version(): msvc_version:None msvs_version:None
installed_vcs:['12.0', '10.0', '10.0Exp', '9.0']
msvc_setup_env: using default installed MSVC version '12.0'

Упс - к тому времени мы называем get_default_version во второй раз кажется, что мы используем другую среду. Я не понимаю скрипты сборки Mixxx достаточно хорошо, чтобы знать, почему, но я уверен, что это причина.

Простое Решение

для людей вроде меня, которым лень исправить их строить скрипты, есть простой (но уродливый) способ заставить SCons делать то, что вы хотите. Вам просто нужно намеренно сломать свои новые версии (временно, конечно). Например, я хочу использовать 2010, x86. Во-первых, я переименовываю все каталоги "VC" более высоких версий.

  • C:\Program файлы (x86)\Microsoft Visual Studio 12.0\ VC переименовать в _DISABLED_VC
  • C:\Program файлы (x86)\Microsoft Visual Studio 11.0\ VC переименовать в _DISABLED_VC

и теперь SCons будет использовать 2010 (он же "Microsoft Visual Studio 10.0"), потому что все более высокие версии недоступны. Выбор целевой архитектуры аналогичен.

  • C:\Program файлы (x86)\Microsoft Visual Studio 10.0\VC\bin\ для amd64 переименовать в _DISABLED_amd64
  • сделать то же самое для для ia64, x86_amd64, x86_ia64, так далее.

Я попытался установить TARGET_ARCH с помощью env = Environment (blabla), но это не помогло

поэтому я искал "TARGET_ARCH" в каталоге Scons (...\PythonDir\проектов SCons-3.0.1 проектов SCons\). В моем случае это было в Environment.py файл, который имеет раздел со значениями по умолчанию. Я изменился нет to 'х86'

# Now set defaults for TARGET_{OS|ARCH}
...
# self._dict['TARGET_ARCH']    = self._dict.get('TARGET_ARCH',None)
self._dict['TARGET_ARCH']    = self._dict.get('TARGET_ARCH','x86')

затем я удалил ранее скомпилированный окружающая среда.пыць, вызывая его регенерации

и это сработало!