0
点赞
收藏
分享

微信扫一扫

1232_使用SCons实现WindRiver Diab编译器的命令行自动化编译环境


1232_使用SCons实现WindRiver Diab编译器的命令行自动化编译环境

全部学习汇总: ​​GitHub - GreyZhang/g_SCons: A new member in my toolbox, looking forward to replacing make tool later.​​

前面看了一阵子SCons的基础使用了,目前看来进展非常顺利。上次,在linux平台上使用gcc进行多个目录以及多个文件的编译测试成功了。这个工程中的多文件彼此之间还有相互的引用以及依赖,已经有一定的复杂度。

之所以实现上面的这个工程的构建市因为这个基本上就是一个典型工程的一个代表。如果这个功能实现了,其他的功能实现其实就有很多技巧性的操作空间了。我觉得这样的工程构建本身也就是一种软件设计的行为,我们需要处理的其实是把原子系统给抽象出来。

如果上面的功能实现了,自然是振奋人心。但是再回到我现在工作的主业——嵌入式的软件开发,类似的功能实现还有自己的特点。比较典型的其实就是工具链不同,而SCons默认的模板在使用的时候不见得是语法兼容的。

接下来,针对我自己折腾过程中的一些问题点进行一个梳理,把几个关键点整理出来。

问题1:首先,先应对一下Windows平台上的警告问题。我前面所有的测试都是在Linux的平台上进行的,推进的十分顺利。这也是预料之中的,最初这么做就是为了避开可能的环境问题,先看SCons的基础功能。

1232_使用SCons实现WindRiver Diab编译器的命令行自动化编译环境_c++

这是遇到的第一个问题:scons: warning: No version of Visual Studio compiler found - C/C++ compilers most likely not set correctly。

在进行调试的时候,在Windows上使用gcc遇到了上面的提示。其实,这个警告可能并不会影响我们实际的功能。我也在网络上找过其他的资料,也看到了比如RT-Thread的开发环境中其实也用SCons。而网上找到的RT-Thread的说明信息,有些就是带有这样的警告的,然而他们调试下来功能并没有出现什么异常。但是,我相信优秀的程序员应该都是多少有些精神洁癖的,他们忍受不了各种警告的袭扰。我自己也找到了解决方案:修改里面的tools信息。

修改的方法如下:

1232_使用SCons实现WindRiver Diab编译器的命令行自动化编译环境_SCons_02

可以在配置文件中增加这样的配置化,让SCons在工具检查的时候不再去找VS编译器。这样,相关的警告就可以消失。我的电脑上配置了gcc的环境,因此我其实不确定用了其他的工具是否还会有这样的问题存在。不过,在后面尝试使用WindRiver编译器的时候其实没有出现什么冲突。因为,编译器自己连接器等都是可以通过配置信息进行重新设置的。

问题2:第二个问题,在Windows平台上使用gcc编译的时候出现了错误:scons Cannot create temporary file in C:\Windows\……

这个问题的根本原因或许不在Scons而在于gcc,网络上找到的很多项目的bug都是提给了命令行的仿真环境。在我的机器上出现的情况下,直接在Windows的CMD中进行编译会有这样的错误。后面伴随的足够的信息也可以明确:权限不够。

解决方式1:直接以管理员的方式启动CMD。我试了这个,的确是可以实现正常的编译。这个在我过去的尝试中也采用过。

解决方式2(失败):TEMP、TMP临时目录改到其他位置,非管理员也可以操作的地方。我把这两个目录全都转移到了电脑的D盘也有普通用户读写权限的目录,依然没有成功。

解决方式3:cygwin。我尝试了cygwin,编译成功也没有任何警告。但是我查看了相关的配置信息,发现cygwin中的gcc版本与我在CMD中用的并不相同。这也是我开始怀疑gcc的开始。

其他尝试:我用了git bash,其实是mingw的环境,测试编译也取得了成功。

1232_使用SCons实现WindRiver Diab编译器的命令行自动化编译环境_自动化_03

上面的这个截图是在git bash下编译成功并且运行的效果,环境是Windows 10。

接下来的处理就是这次总结比较关键的地方了,如何去替换编译器以及链接器等工具?开始我直接搜索文档,这方面给出的信息其实很散碎。但是,找到了一个可以查看环境配置信息的一个方式:print(env.Dump())。可以把这一句(env需要与自己的配置中的名称一致)加入到SConstruct文件中,运行后可以得到具体的配置信息。比如,我现在得到的信息如下:

