@[toc]
说明
- Linux C/C++项目构建过程,有个必要的步骤“install”,在Makefile中时常会有一个专门的recipe来做这件事。
安装流程需要做以下类型事情:
- 文件的拷贝(最基本)
- 目录结构的创建
- 程序的strip
- 文件的属性,权限,ower等设置
- …
实现
对于初学者可以会采用cp、mkdir、strip、chmod等基础命令组合来完成项目的安装工作,但是在稍大项目中,你会发现使用cp等基础命令会需要写很多相似甚至重复的代码以及完成一项工作需要使用多个基础命令,这时可以采用一些更高级的命令,例如:install。
install
#install是专门的安装命令, 常见用法如下:
install [选项]... [ -T ] 源文件 目标文件
install [选项]... 源文件... 目录
install [选项]... -t 目录 源文件...
install [选项]... -d 目录...
--backup [=CONTROL] #为每个已存在的文件创建备份
-b #类似 --backup 但不接受参数
-c #(忽略)
-C , --compare #比较每组源文件和目标文件,在一些情况下不修改目标文件
-d , --directory #将所有参数视为目录名称;为指定的目录创建所有组件
-D
#create all leading components of DEST except the last,or all components of --target-directory,then copy SOURCE to DEST
-g , --group=GROUP set group ownership, instead of process' current group
-m , --mode=MODE set permission mode (as in chmod), instead of rwxr -xr -x
-o , --owner=OWNER set ownership (super -user only)
-p , --preserve -timestamps #修改源文件的访问/修改时间以与目标文件保持一致
-s , --strip #拆解符号表
--strip -program=程序 #指定拆解二进制文件的程序
-S , --suffix=后缀 #覆盖常用备份文件后缀
-t , --target -directory=目录 #将源文件所有参数复制到指定目录
-T , --no -target -directory #将目标文件视为普通文件
-v , --verbose 创建目录时显示其名称
--preserve -context preserve SELinux security context
-Z set SELinux security context of destination
file to default type
--context [=CTX] like -Z , or if CTX is specified then set the
SELinux or SMACK security context to CTX
--help #显示此帮助信息并退出
--version #显示版本信息并退出
#详细请看help信息
- 创建目录结构
install [选项]... -d 目录...
- 递归创建不存在的目录
install -d install/lib install/www
# 类似于 mkdir -p install/lib install/www
- 创建目录结构同时拷贝文件
install -D libxxxx.so install/lib/libxxxx.so
# 类似于 mkdir -p install/lib/ && cp libxxxx.so install/lib/libxxxx.so
- 拷贝程序的同时进行strip
install -s --strip -program=strip xxx xxx
- 设置文件权限
install -m 0755 targets /usr/bin
遇到问题
暂时未找到方法处理动态库的软链接文件,拷贝后变成了实体文件。
install 的优点
如果目标文件已存在,cp会先清空文件后往里写入新文件,而install则会先删除掉原先的文件然后写入新文件,如果往正在 使用的文件中写入内容,cp可能会导致一些问题,例如:写入正在执行的文件可能会失败,往已经在持续写入的文件句柄中写入新文件会产生错误的文件。而使用 install先删除后写入(会生成新的文件句柄,新老文件句柄不同,相当于操作的不同文件)的方式去安装就能避免这些问题了,例如:使用cp覆盖一个正在运行的程序文件,经常会提示 "text busy"。
install在拷贝的同时可以设置目标文件的权限,不像使用cp方式拷贝文件仅仅拷贝文件,容易出现目标文件权限问题,例如:原始文件没有执行权限,cp后也没有执行权限,而install -m可以在拷贝的同时设置目标文件的权限。