Archive

Archive for August, 2008

Sub-Process /usr/bin/dpkg returned an error code (1)

August 19th, 2008 4 comments

一、 发现deb包依赖关系错误:

border@b0rder:~$  sudo apt-get install -f
正在读取软件包列表... 完成
正在分析软件包的依赖关系树
读取状态信息... 完成
已经不需要下列自动安装的软件包:
  liberror-perl libdigest-sha1-perl
使用 'apt-get autoremove' 来删除它们。
共升级了 0 个软件包,新安装了 0 个软件包,要卸载 0 个软件包,有 0 个软件未被升级。
有 6 个软件包没有被完全安装或卸载。
操作完成后,会消耗掉 0B 的额外磁盘空间。
正在设置 flex (2.5.34-2.1) ...
install-info:不能识别的选项“--description=A fast scanner generator”
        试用“install-info --help”以获得选项的完整列表。
dpkg:处理 flex (--configure)时出错:
 子进程 post-installation script 返回了错误号 1
正在设置 cvs (1:1.12.13-9) ...
install-info: 没有指定目录文件;试用 --help 以获得更多信息。
dpkg:处理 cvs (--configure)时出错:
 子进程 post-installation script 返回了错误号 1
正在设置 libidn11-dev (1.1-1) ...
install-info: 没有指定目录文件;试用 --help 以获得更多信息。
dpkg:处理 libidn11-dev (--configure)时出错:
 子进程 post-installation script 返回了错误号 1
正在设置 comerr-dev (2.1-1.40.8-2ubuntu2) ...
install-info: 没有指定目录文件;试用 --help 以获得更多信息。
dpkg:处理 comerr-dev (--configure)时出错:
 子进程 post-installation script 返回了错误号 1
dpkg:依赖关系问题使得 libkrb5-dev 的配置工作不能继续:
 libkrb5-dev 依赖于 comerr-dev;然而:
  软件包 comerr-dev 还没有被配置。
dpkg:处理 libkrb5-dev (--configure)时出错:
 依赖关系问题 - 仍未被配置
dpkg:依赖关系问题使得 libcurl4-gnutls-dev 的配置工作不能继续:
 libcurl4-gnutls-dev 依赖于 libidn11-dev;然而:
  软件包 libidn11-dev 还没有被配置。
 libcurl4-gnutls-dev 依赖于 libkrb5-dev | hurd;然而:
  软件包 libkrb5-dev 还没有被配置。
  未曾安装软件包“hurd”。
dpkg:处理 libcurl4-gnutls-dev (--configure)时出错:
 依赖关系问题 - 仍未被配置
在处理时有错误发生:
 flex
 cvs
 libidn11-dev
 comerr-dev
 libkrb5-dev
 libcurl4-gnutls-dev
E: Sub-process /usr/bin/dpkg returned an error code (1)

二、 删除已经安装错误包的文件:

通过dpkg -L 来查看已经安装的文件, 已flex为例:

border@b0rder:~$ dpkg -L flex
/.
/usr
/usr/bin
/usr/bin/flex
/usr/lib
/usr/lib/libfl.a
/usr/lib/libfl_pic.a
/usr/lib/libfl.so
/usr/share
/usr/share/info
/usr/share/info/flex.info-2.gz
/usr/share/info/flex.info.gz
/usr/share/info/flex.info-1.gz
/usr/share/man
/usr/share/man/man1
/usr/share/man/man1/flex.1.gz
/usr/share/doc
/usr/share/doc/flex
/usr/share/doc/flex/NEWS.Debian.gz
/usr/share/doc/flex/NEWS.gz
/usr/share/doc/flex/changelog.Debian.gz
/usr/share/doc/flex/copyright
/usr/share/doc/flex/README.gz
/usr/share/doc/flex/README.Debian.gz
/usr/share/lintian
/usr/share/lintian/overrides
/usr/share/lintian/overrides/flex
/usr/include
/usr/include/FlexLexer.h
/usr/bin/flex++
/usr/bin/lex
/usr/lib/libl.a
/usr/share/man/man1/lex.1.gz
/usr/share/man/man1/flex++.1.gz
/usr/share/doc/flex/changelog.gz

