文件操作
SCons
提供了一套针对文件的操作,可以不依赖特定平台,方便进行移植。主要提供了 copy,
等操作函数,下面进行介绍。
Command 执行命令
可以通过 Command
来执行一些功能程序,参数意义如下:
Command(target, source, action)
# target: 目标文件
# source: 源文件
# action: 执行动作
# 执行修改文件,拷贝文件,删除文件
Command(
target.out,
source.in,
action = [
Copy("tempfile", "$(source.in)"),
"modify tempfile",
Copy("$(target.out)", "tempfile"),
Delate("tempfile")
]
)
action
可以是 copy, delete,
Copy 拷贝函数
执行拷贝函数,可以看到执行了 Copy("hello_copy.c", "hello.c")
函数,且当前目录下,可以看到 hello_copy.c
的文件,内容和 hello.c
一样。执行 scons -c
还会删除赋值的文件。
Command("hello_copy.c", "hello.c", Copy("$TARGET", "$SOURCE"))
admin@DESKTOP-NQU1HUV C:\Users\admin\Desktop\scons\day7
$ scons -Q
Copy("hello_copy.c", "hello.c")
admin@DESKTOP-NQU1HUV C:\Users\admin\Desktop\scons\day7
$ scons -Q -c
Removed hello_copy.c
Delete 删除函数
执行删除函数,可以看到执行了 Copy, Copy, Delete
三个步骤,且在最后文件夹内可以看到没有 tempfile
的文件。
# SConstruct
Command(
"hello_copy.c",
"hello.c",
action=[
Copy("tempfile", "$SOURCE"),
Copy("$TARGET", "tempfile"),
Delete("tempfile"),
],
)
admin@DESKTOP-NQU1HUV C:\Users\admin\Desktop\scons\day7
$ scons -Q
Copy("tempfile", "hello.c")
Copy("hello_copy.c", "tempfile")
Delete("tempfile")
admin@DESKTOP-NQU1HUV C:\Users\admin\Desktop\scons\day7
$ ls
SConscript hello.c hello.o hello_copy.c var.py
SConstruct hello.exe hello2.c inc.h version.c
Move (rename) 移动文件/重命名文件 函数
Command(
"hello_copy.c",
"hello.c",
action=[
Copy("tempfile", "$SOURCE"),
Move("$TARGET", "tempfile"),
],
)
执行结果:可以看到,最后一步是将 tempfile
重命名为 hello_copy.c
,且文件内也没有 hello_copy.c
了。
admin@DESKTOP-NQU1HUV C:\Users\admin\Desktop\scons\day7
$ scons -Q
Copy("tempfile", "hello.c")
Move("hello_copy.c", "tempfile")
admin@DESKTOP-NQU1HUV C:\Users\admin\Desktop\scons\day7
$ ls
SConscript hello.c hello.o hello_copy.c var.py
SConstruct hello.exe hello2.c inc.h version.c
Touch 更新文件时间
可以使用 Touch
来更新文件修改时间,和之前介绍的 Decider('timestamp-newer')
共同使用,在处理完文件后,进行编译。
修改 SConstruct
文件,内容如下;
Command(
"hello_copy.c",
"hello.c",
action=[
Copy("$TARGET", "$SOURCE"),
Touch("$TARGET"),
]
)
执行结果如下:可以看到 hello_copy.c
的修改时间和 hello.c
的修改时间是不一致的。同样,可以看到第一次拷贝后,两个文件的修改时间是一致的。
admin@DESKTOP-NQU1HUV C:\Users\admin\Desktop\scons\day7
$ ls -all hello*.c
-rw-r--r-- 1 admin Administrators 185 Oct 1 15:17 hello.c
-rw-r--r-- 1 admin Administrators 129 Sep 29 22:21 hello2.c
-rw-r--r-- 1 admin Administrators 185 Oct 1 15:17 hello_copy.c
admin@DESKTOP-NQU1HUV C:\Users\admin\Desktop\scons\day7
$ scons -Q -c
Removed hello_copy.c
admin@DESKTOP-NQU1HUV C:\Users\admin\Desktop\scons\day7
$ scons -Q
Copy("hello_copy.c", "hello.c")
Touch("hello_copy.c")
admin@DESKTOP-NQU1HUV C:\Users\admin\Desktop\scons\day7
$ ls -all hello*.c
-rw-r--r-- 1 admin Administrators 185 Oct 1 15:17 hello.c
-rw-r--r-- 1 admin Administrators 129 Sep 29 22:21 hello2.c
-rw-r--r-- 1 admin Administrators 185 Oct 1 19:01 hello_copy.c
Mkdir 创建目录
Command(
"file.out",
"file.in",
action=[
Mkdir("tempdir"),
],
)
可以按到 tempdir
正常被创建成功。
admin@DESKTOP-NQU1HUV C:\Users\admin\Desktop\scons\day7
$ scons -Q
Mkdir("tempdir")
admin@DESKTOP-NQU1HUV C:\Users\admin\Desktop\scons\day7
$ ls
SConscript hello.c hello.o inc.h var.py
SConstruct hello.exe hello2.c tempdir version.c
Chmod 修改文件或者文件夹的权限
该命令在 Windows
下不知道是否可以正常使用。
Command(
"hello_copy.c",
"hello.c",
action=[
Copy("$TARGET", "$SOURCE"),
Chmod("$TARGET", 0o777),
]
)
结果没有正常执行,后面进行补充。
Execute
后面进行补充
目标的删除
目标在需要重新构建之前需要删除老旧的目标文件,或者执行 -c
的参数时,也会删除当前的目标文件。
如果有一个 Lib
文件,在目标构建之间不想被删除,可以使用 Precious
来控制当前库文件不被删除。但是执行 -c
也会删除这个库文件。
env = Environment(RANLIBCOM='')
lib = env.Library('hello', ['hello.c'])
env.Precious(lib)
env.Program('hello_exe', ['hello2.c'], LIBS = lib)
admin@DESKTOP-NQU1HUV C:\Users\admin\Desktop\scons\day7
$ scons -Q
gcc -o hello.o -c hello.c
gcc -o hello2.o -c hello2.c
ar rc libhello.a hello.o
gcc -o hello_exe.exe hello2.o libhello.a
admin@DESKTOP-NQU1HUV C:\Users\admin\Desktop\scons\day7
$ scons -Q
gcc -o hello2.o -c hello2.c
gcc -o hello_exe.exe hello2.o libhello.a
正常在使用 scons -c
时,会删除所有的构建后的文件,但是如果在输入 -c
后有不想删除的文件,可以使用 NoClean
来指定不被删除的文件。
env = Environment(RANLIBCOM='')
lib = env.Library('hello', ['hello.c'])
env.NoClean(lib)
env.Program('hello_exe', ['hello2.c'], LIBS = lib)
可以看出在执行 scons -c
之后 libhello.a
没有被删除。
admin@DESKTOP-NQU1HUV C:\Users\admin\Desktop\scons\day7
$ scons -Q
gcc -o hello.o -c hello.c
gcc -o hello2.o -c hello2.c
ar rc libhello.a hello.o
gcc -o hello_exe.exe hello2.o libhello.a
admin@DESKTOP-NQU1HUV C:\Users\admin\Desktop\scons\day7
$ scons -Q -c
Removed hello.o
Removed hello2.o
Removed hello_exe.exe
Clean
后面进行添加