See You Again

一个 sed 兼容性引发的血案

最近想在 Mac 环境下编一下webkit的代码,研究一下浏览器的实现细节。环境倒没什么复杂的,装好 XCode,下载好代码,运行build-webkit就 OK 了,无奈总是遇到编译错误,这令我很苦恼:

  1. webkit/WebKitBuild/Debug/DerivedSources/WebKitLegacy/DOMElementInternal.h:27:9: fatal error: '<WebKitLegacy/DOMElement.h' file not found
  2. #import <<WebKitLegacy/DOMElement.h>

仔细看报错的地方,明显是引用头文件时多了一个<字符,搜索一下编译目录 WebKitBuild 还是有不少这种问题的,但是源码目录 Source 没有!猜测可能是脚本修改的,仔细看一下编译日志,果然有 sed 修改文件的操作:

  1. sed -E -e 's/\<WebCore\//\<WebKitLegacy\//' -e s/DOMDOMImplementation/DOMImplementation/ -e "s/(^ *)WEBCORE_EXPORT /\1/" webkit/WebKitBuild/Debug/DerivedSources/WebKitLegacy/WebCorePrivateHeaders/DOMXPathNSResolver.h > webkit/WebKitBuild/Debug/WebKitLegacy.framework/Versions/A/PrivateHeaders/DOMXPathNSResolver.h

问题就出在这 sed 上了,具体来说是处理<字符上,我默认用的是 gnu sed,这个版本进行字符替换时会出问题:

  1. ~ $ echo '<WebCore/DOMElement.h>'| /usr/local/bin/sed -E 's/\<WebCore\//\<WebKitLegacy\//'
  2. <<WebKitLegacy/DOMElement.h>

可能是 bug 或者兼容性问题?解决办法是修改脚本webkit/Source/WebKit/mac/MigrateHeaders.make。我想我应该报 bug 了:joy:,gnu 倒是回复的挺快,这不是他们的问题:

No bug, in GNU sed, \< and > are special and get interpreted, while on
OSX sed the \ in the \< combination is silently stripped.
So if you just want to match a literal lesser sign, just use it unescaped
(and in any case, you surely don’t have to escape it in the replacement
part):

2016-05-10 喜欢

Copyright © 2015-2018 转载请注明出处

回到顶部 ↑