把要删除的文件导入文件中,做成删除脚步:

border@b0rder:~$ dpkg -L flex > flex
 通过vim 在每一行前加 "rm "
border@b0rder:~$ chmod a+x flex
border@b0rder:~$ sudo ./flex

三、 删除dpkg info 信息:

border@b0rder:~$ cd /var/lib/dpkg/info
border@b0rder:/var/lib/dpkg/info$ sudo rm flex.*

四、 卸载flex:

border@b0rder:/var/lib/dpkg/info$ sudo apt-get remove flex

五、再执行 sudo apt-get install -f,flex依赖问题解决。其他的一览关系参考二,三,四 步。

六、参考

– EOF –

Categories: Tech.Notes Tags: , , ,

Cross Compile SSH Server Dropbear For ARM

August 15th, 2008 No comments

编译环境

  • ubuntu 8.04
  • gcc 4.2.3
  • arm_v5t_le-gcc 3.4.3

编译过程

编译zlib:

wget http://www.zlib.net/zlib-1.2.3.tar.gz
tar zxvf zlib-1.2.3.tar.gz
mkdir zlib
cd zlib-1.2.3/
CC=arm_v5t_le-gcc ./configure --prefix=/home/border/work/SMG/build-tools/zlib
make
make install

编译dropbear:

wget http://matt.ucc.asn.au/dropbear/releases/dropbear-0.51.tar.gz
tar zxvf dropbear-0.51.tar.gz
mkdir dropbear-build
cd dropbear-build/
mkdir build
../dropbear-0.51/configure --prefix=/home/border/work/SMG/build-tools/dropbear-build/build/ \
    --with-zlib=/home/border/work/SMG/build-tools/zlib/ CC=arm_v5t_le-gcc --host=arm
make
make scp
sudo make install
sudo cp scp build/bin/

其中的scp需要单独编译,然后用把编译好的scp复制到build/bin目录下。

在交叉编译好的程序要使用 file 之类的工具检查一下是否为目标机器的程序:

border@b0rder:~/work/SMG/build-tools/dropbear-build$ file scp
scp: ELF 32-bit LSB executable, ARM, version 1 (SYSV), for GNU/Linux 2.4.17,
dynamically linked (uses shared libs), not stripped

编译好的文件目录结构为:

