文件操作

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
后面进行添加