自然护肤网 加入收藏  -  设为首页
您的位置:自然护肤网 > 护肤技巧 > 正文

目录

1,makefile中 = ,:=,+=有怎么区别?

makefile中 = ,:=,+=有怎么区别?

  = 是最基本的赋值
  := 是覆盖之前的值
  ?= 是如果没有被赋值过就赋予等号后面的值
  += 是添加等号后面的值
  1、“=”
  make会将整个makefile展开后,再决定变量的值。也就是说,变量的值将会是整个makefile中最后被指定的值。看例子:
  x = foo
y = $(x) bar
x = xyz
  在上例中,y的值将会是 xyz bar ,而不是 foo bar 。
  2、“:=”
  “:=”表示变量的值决定于它在makefile中的位置,而不是整个makefile展开后的最终值。
  x := foo
y := $(x) bar
x := xyz
  在上例中,y的值将会是 foo bar ,而不是 xyz bar 了。

2,makefile foreach 中能掉用函数么

在Makefile中可以使用函数来处理变量,从而让我们的命令或是规则更为的灵活和具
有智能。make所支持的函数也不算很多,不过已经足够我们的操作了。函数调用后,函
数的返回值可以当做变量来使用。

一、函数的调用语法
函数调用,很像变量的使用,也是以“$”来标识的,其语法如下:
$( )
或是
${ }

这里,就是函数名,make支持的函数不多。是函数的参数,参数
间以逗号“,”分隔,而函数名和参数之间以“空格”分隔。函数调用以“$”开头,以圆
括号或花括号把函数名和参数括起。感觉很像一个变量,是不是?函数中的参数可以使
用变量,为了风格的统一,函数和变量的括号最好一样,如使用“$(substa,b,$(x))”这
样的形式,而不是“$(substa,b,${x})”的形式。因为统一会更清楚,也会减少一些不必
要的麻烦。
还是来看一个示例:
comma:= ,
empty:=
space:= $(empty) $(empty)
foo:= a b c
bar:= $(subst $(space),$(comma),$(foo))
在这个示例中,$(comma)的值是一个逗号。$(space)使用了$(empty)定义了一个空格,
$(foo)的值是“a b c”,$(bar)的定义用,调用了函数“subst”,这是一个替换函数,这
个函数有三个参数,第一个参数是被替换字串,第二个参数是替换字串,第三个参数
是替换操作作用的字串。这个函数也就是把$(foo)中的空格替换成逗号,所以$(bar)的值
是“a,b,c”。

二、字符串处理函数

$(subst ,, )

名称:字符串替换函数——subst。
功能:把字串中的字符串替换成。
返回:函数返回被替换过后的字符串。

示例:
$(subst ee,EE,feet on the street),
把“feetonthestreet”中的“ee”替换成“EE”,返回结果是“fEEtonthestrEEt”。
$(patsubst ,, )

名称:模式字符串替换函数——patsubst。
功能:查找中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)是否
符合模式,如果匹配的话,则以替换。这里,可以包括
通配符“%”,表示任意长度的字串。如果中也包含“%”,那么,
中的这个“%”将是中的那个“%”所代表的字串。(可以用“\”
来转义,以“\%”来表示真实含义的“%”字符)
返回:函数返回被替换过后的字符串。

示例:
$(patsubst %.c,%.o,x.c.c bar.c)
把字串“x.c.cbar.c”符合模式[%.c]的单词替换成[%.o],返回结果是“x.c.obar.o”
备注:
这和我们前面“变量章节”说过的相关知识有点相似。如:

“$(var:= )”
相当于
“$(patsubst ,,$(var))”,

而“$(var:=)”
则相当于
“$(patsubst %,%,$(var))”。

例如有:objects=foo.obar.obaz.o,
那么,“$(objects:.o=.c)”和“$(patsubst%.o,%.c,$(objects))”是一样的。

$(strip )

名称:去空格函数——strip。
功能:去掉字串中开头和结尾的空字符。
返回:返回被去掉空格的字符串值。
示例:
$(strip a b c )
把字串“abc”去到开头和结尾的空格,结果是“abc”。
$(findstring , )

名称:查找字符串函数——findstring。

功能:在字串中查找字串。
返回:如果找到,那么返回,否则返回空字符串。
示例:
$(findstring a,a b c)
$(findstring a,b c)
第一个函数返回“a”字符串,第二个返回“”字符串(空字符串)
$(filter , )
名称:过滤函数——filter。
功能:以模式过滤字符串中的单词,保留符合模式的单词。可
以有多个模式。
返回:返回符合模式的字串。
示例:

sources := foo.c bar.c baz.s ugh.h
foo: $(sources)
cc $(filter %.c %.s,$(sources)) -o foo

$(filter %.c %.s,$(sources))返回的值是“foo.c bar.c baz.s”。

$(filter-out , )