scons: Reading SConscript files ...
{ 'AR': 'dar',
'ARCOM': '$AR $ARFLAGS $TARGET $SOURCES',
'ARFLAGS': ['rc'],
'AS': 'dcc',
'ASCOM': '$AS $ASFLAGS -o $TARGET $SOURCES',
'ASFLAGS': '-tPPCE200Z0VES -Xpreprocess-assembly -DSTART_FROM_FLASH '
'-DMPC560xB -DDISABLE_SWT -g ',
'ASPPCOM': '$CC $ASPPFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -c -o '
'$TARGET $SOURCES',
'ASPPFLAGS': '$ASFLAGS',
'BUILDERS': { 'CFile': ,
'CXXFile': ,
'CopyAs': ,
'CopyTo': ,
'JarFile': ,
'JavaClassDir': ,
'JavaClassFile': ,
'JavaFile': ,
'Library': ,
'LoadableModule': ,
'Object': ,
'Program': ,
'ProgramAllAtOnce': ,
'RMIC': ,
'SharedLibrary': ,
'SharedObject': ,
'StaticLibrary': ,
'StaticObject': ,
'Substfile': ,
'Tar': ,
'Textfile': ,
'Zip': },
'CC': 'dcc',
'CCCOM': '$CC -o $TARGET -c $CFLAGS $CCFLAGS $_CCCOMCOM $SOURCES',
'CCFLAGS': '-tPPCE200Z0VES -DSTART_FROM_FLASH -DMPC560xB -DDISABLE_SWT -g3 '
'-Xmake-dependency=0x5 -ei1824 -XO -Xwhole-program-optim=0 '
'-Xdebug-local-cie -Xnested-interrupts -Xsmall-data=8 '
'-Xsmall-const=0 -Xapu-volatile-context -Xpragma-section-first '
'-Xenum-is-int ',
'CCVERSION': '5.9.6.2',
'CFILESUFFIX': '.c',
'CFLAGS': [],
'CONFIGUREDIR': '#/.sconf_temp',
'CONFIGURELOG': '#/config.log',
'COPYSTR': 'Copy file(s): "$SOURCES" to "$TARGETS"',
'CPPDEFPREFIX': '-D',
'CPPDEFSUFFIX': '',
'CPPSUFFIXES': [ '.c',
'.C',
'.cxx',
'.cpp',
'.c++',
'.cc',
'.h',
'.H',
'.hxx',
'.hpp',
'.hh',
'.F',
'.fpp',
'.FPP',
'.m',
'.mm',
'.S',
'.spp',
'.SPP',
'.sx'],
'CXX': 'g++',
'CXXCOM': '$CXX -o $TARGET -c $CXXFLAGS $CCFLAGS $_CCCOMCOM $SOURCES',
'CXXFILESUFFIX': '.cc',
'CXXFLAGS': [],
'CXXVERSION': '8.3.0',
'DC': 'dmd',
'DCOM': '$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS -c -of$TARGET '
'$SOURCES',
'DDEBUG': [],
'DDEBUGPREFIX': '-debug=',
'DDEBUGSUFFIX': '',
'DFILESUFFIX': '.d',
'DFLAGPREFIX': '-',
'DFLAGS': [],
'DFLAGSUFFIX': '',
'DINCPREFIX': '-I',
'DINCSUFFIX': '',
'DLIB': 'lib',
'DLIBCOM': '$DLIB $_DLIBFLAGS -c $TARGET $SOURCES $_DLIBFLAGS',
'DLIBDIRPREFIX': '-L-L',
'DLIBDIRSUFFIX': '',
'DLIBFLAGPREFIX': '-',
'DLIBFLAGSUFFIX': '',
'DLIBLINKPREFIX': '',
'DLIBLINKSUFFIX': '.lib',
'DLINK': '$DC',
'DLINKCOM': '$DLINK -of$TARGET $DLINKFLAGS $__DRPATH $SOURCES $_DLIBDIRFLAGS '
'$_DLIBFLAGS',
'DLINKFLAGS': [],
'DPATH': ['#/'],
'DRPATHPREFIX': '-L-rpath=',
'DRPATHSUFFIX': '',
'DSUFFIXES': ['.d'],
'DVERPREFIX': '-version=',
'DVERSIONS': [],
'DVERSUFFIX': '',
'Dir': ,
'Dirs': ,
'ENV': { 'ALLUSERSPROFILE': 'C:\\ProgramData',
'APPDATA': 'C:\\Users\\grey\\AppData\\Roaming',
'COMMONPROGRAMFILES': 'C:\\Program Files\\Common Files',
'COMMONPROGRAMFILES(X86)': 'C:\\Program Files (x86)\\Common Files',
'COMMONPROGRAMW6432': 'C:\\Program Files\\Common Files',
'COMPUTERNAME': 'DESKTOP-H943ASL',
'COMSPEC': 'C:\\Windows\\system32\\cmd.exe',
'DAS_HOME': 'C:\\Program Files (x86)\\DAS',
'DRIVERDATA': 'C:\\Windows\\System32\\Drivers\\DriverData',
'HOME': 'D:\\zhangguolei_home',
'HOMEDRIVE': 'C:',
'HOMEPATH': '\\Users\\grey',
'HTC_DEVELOPMENT': 'C:\\HighTec',
'HTC_LICENSES': 'C:\\HighTec\\licenses',
'LOCALAPPDATA': 'C:\\Users\\grey\\AppData\\Local',
'LOGONSERVER': '\\\\DESKTOP-H943ASL',
'MOZ_PLUGIN_PATH': 'D:\\Program Files (x86)\\Foxit Software\\Foxit '
'Reader\\plugins\\',
'NUMBER_OF_PROCESSORS': '8',
'ONEDRIVE': 'C:\\Users\\grey\\OneDrive',
'OS': 'Windows_NT',
'PATH': 'C:\\Program Files\\Python38\\Scripts\\;C:\\Program '
'Files\\Python38\\;C:\\Windows\\system32;C:\\Windows;C:\\Windows\\System32\\Wbem;C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\;C:\\Windows\\System32\\OpenSSH\\;D:\\Program '
'Files\\Git\\cmd;D:\\Program '
'Files\\TortoiseGit\\bin;C:\\Strawberry\\perl\\site\\bin;C:\\Strawberry\\perl\\bin;D:\\Program '
'Files\\TortoiseSVN\\bin;C:\\Program Files (x86)\\Common '
'Files\\ETAS\\3rdParty1.0;C:\\Program Files (x86)\\Pico '
'Technology\\PicoScope6\\;C:\\Program '
'Files\\dotnet\\;C:\\Perforce\\Helix-QAC-2021.3\\common\\bin;C:\\HighTec\\toolchains\\tricore\\v4.9.3.0-infineon-1.0\\bin;C:\\Users\\grey\\AppData\\Local\\Microsoft\\WindowsApps;D:\\Users\\grey\\AppData\\Local\\Programs\\Microsoft '
'VS '
'Code\\bin;C:\\WindRiver\\compilers\\diab-5.9.6.2\\WIN32\\bin;D:\\Cmder\\bin;D:\\NXP\\S32DS_Power_v2.1\\S32DS\\build_tools\\msys32\\usr\\bin;D:\\ETAS\\RTA-OS\\bin;C:\\Strawberry\\c\\bin;C:\\Program '
'Files (x86)\\Java\\jdk1.7.0_75\\bin',
'PATHEXT': '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.PY;.PYW;.CPL',
'PROCESSOR_ARCHITECTURE': 'AMD64',
'PROCESSOR_IDENTIFIER': 'Intel64 Family 6 Model 140 Stepping 1, '
'GenuineIntel',
'PROCESSOR_LEVEL': '6',
'PROCESSOR_REVISION': '8c01',
'PROGRAMDATA': 'C:\\ProgramData',
'PROGRAMFILES': 'C:\\Program Files',
'PROGRAMFILES(X86)': 'C:\\Program Files (x86)',
'PROGRAMW6432': 'C:\\Program Files',
'PROMPT': '$P$G',
'PSMODULEPATH': 'C:\\Users\\grey\\Documents\\WindowsPowerShell\\Modules;C:\\Program '
'Files\\WindowsPowerShell\\Modules;C:\\Windows\\system32\\WindowsPowerShell\\v1.0\\Modules',
'PUBLIC': 'C:\\Users\\Public',
'RLM_LICENSE': 'C:\\HighTec\\licenses;C:\\SPC5Studio\\licenses',
'SYSTEMDRIVE': 'C:',
'SYSTEMROOT': 'C:\\Windows',
'T32': 'D:\\T32',
'TEMP': 'D:\\AppData\\Local\\Temp',
'TMP': 'D:\\AppData\\Local\\Temp',
'TSIM_CONFIG_DIR': 'C:\\HighTec\\tsim\\1.18.1\\config',
'USERDOMAIN': 'DESKTOP-H943ASL',
'USERDOMAIN_ROAMINGPROFILE': 'DESKTOP-H943ASL',
'USERNAME': 'grey',
'USERPROFILE': 'C:\\Users\\grey',
'WINDIR': 'C:\\Windows',
'WIND_DIAB_PATH': 'C:\\WindRiver\\compilers\\diab-5.9.6.2',
'WIND_HOME': 'C:\\WindRiver',
'WIND_PREFERRED_PACKAGES': 'diab-5.9.6.2',
'WIND_TOOLCHAINS': 'diab',
'WRSD_LICENSE_FILE': 'D:\\WindRiver_AD\\license\\WRSLicense.lic',
'WSLENV': 'WT_SESSION::WT_PROFILE_ID',
'WT_PROFILE_ID': '{61c54bbd-c2c6-5271-96e7-009a87ff44bf}',
'WT_SESSION': '49ae7b51-71fe-4156-abb2-29e3d6182453',
'ZES_ENABLE_SYSMAN': '1'},
'ESCAPE': ,
'F03': 'gfortran',
'F03COM': '$F03 -o $TARGET -c $F03FLAGS $_F03INCFLAGS $_FORTRANMODFLAG '
'$SOURCES',
'F03FLAGS': [],
'F03PPCOM': '$F03 -o $TARGET -c $F03FLAGS $CPPFLAGS $_CPPDEFFLAGS '
'$_F03INCFLAGS $_FORTRANMODFLAG $SOURCES',
'F08': 'gfortran',
'F08COM': '$F08 -o $TARGET -c $F08FLAGS $_F08INCFLAGS $_FORTRANMODFLAG '
'$SOURCES',
'F08FLAGS': [],
'F08PPCOM': '$F08 -o $TARGET -c $F08FLAGS $CPPFLAGS $_CPPDEFFLAGS '
'$_F08INCFLAGS $_FORTRANMODFLAG $SOURCES',
'F77': 'gfortran',
'F77COM': '$F77 -o $TARGET -c $F77FLAGS $_F77INCFLAGS $SOURCES',
'F77FLAGS': [],
'F77PPCOM': '$F77 -o $TARGET -c $F77FLAGS $CPPFLAGS $_CPPDEFFLAGS '
'$_F77INCFLAGS $SOURCES',
'F90': 'gfortran',
'F90COM': '$F90 -o $TARGET -c $F90FLAGS $_F90INCFLAGS $_FORTRANMODFLAG '
'$SOURCES',
'F90FLAGS': [],
'F90PPCOM': '$F90 -o $TARGET -c $F90FLAGS $CPPFLAGS $_CPPDEFFLAGS '
'$_F90INCFLAGS $_FORTRANMODFLAG $SOURCES',
'F95': 'gfortran',
'F95COM': '$F95 -o $TARGET -c $F95FLAGS $_F95INCFLAGS $_FORTRANMODFLAG '
'$SOURCES',
'F95FLAGS': [],
'F95PPCOM': '$F95 -o $TARGET -c $F95FLAGS $CPPFLAGS $_CPPDEFFLAGS '
'$_F95INCFLAGS $_FORTRANMODFLAG $SOURCES',
'FORTRAN': 'gfortran',
'FORTRANCOM': '$FORTRAN -o $TARGET -c $FORTRANFLAGS $_FORTRANINCFLAGS '
'$_FORTRANMODFLAG $SOURCES',
'FORTRANFLAGS': [],
'FORTRANMODDIR': '',
'FORTRANMODDIRPREFIX': '-J',
'FORTRANMODDIRSUFFIX': '',
'FORTRANMODPREFIX': '',
'FORTRANMODSUFFIX': '.mod',
'FORTRANPPCOM': '$FORTRAN -o $TARGET -c $FORTRANFLAGS $CPPFLAGS '
'$_CPPDEFFLAGS $_FORTRANINCFLAGS $_FORTRANMODFLAG $SOURCES',
'FORTRANSUFFIXES': [ '.f',
'.for',
'.ftn',
'.F',
'.FOR',
'.FTN',
'.fpp',
'.FPP',
'.f77',
'.F77',
'.f90',
'.F90',
'.f95',
'.F95',
'.f03',
'.F03',
'.f08',
'.F08'],
'FRAMEWORKPATH': [],
'FRAMEWORKS': [],
'File': ,
'HOST_ARCH': 'x86_64',
'HOST_OS': 'win32',
'IDLSUFFIXES': ['.idl', '.IDL'],
'INCF03PREFIX': '-I',
'INCF03SUFFIX': '',
'INCF08PREFIX': '-I',
'INCF08SUFFIX': '',
'INCF77PREFIX': '-I',
'INCF77SUFFIX': '',
'INCF90PREFIX': '-I',
'INCF90SUFFIX': '',
'INCF95PREFIX': '-I',
'INCF95SUFFIX': '',
'INCFORTRANPREFIX': '-I',
'INCFORTRANSUFFIX': '',
'INCPREFIX': '-I',
'INCSUFFIX': '',
'JAR': 'jar',
'JARCOM': "${TEMPFILE('$_JARCOM','$JARCOMSTR')}",
'JARFLAGS': ['cf'],
'JARSUFFIX': '.jar',
'JAVABOOTCLASSPATH': [],
'JAVAC': 'javac',
'JAVACCOM': "${TEMPFILE('$_JAVACCOM','$JAVACCOMSTR')}",
'JAVACFLAGS': [],
'JAVACLASSPATH': [],
'JAVACLASSSUFFIX': '.class',
'JAVAINCLUDES': [ 'C:\\Program Files (x86)\\Java\\jdk1.7.0_75\\include',
'C:\\Program Files '
'(x86)\\Java\\jdk1.7.0_75\\include\\win32'],
'JAVASOURCEPATH': [],
'JAVASUFFIX': '.java',
'LDMODULE': '$SHLINK',
'LDMODULECOM': '$LDMODULE -o $TARGET $LDMODULEFLAGS $__LDMODULEVERSIONFLAGS '
'$__RPATH $SOURCES $_LIBDIRFLAGS $_LIBFLAGS ',
'LDMODULEEMITTER': [ ,
],
'LDMODULEFLAGS': '$SHLINKFLAGS',
'LDMODULENAME': '${LDMODULEPREFIX}$_get_ldmodule_stem${_LDMODULESUFFIX}',
'LDMODULENOVERSIONSYMLINKS': '$SHLIBNOVERSIONSYMLINKS',
'LDMODULEPREFIX': '$SHLIBPREFIX',
'LDMODULESUFFIX': '$SHLIBSUFFIX',
'LDMODULEVERSION': '$SHLIBVERSION',
'LDMODULE_NOVERSION_SYMLINK': '$_get_shlib_dir${LDMODULEPREFIX}$_get_ldmodule_stem${LDMODULESUFFIX}',
'LDMODULE_SONAME_SYMLINK': '$_get_shlib_dir$_LDMODULESONAME',
'LEX': 'flex',
'LEXCOM': '$LEX $LEXUNISTD $LEXFLAGS -t $SOURCES > $TARGET',
'LEXFLAGS': [],
'LEXUNISTD': [],
'LIBDIRPREFIX': '-L',
'LIBDIRSUFFIX': '',
'LIBLINKPREFIX': '-l',
'LIBLINKSUFFIX': '',
'LIBPREFIX': 'lib',
'LIBPREFIXES': ['$LIBPREFIX'],
'LIBSUFFIX': '.a',
'LIBSUFFIXES': ['$LIBSUFFIX'],
'LINESEPARATOR': '\n',
'LINK': 'dcc',
'LINKCOM': '$LINK -o $TARGET $LINKFLAGS $__RPATH $SOURCES $_LIBDIRFLAGS '
'$_LIBFLAGS',
'LINKFLAGS': '-tPPCE200Z0VES -m14 > test.map ./lf/56xx_flash.dld',
'MAXLINELENGTH': 2048,
'OBJPREFIX': '',
'OBJSUFFIX': '.o',
'PLATFORM': 'win32',
'PROGPREFIX': '',
'PROGSUFFIX': '.elf',
'PSPAWN': ,
'RANLIB': 'ranlib',
'RANLIBCOM': '$RANLIB $RANLIBFLAGS $TARGET',
'RANLIBFLAGS': [],
'RDirs': ,
'RMIC': 'rmic',
'RMICCOM': '$RMIC $RMICFLAGS -d ${TARGET.attributes.java_lookupdir} '
'-classpath ${SOURCE.attributes.java_classdir} '
'${SOURCES.attributes.java_classname}',
'RMICFLAGS': [],
'RPATHPREFIX': '-Wl,-rpath=',
'RPATHSUFFIX': '',
'SCANNERS': [],
'SHCC': '$CC',
'SHCCCOM': '$SHCC -o $TARGET -c $SHCFLAGS $SHCCFLAGS $_CCCOMCOM $SOURCES',
'SHCCFLAGS': ['$CCFLAGS'],
'SHCFLAGS': ['$CFLAGS'],
'SHCXX': '$CXX',
'SHCXXCOM': '$SHCXX -o $TARGET -c $SHCXXFLAGS $SHCCFLAGS $_CCCOMCOM $SOURCES',
'SHCXXFLAGS': ['$CXXFLAGS'],
'SHDC': '$DC',
'SHDCOM': '$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS -c -fPIC '
'-of$TARGET $SOURCES',
'SHDLINK': '$DC',
'SHDLINKCOM': '$DLINK -of$TARGET $SHDLINKFLAGS $__SHDLIBVERSIONFLAGS '
'$__DRPATH $SOURCES $_DLIBDIRFLAGS $_DLIBFLAGS',
'SHDLINKFLAGS': ['$DLINKFLAGS', '-shared', '-defaultlib=libphobos2.so'],
'SHELL': 'C:\\Windows\\System32\\cmd.exe',
'SHF03': '$F03',
'SHF03COM': '$SHF03 -o $TARGET -c $SHF03FLAGS $_F03INCFLAGS $_FORTRANMODFLAG '
'$SOURCES',
'SHF03FLAGS': ['$F03FLAGS'],
'SHF03PPCOM': '$SHF03 -o $TARGET -c $SHF03FLAGS $CPPFLAGS $_CPPDEFFLAGS '
'$_F03INCFLAGS $_FORTRANMODFLAG $SOURCES',
'SHF08': '$F08',
'SHF08COM': '$SHF08 -o $TARGET -c $SHF08FLAGS $_F08INCFLAGS $_FORTRANMODFLAG '
'$SOURCES',
'SHF08FLAGS': ['$F08FLAGS'],
'SHF08PPCOM': '$SHF08 -o $TARGET -c $SHF08FLAGS $CPPFLAGS $_CPPDEFFLAGS '
'$_F08INCFLAGS $_FORTRANMODFLAG $SOURCES',
'SHF77': '$F77',
'SHF77COM': '$SHF77 -o $TARGET -c $SHF77FLAGS $_F77INCFLAGS $SOURCES',
'SHF77FLAGS': ['$F77FLAGS'],
'SHF77PPCOM': '$SHF77 -o $TARGET -c $SHF77FLAGS $CPPFLAGS $_CPPDEFFLAGS '
'$_F77INCFLAGS $SOURCES',
'SHF90': '$F90',
'SHF90COM': '$SHF90 -o $TARGET -c $SHF90FLAGS $_F90INCFLAGS $_FORTRANMODFLAG '
'$SOURCES',
'SHF90FLAGS': ['$F90FLAGS'],
'SHF90PPCOM': '$SHF90 -o $TARGET -c $SHF90FLAGS $CPPFLAGS $_CPPDEFFLAGS '
'$_F90INCFLAGS $_FORTRANMODFLAG $SOURCES',
'SHF95': '$F95',
'SHF95COM': '$SHF95 -o $TARGET -c $SHF95FLAGS $_F95INCFLAGS $_FORTRANMODFLAG '
'$SOURCES',
'SHF95FLAGS': ['$F95FLAGS'],
'SHF95PPCOM': '$SHF95 -o $TARGET -c $SHF95FLAGS $CPPFLAGS $_CPPDEFFLAGS '
'$_F95INCFLAGS $_FORTRANMODFLAG $SOURCES',
'SHFORTRAN': '$FORTRAN',
'SHFORTRANCOM': '$SHFORTRAN -o $TARGET -c $SHFORTRANFLAGS $_FORTRANINCFLAGS '
'$_FORTRANMODFLAG $SOURCES',
'SHFORTRANFLAGS': ['$FORTRANFLAGS'],
'SHFORTRANPPCOM': '$SHFORTRAN -o $TARGET -c $SHFORTRANFLAGS $CPPFLAGS '
'$_CPPDEFFLAGS $_FORTRANINCFLAGS $_FORTRANMODFLAG $SOURCES',
'SHLIBEMITTER': [ ,
],
'SHLIBNAME': '${_get_shlib_dir}${SHLIBPREFIX}$_get_shlib_stem${_SHLIBSUFFIX}',
'SHLIBPREFIX': '',
'SHLIBSONAMEFLAGS': '-Wl,-soname=$_SHLIBSONAME',
'SHLIBSUFFIX': '.dll',
'SHLIB_NOVERSION_SYMLINK': '${_get_shlib_dir}${SHLIBPREFIX}$_get_shlib_stem${SHLIBSUFFIX}',
'SHLIB_SONAME_SYMLINK': '${_get_shlib_dir}$_SHLIBSONAME',
'SHLINK': '$LINK',
'SHLINKCOM': '$SHLINK -o $TARGET $SHLINKFLAGS $__SHLIBVERSIONFLAGS $__RPATH '
'$SOURCES $_LIBDIRFLAGS $_LIBFLAGS',
'SHLINKFLAGS': ['$LINKFLAGS', '-shared'],
'SHOBJPREFIX': '$OBJPREFIX',
'SHOBJSUFFIX': '.os',
'SMARTLINK': ,
'SPAWN': ,
'STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME': 0,
'SUBSTFILEPREFIX': '',
'SUBSTFILESUFFIX': '',
'TAR': 'tar',
'TARCOM': '$TAR $TARFLAGS -f $TARGET $SOURCES',
'TARFLAGS': ['-c'],
'TARGET_ARCH': None,
'TARGET_OS': None,
'TARSUFFIX': '.tar',
'TEMPFILE': ,
'TEMPFILEARGESCFUNC': ,
'TEMPFILEARGJOIN': ' ',
'TEMPFILEPREFIX': '@',
'TEXTFILEPREFIX': '',
'TEXTFILESUFFIX': '.txt',
'TOOLS': [ 'default',
'gnulink',
'gcc',
'g++',
'gfortran',
'gas',
'ar',
'dmd',
'filesystem',
'lex',
'jar',
'javac',
'rmic',
'tar',
'zip',
'textfile'],
'WIXCANDLE': 'candle.exe',
'WIXLIGHT': 'light.exe',
'ZIP': 'zip',
'ZIPCOM': ,
'ZIPCOMPRESSION': 8,
'ZIPFLAGS': [],
'ZIPROOT': [],
'ZIPSUFFIX': '.zip',
'_CCCOMCOM': '$CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS',
'_CPPDEFFLAGS': '${_defines(CPPDEFPREFIX, CPPDEFINES, CPPDEFSUFFIX, __env__, '
'TARGET, SOURCE)}',
'_CPPINCFLAGS': '${_concat(INCPREFIX, CPPPATH, INCSUFFIX, __env__, RDirs, '
'TARGET, SOURCE, affect_signature=False)}',
'_DDEBUGFLAGS': '${_concat(DDEBUGPREFIX, DDEBUG, DDEBUGSUFFIX, __env__)}',
'_DFLAGS': '${_concat(DFLAGPREFIX, DFLAGS, DFLAGSUFFIX, __env__)}',
'_DINCFLAGS': '${_concat(DINCPREFIX, DPATH, DINCSUFFIX, __env__, RDirs, '
'TARGET, SOURCE)}',
'_DLIBDIRFLAGS': '${_concat(DLIBDIRPREFIX, LIBPATH, DLIBDIRSUFFIX, __env__, '
'RDirs, TARGET, SOURCE)}',
'_DLIBFLAGS': '${_stripixes(DLIBLINKPREFIX, LIBS, DLIBLINKSUFFIX, '
'LIBPREFIXES, LIBSUFFIXES, __env__)}',
'_DRPATH': '${_concat(DRPATHPREFIX, RPATH, DRPATHSUFFIX, __env__)}',
'_DVERFLAGS': '${_concat(DVERPREFIX, DVERSIONS, DVERSUFFIX, __env__)}',
'_F03INCFLAGS': '${_concat(INCF03PREFIX, F03PATH, INCF03SUFFIX, __env__, '
'RDirs, TARGET, SOURCE, affect_signature=False)}',
'_F08INCFLAGS': '${_concat(INCF08PREFIX, F08PATH, INCF08SUFFIX, __env__, '
'RDirs, TARGET, SOURCE, affect_signature=False)}',
'_F77INCFLAGS': '${_concat(INCF77PREFIX, F77PATH, INCF77SUFFIX, __env__, '
'RDirs, TARGET, SOURCE, affect_signature=False)}',
'_F90INCFLAGS': '${_concat(INCF90PREFIX, F90PATH, INCF90SUFFIX, __env__, '
'RDirs, TARGET, SOURCE, affect_signature=False)}',
'_F95INCFLAGS': '${_concat(INCF95PREFIX, F95PATH, INCF95SUFFIX, __env__, '
'RDirs, TARGET, SOURCE, affect_signature=False)}',
'_FORTRANINCFLAGS': '${_concat(INCFORTRANPREFIX, FORTRANPATH, '
'INCFORTRANSUFFIX, __env__, RDirs, TARGET, SOURCE, '
'affect_signature=False)}',
'_FORTRANMODFLAG': '$( ${_concat(FORTRANMODDIRPREFIX, FORTRANMODDIR, '
'FORTRANMODDIRSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)',
'_JARCOM': '$JAR $_JARFLAGS $TARGET $_JARMANIFEST $_JARSOURCES',
'_JARFLAGS': ,
'_JARMANIFEST': ,
'_JARSOURCES': ,
'_JAVABOOTCLASSPATH': '${_javapathopt("-bootclasspath", '
'"JAVABOOTCLASSPATH")} ',
'_JAVACCOM': '$JAVAC $JAVACFLAGS $_JAVABOOTCLASSPATH $_JAVACLASSPATH -d '
'${TARGET.attributes.java_classdir} $_JAVASOURCEPATH $SOURCES',
'_JAVACLASSPATH': '${_javapathopt("-classpath", "JAVACLASSPATH")} ',
'_JAVASOURCEPATH': '${_javapathopt("-sourcepath", "JAVASOURCEPATH", '
'"_JAVASOURCEPATHDEFAULT")} ',
'_JAVASOURCEPATHDEFAULT': '${TARGET.attributes.java_sourcedir}',
'_LDMODULESONAME': ,
'_LDMODULESOVERSION': ,
'_LDMODULESUFFIX': '${LDMODULESUFFIX}${_LDMODULEVERSION}',
'_LDMODULEVERSION': ,
'_LDMODULEVERSIONFLAGS': '$LDMODULEVERSIONFLAGS -Wl,-soname=$_LDMODULESONAME',
'_LIBDIRFLAGS': '${_concat(LIBDIRPREFIX, LIBPATH, LIBDIRSUFFIX, __env__, '
'RDirs, TARGET, SOURCE, affect_signature=False)}',
'_LIBFLAGS': '${_stripixes(LIBLINKPREFIX, LIBS, LIBLINKSUFFIX, LIBPREFIXES, '
'LIBSUFFIXES, __env__)}',
'_RPATH': '${_concat(RPATHPREFIX, RPATH, RPATHSUFFIX, __env__)}',
'_SHDLIBVERSIONFLAGS': '$SHDLIBVERSIONFLAGS -L-soname=$_SHLIBSONAME',
'_SHLIBSONAME': ,
'_SHLIBSOVERSION': ,
'_SHLIBSUFFIX': '${SHLIBSUFFIX}${_SHLIBVERSION}',
'_SHLIBVERSION': "${SHLIBVERSION and '.'+SHLIBVERSION or ''}",
'_SHLIBVERSIONFLAGS': '$SHLIBVERSIONFLAGS -Wl,-soname=$_SHLIBSONAME',
'__DSHLIBVERSIONFLAGS': '${__libversionflags(__env__,"DSHLIBVERSION","_DSHLIBVERSIONFLAGS")}',
'__LDMODULEVERSIONFLAGS': '${__libversionflags(__env__,"LDMODULEVERSION","_LDMODULEVERSIONFLAGS")}',
'__SHLIBVERSIONFLAGS': '${__libversionflags(__env__,"SHLIBVERSION","_SHLIBVERSIONFLAGS")}',
'__lib_either_version_flag': ,
'__libversionflags': ,
'_concat': ,
'_defines': ,
'_get_ldmodule_stem': ,
'_get_shlib_dir': ,
'_get_shlib_stem': ,
'_javapathopt': ,
'_stripixes': ,
'tools': ['gcc', 'gnulink']}
scons: done reading SConscript files.
这里面的信息就很有参考价值了,但是这些信息是大而全的信息。我们需要关注的是其中的C语言相关的。一部分比较值得关注的信息整理如下:
AR,这个是用来创建归档库文件的工具命令。
ARCOM,可以用来定制AR的命令格式,COM我觉得应该是COMMAND的缩写,后面遇到的COM缩写还很多。
ARFLAGS,这个是AR命令的参数配置。
AS,汇编器命令
ASCOM,汇编的指令格式控制
ASFLAGS,汇编选项
CC, C编译器
CCCOM,C编译器的命令格式控制
CCFLAGS,C编译器的编译选项
CCVERSION,C编译器的版本(如果有多个版本安装,可以支持选择)
CFILESUFFIX,C语言文件的后缀
LINK,链接器命令
LINKCOM,链接器的命令格式控制
LINKFLAGS,链接选项
OBJSUFFIX,目标文件的后缀名,用来控制编译后的目标文件的后缀
PROGSUFFIX,可执行文件的后缀名

