您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“如何集成armcc到scons”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“如何集成armcc到scons”這篇文章吧。
集成 armcc 到 scons 中并不是件容易的事情,如果只是修改 CC/CXX/AR/LINK 幾個(gè)環(huán)境變量,scons 會(huì)用 Visual C++的參數(shù)調(diào)用方式,比如-c 成了/c,導(dǎo)致 armcc 無(wú)法識(shí)別。
花了半天時(shí)間去閱讀 scons 的源碼后,在 SCons/Tool 目錄下發(fā)現(xiàn),每種編譯器都有一個(gè)類似插件的 tool,目測(cè)沒(méi)有發(fā)現(xiàn) armcc 的 tool,自己為 armcc 寫(xiě)一個(gè) tool,應(yīng)該可以解決這個(gè)問(wèn)題。
在 ToolsForFools 這篇文章中,了解到可以自己定義 tool,只要放到項(xiàng)目的 site_scons/site_tools 目錄下即可。
為了支持 armcc,我們?cè)?site_scons/site_tools/armcc 目錄中創(chuàng)建一個(gè) armcc 的 tool,從頭編寫(xiě)一個(gè) tool 還是比較麻煩的,考慮到 armcc 和 cc 類似,就直接把 SCons/Tool/cc.py 拷貝到 site_scons/site_tools/armcc/__init__.py,然后在此基礎(chǔ)上進(jìn)行修改。
在下面這行代碼之后
add_common_cc_variables(env)
增加下面的代碼:
armcc = SCons.Tool.find_program_path(env, 'armcc.exe'); armar = SCons.Tool.find_program_path(env, 'armar.exe'); armlink = SCons.Tool.find_program_path(env, 'armlink.exe'); env['CC'] = armcc env['CXX'] = armcc env['AR'] = armar env['LINK'] = armlink env['CXXCOM'] = '$CC -o $TARGET -c $CFLAGS $CCFLAGS $_CCCOMCOM $SOURCES' env['ARFLAGS'] = SCons.Util.CLVar('--create -r') env['ARCOM'] = '$AR $ARFLAGS $TARGET $SOURCES' env['OBJSUFFIX'] = '.o' env['LIBPREFIX'] = 'lib' env['LIBSUFFIX'] = '.a'
參考 scons 的 Tool 中的代碼,在 SConstruct 文件中,加入下面的代碼,來(lái)啟用我們前面定義的 armcc:
env = DefaultEnvironment(); SCons.Tool.Tool('armcc')(env)
使用 scons 編譯,編譯正常了,但是在 armar 生成.a 文件時(shí),出現(xiàn)下面的錯(cuò)誤:
The command line is too long.
這主要是.o 文件太多所致,armar 并不像 ar 那樣可以通過(guò)@符合去文件讀取參數(shù),不過(guò) armar 可以先創(chuàng)建一個(gè).a 文件,然后一個(gè)一個(gè)的往里面追加.o 文件。
從 scons 的源碼發(fā)現(xiàn),命令最終是在 SCons/Platform/win32.py 里調(diào)用的。但這是系統(tǒng)文件,直接修改它并不明智,我們還是寫(xiě)一個(gè) tool 來(lái)解決這個(gè)問(wèn)題吧。
為了避免從頭去實(shí)現(xiàn),把 SCons/Platform/win32.py 拷貝到 site_scons/site_tools/win4armcc/__init__.py,然后再去修改。
先修改下面幾個(gè)變量的值為:
env['OBJSUFFIX'] = '.o' env['LIBPREFIX'] = 'lib' env['LIBSUFFIX'] = '.a'
增加一個(gè) exists 函數(shù)
def exists(env): return True
重新實(shí)現(xiàn) spawn 函數(shù)。
def exe_ar(sh, cmd, args, env): armar = args[0] #args[1] is --create #args[2] is -r target = args[3]; objs = args[4:] for i in range(len(objs)): ARFLAGS='-r' if i == 0: ARFLAGS='--create -r' all_args= [armar, target, ARFLAGS, objs[i] ] sargs = ' '.join(all_args).replace('\\', '/'); print(str(i) + ': ' + sargs); exec_spawn([sh, '/C', sargs], env) def spawn(sh, escape, cmd, args, env): if cmd.endswith('armar.exe'): exe_ar(sh, cmd, args, env); else: sargs = ' '.join(args).replace('\\', '/'); return exec_spawn([sh, '/C', sargs], env)
同樣,在 SConstruct 文件中啟用 win4armcc。
SCons.Tool.Tool('win4armcc')(env)
好了,現(xiàn)在可以用scons調(diào)用armcc了。
以上是“如何集成armcc到scons”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。