经过前期调研和在FC10上安装试验了以后,决定移植djmount,因为djmount基于用户空间文件系统fuse,它直接管理UPnP协议的所有动作,无需用户干预.在将UPnP服务mount到指定目录以后,我们就可以像操作普通目录一样访问网络上的媒体server,所以通过djmount我们可以复用STB上现有的media browser.这无疑使得代码修改量变得最少.
首先我们需要将djmount模块加入buildroot编译,这部分十分简单,参看buildroot的手册和看看其他相似模块就能搞清楚,重点是mk文件的编写.至于fuse和libupnp在现版本的buildroot已经加入了,所以我们只需要在buildroot的config中选中就行了.
1.下载djmount源码,现在最新的是0.71
mk文件有一个地方需要注意,需要引入PKG_CONFIG_PATH的定义,否则编译的时候会报找不到fuse等错误,mk文件如下:
#############################################################
#
# djmount
#
#############################################################
DJMOUNT_VER:=0.71
DJMOUNT_SOURCE:=djmount-$(DJMOUNT_VER).tar.gz
DJMOUNT_SITE:=http://sourceforge.net/projects/djmount/files/djmount/${DJMOUNT_VER}/${DJMOUNT_SOURCE}/download
DJMOUNT_CAT:=zcat
DJMOUNT_DIR:=$(BUILD_DIR)/djmount-$(DJMOUNT_VER)
DJMOUNT_BIN:=$(DJMOUNT_DIR)/djmount
DJMOUNT_TARGET_BIN:=$(TARGET_DIR)/usr/sbin/djmount
$(DL_DIR)/$(DJMOUNT_SOURCE):
     $(WGET) -P $(DL_DIR) $(DJMOUNT_SITE)/$(DJMOUNT_SOURCE)
$(DJMOUNT_DIR)/.unpacked: $(DL_DIR)/$(DJMOUNT_SOURCE)
    $(DJMOUNT_CAT) $(DL_DIR)/$(DJMOUNT_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) -
    toolchain/patch-kernel.sh $(DJMOUNT_DIR) local/djmount/patches/ '*'
    touch $@
$(DJMOUNT_DIR)/.configured: $(DJMOUNT_DIR)/.unpacked
    (cd $(DJMOUNT_DIR); rm -rf config.cache; \
        $(TARGET_CONFIGURE_OPTS) \
        $(TARGET_CONFIGURE_FLAGS) \
        PKG_CONFIG_PATH="${STAGING_DIR}/usr/lib/pkgconfig" \
        CFLAGS="$(TARGET_CFLAGS)" \
        LDFLAGS="-L$(STAGING_DIR)/lib" \
        STRIP=$(TARGET_CROSS)strip \
        ./configure \
        --target=$(GNU_TARGET_NAME) \
        --host=$(GNU_TARGET_NAME) \
        --build=$(GNU_HOST_NAME) \
        --prefix=/usr \
        --sysconfdir=/etc \
        --localstatedir=/var \
        --disable-shared \
        --enable-static \
        --with-external-libupnp \
        --with-libupnp-prefix=${STAGING_DIR}/usr \
        --with-fuse-prefix=${STAGING_DIR}/usr \
    );
    touch $(DJMOUNT_DIR)/.configured
#        --with-external-libupnp
#        --with-libupnp-prefix=DIR
$(DJMOUNT_BIN): $(DJMOUNT_DIR)/.configured
    $(MAKE) CC=$(TARGET_CC) -C $(DJMOUNT_DIR)
$(DJMOUNT_TARGET_BIN): $(DJMOUNT_BIN)
    $(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(DJMOUNT_DIR) install
    mkdir -p $(TARGET_DIR)/mnt/upnp
#    cp -dpf $(DJMOUNT_DIR)/djmount $(TARGET_DIR)/usr/sbin/
#    cp -dfpr local/djmount/overlay/. $(TARGET_DIR)
djmount: uclibc $(DJMOUNT_TARGET_BIN)
djmount-clean:
    -make -C $(DJMOUNT_DIR) clean
djmount-dirclean:
    rm -rf $(DJMOUNT_DIR)
#############################################################
#
# Toplevel Makefile options
#
#############################################################
ifeq ($(strip $(BR2_PACKAGE_DJMOUNT)),y)
TARGETS+=djmount
endif
2.下载libfuse源码,最新的版本是2.8.1
3.下载libupnp源码,最新的版本是1.6.6
libfuse和libupnp模块,buildroot已经加入,所以编译很顺利,但是对于我们自己加入的djmount模块却遇到了一些问题,先是由于djmount.mk中的在做configure时的脚本的输入参数有一些问题,使得系统的C_FLAGS没有被引入,所以编译时会报错,在加入CFLAGS="$(TARGET_CFLAGS)" \以后,系统仍然报告FUSE检测不到,在查阅网上的资料以后发现时由于pkgconfig的路径没有在configure的时候带入,在设置PKG_CONFIG_PATH变量以后,编译通过.
随后我们在系统启动脚本加入了libfuse和djmount的启动项,这样在开机以后会首先加载libfuse,然后执行djmount /mnt/upnp给出djmount的挂载点。0.71的djmount对大文件支持有些问题,网上有一个patch对libupnp和djmount做了一个小修改,原因是因为有几个变量定义没有考虑到大文件,没有使用long long.
  • 收藏
  • 评论
  • 举报
提问和评论都可以,用心的回复会被更多人看到 评论
发布评论
相关文章