12 15

OpenWRT编译系统分析之subdir函数的用法

subdir函数是OpenWRT中使用得非常广泛的一个Makefile函数。该函数定义在*include/subdir.mk*中。该函数主要包括两个部分,第一个部分定义了一些Makefile的目标规则内容。第二部分定义了默认的依赖关系。我们先看第一部分。

去掉那些用于调试输出的warn函数不看。第一部分主体包括两个foreach遍历。

  1. 第一个foreach主要遍历*$(1)/builddirs*变量。该变量由调用环境定义,subdir.mk本身并没有定义该变量。枚举出来的内容依次赋给bd变量。
  2. 第二个foreach主要遍历*SUBTARGETS*变量。该变量主要包括一些常用的编译目标,比如clean、download、prepare、compile、install、update等等。该变量就定义在subdir.mk文件的头部。枚举出来的内容依次赋值给target变量。

两级遍历的得到的*bd*和*target*内容,调用了四个指令集。分别如下:

  1. 第一个指令集,又是调用foreach去遍历*buildtypes-$(bd)*得到变量*btype*。我搜索了代码库,发现并没有任何地方定义过这个变量。所以这个指令集实际上什么都没干。
  2. 第二个指令集,主要定义了*$(1)/$(bd)/$(target)*目标。该目标的具体内容随后分析。
  3. 第三个指令集,主要是兼容性考虑,定义了*$(1)/$(bd)-$(target)*目标。该目标没有执行体,依赖于第二个指令集定义的目标。
  4. 第四个指令集,主要定义了可能的别名目标。本身没有意义。

所以,这两级遍历的主要内容,就是创建所有的*$(1)/$(bd)/$(target)*目标规则。该目标的执行体主要包括两部分:

  1. 如果定义了*BUILD_LOG,则创建$(BUILD_LOG_DIR)/$(1)/$(bd)*目录,用于记录编译日志。
  2. 进入到*$(1)/$(bd)*子目录,执行make $(target)

同时,如果调用环境中没有定义了*QUILT变量,该目标会添加两个依赖$(1)/$(bd)/$target$(call $(1)//$(target),$(1)/$(bd))*。

两级遍历定义完所有目录下的默认目标规则后,再次调用foreach。这次调用是将$(1)下SUBTARGETS定义到所有目标,都设置好依赖关系。这个依赖关系主要通过该文件中定义的subtarget函数创建的。简单的说,$1/$(target)依赖:

  1. 首先,该目标一定依赖$1/目录。
  2. 然后,检查调用环境是否存在$1/builddirs-$(target)变量。如果存在,则添加其内容作为依赖目标。
  3. 否则,检查调用环境中是否存在$1/builddirs-default变量。如果存在,则添加其内容作为依赖目标。
  4. 如果两者都不存在,则添加调用环境中的$1/builddirs变量作为依赖目标。
12 15

OpenWRT编译系统分析之rootfs/prepare

顾名思义,该任务的主要作用就是根文件系统的一些准备工作。 该make目标定义在*package/Makefile*中。主要包含以下内容:

  1. 调用*package/preconfig*,该目标实际上不存在,所以这个调用没有任何作用。
  2. 检查顶层目录下是否存在files目录。如果存在全部复制到目标根文件系统目录(*build_dir/target-mips_uClibc-0.9.30.1/root-wndr4500v3*)中。
  3. 在目标根文件系统目录中,创建*/etc/rc.d*目录。
  4. 进入目标根文件系统目录,遍历*/etc/init.d/下所有的文件,找出所有包含#!/bin/sh /etc/rc.common的文件。并调用目标根文件系统中的/etc/rc.common script enable把这些脚本都安装到/etc/rc.d*中。
  5. 清理目标根文件系统中所有的*CSV.svn文件以及所有以.*开头的文件。
  6. 调用mklibs函数。该函数只有*CONFIG_USE_MKLIBS*有效时才有有效的定义,但该配置默认未设置。所以实际上这一步也没有任何作用。
10 19

解决树莓派WiFi搜不到的问题

家里买了一款新路由,设置为自动调整信道,以自动避免WiFi信道拥堵。结果自动设置到非全球可用的信道13了。

树莓派3B自带的WiFi模块,内核驱动默认设置的是全球通用的信道名单。这个名单就不包含13信道,所以死活搜索不到WiFi热点。

要解决这个问题,只需要打开/etc/conf.d/wireless-regdom文件,将#WIRELESS_REGDOM="CN"前的#去掉,然后重启设备即可。

参考资料:

7 10

解决BAE中PHPMyAdmin无法登录的问题

不知道大家有没有遇到我这种情况,打开BAE的PHPMyAdmin,结果提示:

Sorry! Login Failed, Please Try Again!

本以为这百度家的玩意儿,在百度家应该很容易解决,结果没想到百度搜索半天没找到。

最后还是在Google的帮助下,找到了解决方法,而莫名其妙的是,解决方法竟然是百度自己提供的(refer http://developer.baidu.com/feedback#/info/8008 )。

简单说就一句话:接受所有网站的Cookie。对应各个浏览器来说就是:

<div>

<ul>

&lt;li&gt;chrome:设置-&gt;高级选项-&gt;隐私设置-&gt;内容设置-&gt;Cookie-&gt;阻止设置第三方Cookie的勾去掉;&lt;/li&gt;

&lt;li&gt;safari:偏好设置-&gt;隐私-&gt;阻止cookies选择“永不”;&lt;/li&gt;

&lt;li&gt;IE:不存在该问题 ;&lt;/li&gt;

</ul>

PS:吐嘈一句,BAE自带的PHPMyAdmin真TMD不是一般的慢啊!

</div>

近期 以往