为什么在 Makefile 中安装文件时 $(INSTALL_BIN) 和 $(INSTALL_DATA) 总是删除软链接

2023-12-20

在 OpenWrt 包 Makefile 的安装部分,以下代码将从 lib* 文件中删除软链接并将实例复制到 $(1)

在构建/编译部分,我们在 ${PKG_BUILD_DIR} 下构建了 3 个库

${PKG_BUILD_DIR}/libapi.so          //  ->  libapi.so.1.0
${PKG_BUILD_DIR}/libapi.so.1.0      //  ->  libapi.so.1.0.1
${PKG_BUILD_DIR}/libapi.so.1.0.1

在Build/Installdev和Package/api/install部分,如果使用$(INSTALL_BIN)/$(INSTALL_DATA)将这3个lib从${PKG_BUILD_DIR}复制到$(1)/usr/lib/,则softlik将被删除。

define Package/api/install
    $(INSTALL_BIN) $(PKG_BUILD_DIR)/libapi.so  $(1)/usr/lib/
    $(INSTALL_BIN) $(PKG_BUILD_DIR)/libapi.so.1.0  $(1)/usr/lib/
    $(INSTALL_BIN) $(PKG_BUILD_DIR)/libapi.so.1.0.1  $(1)/usr/lib/
endef

我必须使用的唯一方法是 $(CP) 或“cp -f”

但我不确定 $(CP) 是否会保留这些库的 -m0755 标志,因为我需要这些库在目标板上可执行。

define Package/api/install
    $(CP) $(PKG_BUILD_DIR)/libapi.so*  $(1)/usr/lib/
endef

如何让 $(INSTALL_BIN) 保留软链接?

日志和变量:

INSTALL_BIN  = install -m0755
INSTALL_DATA = install -m0644
CP           = cp -fpR

你是对的install实用程序总是取消引用符号链接(请参阅这个问题 https://stackoverflow.com/q/35560730/7233423).

要复制文件同时保留所有内容(符号链接、硬链接、模式等),您可以使用cp -a.

您还可以使用tar:

tar c -C source_dir file1 ... fileN | tar xv -C dest_dir

请注意,两者cp -a and tar将保留用户和组,并且这些文件可能必须由目标处的 root:root 所有。您可能需要添加一个chown然后。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么在 Makefile 中安装文件时 $(INSTALL_BIN) 和 $(INSTALL_DATA) 总是删除软链接 的相关文章

随机推荐