border@b0rder:~/work/SMG/build-tools/dropbear-build/build$ tree
.
|-- bin
|   |-- dbclient
|   |-- dropbearconvert
|   |-- dropbearkey
|   `-- scp
`-- sbin
    `-- dropbear

生成server key:

cd /etc
mkdir dropbear
cd dropbear
dropbearkey -t rsa -f dropbear_rsa_host_key
dropbearkey -t dss -f dropbear_dss_host_key

启动脚本

把build目录拷贝到ARM机器上, 在启动脚步/etc/init.d/rcS中增加:

dropbear

– EOF –

Categories: Embedded Tags: , , ,

Django From 0.96 update to 1.0 logging

August 8th, 2008 No comments

Django升级到1.0时,发现原来写的东西就运行不起来, 去官方查了一下原来Admin和newform的API改动了, 还好这次不是大面积的改动.

更新简单记录一下.

本文主要参考: http://code.djangoproject.com/wiki/BackwardsIncompatibleChanges

admin url

URLconfs:

# OLD:
from django.conf.urls.defaults import *

urlpatterns = patterns('',
    (r'^admin/', include('django.contrib.admin.urls')),
)

# NEW:
from django.conf.urls.defaults import *
from django.contrib import admin

admin.autodiscover()

urlpatterns = patterns('',
    (r'^admin/(.*)', admin.site.root),
)

slugfield prepopulate_from

code:

# OLD
class Catalog(models.Model):
    catalog_name = models.CharField(max_length=100)
    slug = models.SlugField(prepopulate_from=("catalog_name",))

    class Admin:
        list_display = ('id', 'catalog_name', 'post_count')

# NEW
class Catalog(models.Model):
    catalog_name = models.CharField(max_length=100)
    slug = models.SlugField(db_index=True)

from django.contrib import admin
class CatalogAdmin(admin.ModelAdmin):
    list_display = ('id', 'catalog_name', 'post_count')
    prepopulated_fields = {"slug": ("catalog_name",)}

admin.site.register(Catalog, CatalogAdmin)

filter_interface

code:

# OLD
tags = models.ManyToManyField(Tag, filter_interface=models.HORIZONTAL, related_name='entries')
slug = models.SlugField(
        unique_for_date='pub_date',
        prepopulate_from=('title',),
        help_text='Automatically built from the title.'
        )
# NEW
tags = models.ManyToManyField(Tag, related_name='entries')
slug = models.SlugField(db_index=True)

class EntryAdmin(admin.ModelAdmin):
    date_hierarchy = 'pub_date'
    prepopulated_fields = {"slug": ("title",)}
    filter_horizontal = ('tags',)
admin.site.register(Entry, EntryAdmin)

Renamed ‘fields’ to ‘fieldsets’

code:

# OLD
class Admin:
    fields = [(None, {'fields': ('title', 'catalog', 'public', 'slug', 'input_format', 'body', 'tags', 'comment_count', 'read_count')})]

# NEW
class EntryAdmin(admin.ModelAdmin):
    fieldsets = [(None, {'fields': ('title', 'catalog', 'public', 'slug', 'input_format', 'body', 'tags', 'comment_count', 'read_count')})]
admin.site.register(Entry, EntryAdmin)

更详细的变更请参考Blog-app. http://code.google.com/p/blog-app/source/detail?r=67

参考:

–EOF–

Categories: SiteLog Tags: ,

GNU Configure 中的 build target和host 的区别

August 2nd, 2008 No comments

这几天在做交叉编译的时候,对configure的build, target和host 一直搞不明白,搜了些资料记录一下:

一、 http://en.wikipedia.org/wiki/Cross_compile

The GNU autotools packages (i.e. autoconf, automake, and libtool) use the notion of a build platform, a host platform, and a target platform.

The build platform is where the code is actually compiled.

The host platform is where the compiled code will execute.

The target platform usually only applies to compilers. It represents what type of object code the package itself will produce (such as cross-compiling a cross-compiler); otherwise the target platform setting is irrelevant. For example, consider cross-compiling a video game that will run on a Dreamcast. The machine where the game is compiled is the build platform while the Dreamcast is the host platform.

二、 http://www.airs.com/ian/configure/configure_5.html#SEC30

When building cross compilation tools, there are two different systems involved: the system on which the tools will run, and the system for which the tools generate code.

The system on which the tools will run is called the host system.

The system for which the tools generate code is called the target system.

For example, suppose you have a compiler which runs on a GNU/Linux system and generates ELF programs for a MIPS embedded system. In this case the GNU/Linux system is the host, and the MIPS ELF system is the target. Such a compiler could be called a GNU/Linux cross MIPS ELF compiler, or, equivalently, a ‘i386-linux-gnu’ cross ‘mips-elf’ compiler.

简单说明一下:

  1. build 就是你现在使用的机器。
  2. host 就是你编译好的程序能够运行的平台。
  3. target 编译程序能够处理的平台。一般都用在构建编译本身的时候(gcc), 才用target, 也就是说平时我们所说的交叉编译用不到target.

Target usually have a meaning for developemt tool only.

比如: 在386的平台上编译可以运行在arm板的程序 ./configure –build=i386-linux,–host=arm-linux就可以了.

因为一般我们都是编译程序而不是编译工具.

如果我们编译工具,比如gcc,这个target就有用了.如果我们需要在一个我们的机器上为arm开发板编译一个可以处理 mips程序的gcc,那么target就是mips了.

比如:

1. ./configure --build=mipsel-linux --host=mipsel-linux
--target=mipsel-linux' will build native mipsel-linux binutils on
mipsel-linux.

2. ./configure --build=i386-linux --host=mipsel-linux
--target=mipsel-linux' will cross-build native mipsel-linux binutils on
i386-linux.

3. ./configure --build=i386-linux --host=i386-linux
--target=mipsel-linux' will build mipsel-linux cross-binutils on
i386-linux.

4. ./configure --build=mipsel-linux --host=i386-linux
--target=mipsel-linux' will cross-build mipsel-linux cross-binutils for
i386-linux on mipsel-linux.

As you see, only if $build != $host a cross-compilation is performed.
参考:
  1. http://en.wikipedia.org/wiki/Cross_compile
  2. http://www.airs.com/ian/configure/configure_5.html#SEC30
  3. http://oss.lzu.edu.cn/blog/blog.php?/do_showone/tid_116.html

– EOF –

Categories: Embedded Tags: ,

Howto-Cross-Compile-Python2.5.2-For-ARM

August 1st, 2008 No comments

Cross Compile Python 2.5.2 For ARM

本文排版有问题可以看排版后的: http://wiki.woodpecker.org.cn/moin/Cross_Compile_Python_2.5.2_For_ARM

编译环境:

ubuntu 8.04, gcc 4.2.3, arm_v5t_le-gcc 3.4.3

  1. 下载Python,http://www.python.org/download/ 下载Python源码,我下载的:

    http://www.python.org/ftp/python/2.5.2/Python-2.5.2.tar.bz2
  2. 解压:

    tar jxvf Python-2.5.2.tar.bz2
    cd Python-2.5.2
  3. 编译pc版本的语法解析器

由于在编译python的时候,需要先编译一个叫pgen的程序出来,用于生成语法解析器,所以我们要先生成一个pc版本的pgen:

border@b0rder:~/tools/Python-2.5.2$ mkdir build.pc
border@b0rder:~/tools/Python-2.5.2$ cd build.pc/
border@b0rder:~/tools/Python-2.5.2/build.pc$ ../configure
border@b0rder:~/tools/Python-2.5.2/build.pc$ make Parser/pgen

然后ls Parser一下,应该就能看到有pgen了。

  1. 修改../configure

configure在检测编译器的printf是否支持%zd的时候,如果发现是在cross compile,就直接不干活了。这还了得?

把这一部分的检测代码去掉。这段代码起始于:

echo "$as_me:$LINENO: checking for %zd printf() format support" >&5
echo $ECHO_N "checking for %zd printf() format support... $ECHO_C" >&6
if test "$cross_compiling" = yes; then

结束于:

cat >>confdefs.h <<\_ACEOF
#define PY_FORMAT_SIZE_T "z"
_ACEOF

else
  echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5

( exit $ac_status )
echo "$as_me:$LINENO: result: no" >&5
echo "${ECHO_T}no" >&6
fi
rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi

把这两段以及中间的内容都删除掉就可以了, 我的是从 22496 – 22583 行,不同的版本可能不一样。

  1. 编译arm版本的python

有了语法解析器,就可以开始编译arm版本的python了:

border@b0rder:~/tools/Python-2.5.2/build.pc$ mkdir ../build.arm
border@b0rder:~/tools/Python-2.5.2/build.pc$ cd ../build.arm/
../configure --prefix=/opt/arm-test/rootfs --disable-ipv6 --host=arm_v5t_le --enable-shared

先创建一个用于编译的目录build.arm,再对python做一些配置,如安装目录,不要ipv6,使用arm-linux的编译器,生成动态链接库。

  1. 修改Makefile
  1. 去掉Debug:

    OPT=                -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes

一行中,去掉-g,我们不要debug python,-O3改为-O2,空间紧张O2就可以了。 我的是59行。

  1. 修改PGEN:

    PGEN=           Parser/pgen$(EXE)

一行的下面加上

PGEN_HOST= ../build.pc/Parser/pgen$(EXE)

表明我们在HOST上运行的pgen

c 在要使用PGEN的地方改为PGEN_HOST (494行):

$(GRAMMAR_H) $(GRAMMAR_C): $(PGEN) $(GRAMMAR_INPUT)
                -@ mkdir Include
                -$(PGEN) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C)

改为:

$(GRAMMAR_H) $(GRAMMAR_C): $(PGEN) $(GRAMMAR_INPUT)
                -@ mkdir Include
                -$(PGEN_HOST) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C)

d 修改所有使用新生成的python的地方为本机的python绝对地址.
所有如 ./$(BUILDPYTHON) 的地方,都改为python (为本地的python地址,不要使用刚刚编译生成的./python),
在vim里面使用:

:%s/.\/$(BUILDPYTHON)/\/usr\/bin\/python/g

我的是替换了11处。
如:

platform: $(BUILDPYTHON)
        $(RUNSHARED) ./$(BUILDPYTHON) -E -c 'import sys ; from distutils.util import get_platform ; print get_platform()+"-"+sys.version[0:3]' >platform

改为:

platform: $(BUILDPYTHON)
        $(RUNSHARED)  /usr/bin/python  -E -c 'import sys ; from distutils.util import get_platform ; print get_platform()+"-"+sys.version[0:3]' >platform

这种地方比较多,大家小心修改。

如果出这样的错, 说明替换的有问题:

case $MAKEFLAGS in \
        *-s*) LD_LIBRARY_PATH=/home/border/tools/Python-2.5.2/build.arm: CC='arm_v5t_le-gcc' LDSHARED='arm_v5t_le-gcc -shared' OPT='-DNDEBUG -fwrapv -O2 -Wall -Wstrict-prototypes' ./python -E ../setup.py -q build;; \
        *) LD_LIBRARY_PATH=/home/border/tools/Python-2.5.2/build.arm: CC='arm_v5t_le-gcc' LDSHARED='arm_v5t_le-gcc -shared' OPT='-DNDEBUG -fwrapv -O2 -Wall -Wstrict-prototypes' ./python -E ../setup.py build;; \
        esac
/bin/sh: line 2: ./python:无法执行二进制文件

7. 修改setup.py
setup.py负责编译python的各个扩展模块。但是,由于python完全没有考虑cross compile,所以要做一些修改。

PyBuildExt类:
  1. build_extension函数:

    这个函数在编译了所有的extension后,会去load这些刚编译好的extension, 但我们在i686的电脑上显然不能load,所以要跳过这些操作。 在 build_ext.build_extension(self, ext)下一行直接写一个return,不做load。

  1. detect_modules函数:
    • 函数的前两行是把/usr/local加到搜索目录中,我们的cross compiler一般不会直接安装在 /usr/local里面的,所以这两行去掉:

      add_dir_to_list(self.compiler.library_dirs, ‘/usr/local/lib’)
      add_dir_to_list(self.compiler.include_dirs, ‘/usr/local/include’)

      lib_dirs, inc_dirs的设定中,把中括号里的那些都去掉。 以下所有模块都不要:

      cmath, ctypes, _testcapi, pwd, grp, spwd, mmap, audioop, imageop, rgbimg, readline,
      ssl, openssl, bdb, dbm, termios, nsl, ncurses, bz2, linuxaudiodev, ossaudiodev, tkinter

8 main函数

setup函数调用的时候,把要安装的scripts那一部分去掉

之后就可以make && make install了.

  1. 最后在ARM机上执行时如果遇到:

    root@192.168.0.167:~# python2.5
    Could not find platform dependent libraries <exec_prefix>
    Consider setting $PYTHONHOME to <prefix>[:<exec_prefix>]
    Python 2.5.2 (r252:60911, Jul 31 2008, 18:05:30)
    [GCC 3.4.3 (MontaVista 3.4.3-25.0.30.0501131 2005-07-23)] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>>

就是没有配置PYTHONHOME,PYTHONPATH:

export PYTHONHOME=/usr/lib/python2.5
export PYTHONPATH=.:$PYTHONHOME:$PYTHONHOME/site-packages
export PATH=$PATH:$PYTHONHOME:$PYTHONPATH

如果出现’import site’ failed错误,就是PYTHONPATH配置出错。

感谢 Len Jay 不厌其烦的指导。

参考:

– EOF –

Categories: Embedded Tags: , , ,