無意中看到了乙個用python來寫makefile的工具scons,使用了一下,感覺還不錯,記錄一下。
pip install scons
以之前構建的freertos的simulator做範例。
首先需要在目錄下建立乙個名為sconstruct的檔案,scons通過解析該檔案來進行編譯。
我們在檔案中首先先定義需要編譯哪些objects,具體格式如下:
obj = object([c files], ccflags = '', cpppath = [h files])
其中[c files]指定我們需要編譯哪些c檔案
ccflags指定編譯選項
cpppath指定編譯需要的標頭檔案的路徑
對於我們這個project,具體可設定如下:
obj = object([
'./freertos_kernel/croutine.c',
'./freertos_kernel/list.c',
'./freertos_kernel/queue.c',
'./freertos_kernel/tasks.c',
'./freertos_kernel/portable/gcc/posix/port.c',
'./freertos_kernel/portable/memmang/heap_3.c',
'./src/main.c'
], ccflags= '-duse_stdio=1 -d__gcc_posix__=1',
cpppath =
['./inc', './freertos_kernel/include', './freertos_kernel/portable/gcc/posix']
)
object編譯好之後,就可以生成可執行檔案了:
program('simulator_linux.bin', obj, libs=['pthread'])
program表示我們需要編譯的target是可執行檔案
『simulator_linux.bin』 指定了可執行檔案的名字
obj就是我們剛剛上面編譯後的objects
libs指定了我們需要鏈結的lib庫為pthread.
okay,全部搞定,在sconstruct檔案所在目錄執行』scons』就可以直接編譯了,使用』scons -c』就可以清除掉編譯出來的所有檔案。
效果如下:
root@ubuntu:~/desktop/simulator_linux$ scons
scons: reading sconscript files ...
scons: done reading sconscript files.
scons: building targets ...
gcc -o freertos_kernel/croutine.o -c -duse_stdio=1 -d__gcc_posix__=1 -iinc -ifreertos_kernel/include -ifreertos_kernel/portable/gcc/posix freertos_kernel/croutine.c
gcc -o freertos_kernel/list.o -c -duse_stdio=1 -d__gcc_posix__=1 -iinc -ifreertos_kernel/include -ifreertos_kernel/portable/gcc/posix freertos_kernel/list.c
gcc -o freertos_kernel/portable/gcc/posix/port.o -c -duse_stdio=1 -d__gcc_posix__=1 -iinc -ifreertos_kernel/include -ifreertos_kernel/portable/gcc/posix freertos_kernel/portable/gcc/posix/port.c
gcc -o freertos_kernel/portable/memmang/heap_3.o -c -duse_stdio=1 -d__gcc_posix__=1 -iinc -ifreertos_kernel/include -ifreertos_kernel/portable/gcc/posix freertos_kernel/portable/memmang/heap_3.c
gcc -o freertos_kernel/queue.o -c -duse_stdio=1 -d__gcc_posix__=1 -iinc -ifreertos_kernel/include -ifreertos_kernel/portable/gcc/posix freertos_kernel/queue.c
gcc -o freertos_kernel/tasks.o -c -duse_stdio=1 -d__gcc_posix__=1 -iinc -ifreertos_kernel/include -ifreertos_kernel/portable/gcc/posix freertos_kernel/tasks.c
gcc -o src/main.o -c -duse_stdio=1 -d__gcc_posix__=1 -iinc -ifreertos_kernel/include -ifreertos_kernel/portable/gcc/posix src/main.c
gcc -o simulator_linux.bin freertos_kernel/croutine.o freertos_kernel/list.o freertos_kernel/queue.o freertos_kernel/tasks.o freertos_kernel/portable/gcc/posix/port.o freertos_kernel/portable/memmang/heap_3.o src/main.o -lpthread
scons: done building targets.
root@ubuntu:~/desktop/simulator_linux$ ls
freertos_kernel makefile simulator_linux.bin subdir.mk
inc sconstruct src tmp
root@ubuntu:~/desktop/simulator_linux$ scons -c
scons: reading sconscript files ...
scons: done reading sconscript files.
scons: cleaning targets ...
removed freertos_kernel/croutine.o
removed freertos_kernel/list.o
removed freertos_kernel/portable/gcc/posix/port.o
removed freertos_kernel/portable/memmang/heap_3.o
removed freertos_kernel/queue.o
removed freertos_kernel/tasks.o
removed src/main.o
removed simulator_linux.bin
scons: done cleaning targets.
root@ubuntu:~/desktop/simulator_linux$ ls
freertos_kernel inc makefile sconstruct src subdir.mk tmp
完整**見github. scons使用說明
前言 make 這個工具自上個世紀 70 年代 stuart feldman 在貝爾實驗室開發出以來,就一直是類 unix 程式設計師的最愛之一。通過檢查檔案的修改時間,make 工具可以知道編譯目標檔案所要依賴的其他檔案。在複雜的專案中,如果只有少數幾個檔案修改過,make 工具知道僅僅需要對哪些...
scons安裝和使用
1.scons是神馬?scons是linux下的自動構建工具,類似cmake。2.安裝 wget tar zxvf scons 2.2.0.tar.gz cd scons 2.2.0 python setup.py install 正常情況下,scons將安裝到 bin 下 3.hello worl...
scons 使用VariantDir 說明
將編譯生成的檔案和源 目錄相互分離 variantdir variant dir,src dir,duplicate env.variantdir variant dir,src dir,duplicate sconscript script,variant dir,duplicate varian...