名称:反过滤函数——filter-out。
功能:以模式过滤字符串中的单词,去除符合模式的单词。可
以有多个模式。
返回:返回不符合模式的字串。
示例:

objects=main1.o foo.o main2.o bar.o
mains=main1.o main2.o

$(filter-out $(mains),$(objects)) 返回值是“foo.o bar.o”。

$(sort )

名称:排序函数——sort。
功能:给字符串中的单词排序(升序)。
返回:返回排序后的字符串。
示例:$(sortfoobarlose)返回“barfoolose”。
备注:sort函数会去掉中相同的单词。

$(word , )

名称:取单词函数——word。
功能:取字符串中第个单词。(从一开始)
返回:返回字符串中第个单词。如果比中的单词数要大,那么返回
空字符串。
示例:$(word2,foobarbaz)返回值是“bar”。

$(wordlist ,, )

名称:取单词串函数——wordlist。
功能:从字符串中取从开始到的单词串。和是一个数字。
返回:返回字符串中从到的单词字串。如果比中的单词数要大,
那么返回空字符串。如果大于的单词数,那么返回从开始,到结束
的单词串。
示例:$(wordlist2,3,foobarbaz)返回值是“barbaz”。

$(words )

名称:单词个数统计函数——words。
功能:统计中字符串中的单词个数。
返回:返回中的单词数。
示例:$(words,foobarbaz)返回值是“3”。
备注:如果我们要取中最后的一个单词,我们可以这样:$(word $(words
), )。

$(firstword )

名称:首单词函数——firstword。
功能:取字符串中的第一个单词。
返回:返回字符串的第一个单词。
示例:$(firstwordfoobar)返回值是“foo”。
备注:这个函数可以用word函数来实现:$(word1,)。

以上,是所有的字符串操作函数,如果搭配混合使用,可以完成比较复杂的功能。这里,
举一个现实中应用的例子。我们知道,make使用“VPATH”变量来指定“依赖文件”的
搜索路径。于是,我们可以利用这个搜索路径来指定编译器对头文件的搜索路径参数
CFLAGS,如:

override CFLAGS += $(patsubst %,-I%,$(subst :, ,$(VPATH)))

如果我们的“$(VPATH)”值是“src:../headers”,那么“$(patsubst %,-I%,$(subst :, ,
$(VPATH)))”将返回“-Isrc -I../headers”,这正是 cc 或 gcc 搜索头文件路径的参数。

3,makefile当中foreach能不能和patsubst一起使用

makefile当中foreach能不能和patsubst一起使用
不是,这个只是做字符串转换,比方说你在makefile里定义了所有要编译的源文件

SRCC = a.c b.c c.c

那么你可以用 patsubst 这个函数来将 SRCC 里存放的源文件名字转换成对应的目标文件名,

OBJS = $(patsubst %.c, %.o, $(SRCC))

此时 OBJS 的内容就是 a.o b.o c.o

4,makefile 的filter函数

filter函数是过滤后面的字符串,返回符合的字符串
比如:source := a.s b.c c.cpp
$(filter %.c %.s, $(source)) 返回的是a.s b.c
像你上面那个应该是返回空,但是为什么要那么用filter函数呢?
每个函数都有适用的场景,这个函数是说有多个字符串,通过模式取出其中符合的字符串,像你这个一个字符串用个filter函数不知道你想干嘛。。。

5,linux的几道题求各位帮忙 我初学 这些对大神应该很容易的 谢谢啦

