SCons: требуется объяснение, почему Install не вызывается с помощью scons -u

#scons

#scons

Вопрос:

Есть кое-что, чего я не понимаю. Смотрите Следующий SConscript :

 Import('common_env')
import os
#Grab a copy of the top environment (the one sent by the SConstruct file)
common_env = common_env.Clone()
#Because this component is compiled in both win32 and win64.
if (common_env['ENV']['CONFIG'] == "win32") or (common_env['ENV']['CONFIG'] == "win64"):
    #Grabs the library name, the name should look like libpath_of_current_component-(debug/opt)
    libName = common_env.libName()
    common_env.USE_BOOST()

    #Grab all the sources in current dir.
    sources = Glob('*.cpp')
    #Creates the library
    myLib = common_env.Library(libName, sources)
    #Install (copy) the library in LINK/lib/winX
    common_env.Install('#/LINK/lib/'   common_env['ENV']['CONFIG'], myLib)
  

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

 scons: Entering directory `C:svnproductsfaa_mxscons-test-speed3'
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
scons: building associated VariantDir targets: builddebugsrspeechASRNetworkLayerThinProtocolwin64
cl /FobuilddebugsrspeechASRNetworkLayerThinProtocolwin64ThinProtocol.obj /c srspeechASRNetworkLayerThinProtocolThinProtocol.cpp /TP /nologo -Od -D_DEBUG -RTC1 -MDd -Z7 -DBOOST_FILESYSTEM_VERSION=2 -DWIN32 -D_WIN32 -DWINDOWS -D_MBCS -DNOMINMAX -D_MSC_VER=1600 -D_WIN32_WINNT=0x0501 -D_CRT_SECURE_NO_WARNINGS -W3 -nologo -GS -GR -EHa -wd4290 -wd4996 -wd4995 -TP -DBOOST_FILESYSTEM_VERSION=2 /Iinterfaceasomapi /Ifwksimulation_fwkutils /ILINKinclude /IbuilddebugsrspeechASRNetworkLayerThinProtocolwin64 /IsrspeechASRNetworkLayerThinProtocol /IC:svn3rdParty3rdPartyPackagesboost-1.47.0_vs2010_x64include /Z7
ThinProtocol.cpp
cl /FobuilddebugsrspeechASRNetworkLayerThinProtocolwin64ThinProtocolMessageDefinitions.obj /c srspeechASRNetworkLayerThinProtocolThinProtocolMessageDefinitions.cpp /TP /nologo -Od -D_DEBUG -RTC1 -MDd -Z7 -DBOOST_FILESYSTEM_VERSION=2 -DWIN32 -D_WIN32 -DWINDOWS -D_MBCS -DNOMINMAX -D_MSC_VER=1600 -D_WIN32_WINNT=0x0501 -D_CRT_SECURE_NO_WARNINGS -W3 -nologo -GS -GR -EHa -wd4290 -wd4996 -wd4995 -TP -DBOOST_FILESYSTEM_VERSION=2 /Iinterfaceasomapi /Ifwksimulation_fwkutils /ILINKinclude /IbuilddebugsrspeechASRNetworkLayerThinProtocolwin64 /IsrspeechASRNetworkLayerThinProtocol /IC:svn3rdParty3rdPartyPackagesboost-1.47.0_vs2010_x64include /Z7
ThinProtocolMessageDefinitions.cpp
cl /FobuilddebugsrspeechASRNetworkLayerThinProtocolwin64ThinProtocolMessaging.obj /c srspeechASRNetworkLayerThinProtocolThinProtocolMessaging.cpp /TP /nologo -Od -D_DEBUG -RTC1 -MDd -Z7 -DBOOST_FILESYSTEM_VERSION=2 -DWIN32 -D_WIN32 -DWINDOWS -D_MBCS -DNOMINMAX -D_MSC_VER=1600 -D_WIN32_WINNT=0x0501 -D_CRT_SECURE_NO_WARNINGS -W3 -nologo -GS -GR -EHa -wd4290 -wd4996 -wd4995 -TP -DBOOST_FILESYSTEM_VERSION=2 /Iinterfaceasomapi /Ifwksimulation_fwkutils /ILINKinclude /IbuilddebugsrspeechASRNetworkLayerThinProtocolwin64 /IsrspeechASRNetworkLayerThinProtocol /IC:svn3rdParty3rdPartyPackagesboost-1.47.0_vs2010_x64include /Z7
ThinProtocolMessaging.cpp
lib /nologo /OUT:builddebugsrspeechASRNetworkLayerThinProtocolwin64win64libsr_speech_ASRNetworkLayer_ThinProtocol-debug.lib builddebugsrspeechASRNetworkLayerThinProtocolwin64ThinProtocol.obj builddebugsrspeechASRNetworkLayerThinProtocolwin64ThinProtocolMessageDefinitions.obj builddebugsrspeechASRNetworkLayerThinProtocolwin64ThinProtocolMessaging.obj
scons: `srspeechASRNetworkLayerThinProtocol' is up to date.
scons: done building targets.
  

Как вы можете видеть, Install scons вообще не вызывается.

Если вместо вызова scons -u из вложенной папки я вызываю scons из корня, тогда у меня есть это :

 Install file: "builddebugsrspeechASRNetworkLayerThinProtocolwin64libsr_speech_ASRNetworkLayer_ThinProtocol-debug.lib" as "LINKlibwin64libsr_speech_ASRNetworkLayer_ThinProtocol-debug.lib"
  

Мой вопрос: почему эта разница? Это потому, что система сборки scons, в случае scons -u , знает, что никому не нужен .lib, поэтому Install не вызывается?

Спасибо!

Ответ №1:

По умолчанию набор файлов, которые будут созданы, находится в текущем рабочем каталоге вниз.

Вы можете увидеть информацию об этом на странице руководства: http://scons.org/doc/production/HTML/scons-man.html

Подмножество иерархического дерева можно построить, оставаясь в каталоге верхнего уровня (где находится файл SConstruct) и указав подкаталог в качестве целевого объекта для построения:

 scons src/subdir
  

или путем изменения каталога и вызова scons с параметром -u, который
перемещается вверх по иерархии каталогов, пока не найдет
файл SConstruct, а затем создает целевые объекты относительно текущего подкаталога:

 cd src/subdir
scons -u .
  

Смотрите также этот раздел:

 -u, --up, --search-up
  

Перемещается вверх по структуре каталогов, пока не будет найден файл SConstruct , Sconstruct или sconstruct, и использует его в качестве вершины
дерева каталогов. Если в командной строке не указаны целевые объекты, будут созданы только целевые объекты в
текущем каталоге или ниже.

 -U
  

Работает точно так же, как и опция -u, за исключением способа обработки целей по умолчанию. Когда используется эта опция и
в командной строке не указаны целевые объекты, создаются все целевые объекты по умолчанию, которые
определены в SConscript (ах) в текущем каталоге,
независимо от того, в какой каталог попадают результирующие целевые объекты.

Таким образом, вы можете либо установить цель install по умолчанию (), либо указать ее как зависимость от какой-либо другой цели в текущем рабочем каталоге.