autotools中Makefile.am调用sed处理desktop文件适配prefix
Autotools 替换desktop文件路径的正确实现
不要在安装阶段临时sed修改目标文件,也不要直接修改源码目录下的原始desktop文件,遵循Autotools规范的实现方式如下:
第一步:准备desktop模板文件
把你现有的applications/wombat.desktop重命名为applications/wombat.desktop.in作为模板,将文件中所有写死的/usr/share、/usr/local/share类路径替换为你需要的占位符,比如你原本用@PREFIX@就保留这个占位符,更推荐直接用Autotools标准路径变量对应的占位符,示例模板内容:[Desktop Entry] Type=Application Name=Wombat Exec=@PREFIX@/bin/wombat Icon=@PREFIX@/share/pixmaps/wombat.svg第二步:重写
data/Makefile.am配置
替换为以下内容,核心是在构建阶段就完成sed替换生成最终的desktop文件,安装阶段仅做拷贝,兼容各类构建、打包场景:# 用Autotools内置的datarootdir变量等价于$(prefix)/share,更规范 wombatdir = $(datarootdir) applicationsdir = $(wombatdir)/applications pixmapsdir = $(wombatdir)/pixmaps # 声明要安装的文件 applications_DATA = applications/wombat.desktop pixmaps_DATA = pixmaps/wombat.svg # 声明生成的文件需要在make clean时删除,模板文件和图标要打入源码包 CLEANFILES = applications/wombat.desktop EXTRA_DIST = applications/wombat.desktop.in pixmaps/wombat.svg # sed替换生成最终desktop文件的规则 applications/wombat.desktop: $(srcdir)/applications/wombat.desktop.in $(MKDIR_P) $(@D) $(SED) -e 's|@PREFIX@|$(prefix)|g' $< > $@
关键注意点
- 用
|作为sed的分隔符,避免路径中自带的/导致sed命令语法错误 - 所有命令、路径引用都用Autotools内置变量:
$(SED)、$(MKDIR_P)、$(srcdir)保证跨平台兼容性,同时支持out-of-tree构建(源码目录和构建目录分离的场景) - 绝对不要在
install-hook阶段修改已经拷贝到安装路径的文件,这种写法会破坏DESTDIR打包逻辑(发行版打包时普遍依赖这个变量临时安装到沙盒目录),还可能触发权限问题 - 模板文件必须加入
EXTRA_DIST,否则执行make dist生成源码发布包时会漏掉模板文件,导致其他人编译报错
内容的提问来源于stack exchange,提问作者Michael K.
相关产品推荐
相关产品推荐