1 tar -zcvf /var/tmp/home.tar.gz ~/*
chmod 666 /var/tmp/home.tar.gz
mkdir ~/backup
tar -zxvf /var/tmp/home.tar.gz -C ~/backup
2 mount -t vfat /dev/sda1 /mnt
cd /mnt
mkdir ./myfiles
touch ./soft
cp -a ./soft /root/
cd ~
umount /mnt
3 crontab -e
50 17 * * 1 /bin/tar -zcvf /var/tmp/backup.tar.gz /data/*
55 18 * * * /sbin/umount /dev/hdc
30 23 * * * /sbin/shutdown -h now
4 vim /etc/httpd/conf/http.conf
配置文件内容忘了
要进LINUX看才记得 大概就这样吧 不想切换系统试了 下面有人回答了

6,android makefile 将有空格的字符串赋给变量编译报错

想要了解一个系统,我常从makefile或是building system下手,以了解系统组成元素为何?目录结构为何?对于Android,我也不例外。透过了解building system,我们能知道如何新增、修改、删除程序,并保持其完整性,顺利编译出结果。
设置文件
Android building system 包括几种重要的设置文件,
·
Android.mk
·
AndroidProducts.mk
·
target_-.mk, host_-.mk and -.mk
o
BoardConfig.mk
o
buildspec.mk
Android.mk 是 module 和 package 的设置文件,每个 module/package 的目录下都会有一个 Android.mk。所谓的 module 是指系统的 native code ,相对于用 Java 写成的 Android application 称为 package。
AndroidProducts.mk 则设定 product 配置。 product 即特定系统版本,透过编译不同 product ,产生不同软件配置内容,安装不同的 application。 Product 可视为特定项目,产生特定规格系统。
BoardConfig.mk 是为 product 主板做设定,像是 driver 选择、设定。*-.mk 则是针对选择的操作系统和 CPU 架构,进行相关设定。
buildspec.mk 是位于 source 根目录下,为进行编译者所做之额外设定。例如,可在此选择要产生的 product 、平台、额外的module/package 等。
参数
build/envsetup.sh 实作一个 mm 指令,以编译单一 module,不需编译整个 source tree。ONE_SHOT_MAKEFILE 这个 makefile 变量/参数就是用以实作这个功能。使用方法是在执行 make 时,将该变量指定为 module 的 Android.mk。
o
make ONE_SHOT_MAKEFILE=
透过定义 CREATE_MODULE_INFO_FILE , building system 会将所有 module 信息列在 $(PRODUCT_OUT)/module-info.txt 档案里。
o
make CREATE_MODULE_INFO_FILE=true
设定 BUILD_TINY_ANDROID=true , building system 产生一个简单的 image ,以测试硬件的可用度。此功能用于移植的早期阶段,以快速 bring up 。
HOST_BUILD_TYPE 和 TARGET_BUILD_TYPE 指定 building system 产生 binary 的目的为 debug 或 release 。透过设定此二变量,能产生包含 debug information 的 binry 。
o
debug
o
release
这些参数,也可设于 buildspec.mk 里,以避免开发过程不断的重新指定。
Goals
一般编辑整个 Android 系统,就是使用 droid 这个 goal。 droid 会产生一个完整的系统,包括 bootloader、kernel、系统程序、模块和应用程序。
showcommands 和 droid 功能相同,但 droid 在编译过程不显示所使用的指令。透过 showcommands 这个 goal, building system显示过程中每一个步骤的详细指令。
Makefile 的流程
o
初始化相关变数
o
侦测编译环境和目标环境
o
决定目标 product
o
读取 product 的设定
o
读取 product 所指定之目标平台架构设定
§
选择 toolchain
§
指定编译参数 (*-.mk)
o
清除输出目录
o
设定/检查版本编号
o
读取所有 BoardConfig.mk 档案
o
读取所有 module 的设定
o
根据设定,产生必需的 rule
o
产生 image
以上的主要流程都是由 build/core/main.mk 所安排。
初始化和侦测
由 build/core/config.mk 所进行。 build/core/envsetup.mk 检查 developer 的设定 (buildspec.mk) ,并检查执行环境,以决定输出目录、项目。
build/core/config.mk 本身还依据参数,决定解译时的相关参数。像是 compiler 的路径、flags, lex 、yacc 的路径参数等。
关于 product 的相关设定,则是由 build/core/product_config.mk 所处理,使用 build/core/product.mk 提供之 macro 加载。根据AndroidProduct.mk 的内容, product_config.mk 决定了
o
PRODUCT_TAGS
o
OTA_PUBLIC_KEYS
o
PRODUCT_POLICY
o
......
Product 设定的读取
Android product 的设定来自于 build/target/product/AndroidProduct.mk 和 vendor 子目录下的 AndroidProduct.mk 。 building system透过 find 指令,找出所有可能的 AndroidProduct.mk。 AndroidProduct.mk 里定义 PRODUCT_MAKEFILES 变量,列举所有实际定义 product 的 makefile。这些 makefile 各自定义独立的 product 。product 相关参数,存成 PRODUCTS. .形式的变数。并将makefile 路径存在 PRODUCTS 变量。因此,透过 PRODUCTS 能取得所有的 product 路径/名称,并透过 PRODUCTS. .形式的变量取得内容。
Module 设定的读取
Module 是指 native code 的软件组件,而 Java application 则被称为 package。 build/core/definitions.mk 定义 module/package 相关macro ,读取、检查 module/package 定义档;分散 source tree 各处的 Android.mk 档案。 build/core/main.mk 使用 find 指令,在这些子目录下找出所有 Android.mk ,并将路径存在 subdir_makefiles 变量里。最后,include 这些档案。
这些 Android.mk 会 include 定义成变量 BUILD_SHARED_LIBRARY 、BUILD_PACKAGE 等,和其目的相配的 makefile。这些makefile 会变 Android.mk 定义之内容,存成 ALL_MODULES. .mk>.形式。例如, Android.mk 定义了 LOCAL_MODULE_SUFFIX,变会存成 ALL_MODULES. .mk>.LOCAL_MODULE_SUFFIX 。而 Android.mk 路径,当样会存于 ALL_MODULES 变量里