如果针对我们嵌入式C语言的开发,这几个关键的参数的调整在一定程度上就可以支持简单的自定义选择工具了。

问题3:接下来,梳理我遇到的第3个问题:可执行文件找不到。通过相关的信息分析,感觉系统中的很多信息获取失败了。尽管我在Environment中设置各种PATH信息了,但是依然没有成功。我又尝试了直接指定路径信息,依然没有彻底解决。后来找到了一个直接从操作系统继承的方法:

env = Environment(ENV=os.environ.copy())

增加了上面的信息之后,Windows下的可执行文件的自动查找都成功了。

问题4: 速度优化问题。

num_cpu = int(os.environ.get('NUM_CPU', 2))

SetOption('num_jobs', num_cpu)

这样的配置可以有一定的效果,不过要想在编译的时候加速,最好还是直接socns -jx,其中x是你想采用的进程数目。

问题4:工程文件的自动识别。

最初,这个问题我是计划直接用脚本来更新SConstruct文件的。但是既然SConstruct文件可以执行部分python代码,我先做了直接在SConstruct中增加python代码的方式来实现。

1232_使用SCons实现WindRiver Diab编译器的命令行自动化编译环境_windows_04

一个目录遍历,基本上就搞定了全部的目录以及文件了。尝试了编译,相关的文件全都可以正常识别。

问题5:WindRiver Diab配置关键问题:

1,汇编器的名称其实是dcc而不是das,至少从IDE的信息抄过来是这样的。最初我编译汇编代码的时候用了das,配合指令格式和选项,编译报错。修正为gcc后,解决了部分错误。

2,汇编的命令格式与默认模板不同,因此这个模板需求做修改。这部分参考最后的配置文件信息。

3,目标文件的后缀为.o,如果不设置,可能默认是.obj,进而出现错误。

4,link文件的指定放到链接选项之中,且需要注意目录信息的正确性。

5,库文件的管理在Program builder method中控制,如果是自己编译出来的还需要指明目录信息。

附录:

  1. 配置文件

################################################################################

# 2022.04, zhangguolei
# Finish the first version which can support WindRiver Diab compiler on
# SPC560x platform.
#
import os
env = DefaultEnvironment(tools=['gcc', 'gnulink'], CC = 'dcc')
env = Environment(ENV=os.environ.copy())
# add this can enhance the performance of the build process.
num_cpu = int(os.environ.get('NUM_CPU', 2))
SetOption('num_jobs', num_cpu)
# this configuration is useless for building, yet it can reduce a warning for
# compiler on Windows OS.
env['tools'] = ['gcc', 'gnulink']
env['CC'] = 'dcc'
env['AR'] = 'dar'
env['AS'] = 'dcc'
env['ASCOM'] = '$AS -c $SOURCES -o $TARGET $ASFLAGS'
env['LINK'] = 'dld'
env['CCVERSION'] = '5.9.6.2'
env['CCFLAGS'] = '-tPPCE200Z0VES -DSTART_FROM_FLASH -DMPC560xB -DDISABLE_SWT -g3 -Xmake-dependency=0x5 -ei1824 -XO -Xwhole-program-optim=0 -Xdebug-local-cie -Xnested-interrupts -Xsmall-data=8 -Xsmall-const=0 -Xapu-volatile-context -Xpragma-section-first -Xenum-is-int '
env['ASFLAGS'] = '-tPPCE200Z0VES -Xpreprocess-assembly -DSTART_FROM_FLASH -DMPC560xB -DDISABLE_SWT -g '
# libs are managed by the builder method.
env['LINKFLAGS'] = '-tPPCE200Z0VES -m14 > test.map ./lf/56xx_flash.dld'
# should be changed according to specified toolset.
env['OBJSUFFIX'] = '.o'
env['PROGSUFFIX'] = '.elf'
cpppath_list = []
c_files_list = []
dir_now = os.getcwd()
for root, dirs, files in os.walk(dir_now):
if '.git' not in root:
cpppath_list.append(root.replace('\\', '\\\\'))
os.chdir(root)
for f in files:
f_l = f.lower()
if f_l.endswith('.c') or f_l.endswith('.s'):
src_file_name = root.replace('\\', '\\\\') + '/' + f
c_files_list.append(src_file_name)
os.chdir(dir_now)
# manage libs here.
env.Program('test', c_files_list, CPPPATH = cpppath_list, LIBS = ['m', 'c', 'stlstd', 'RTAOS'], LIBPATH = ['./libs'])
# build according to timeStamp.
env.Decider('make')


举报

相关推荐

0 条评论