打印系统介绍
1.1 Linux打印简介
首先需要了解的是,打印在Unix世界的演化中总是围绕着PostScript页面描述语言展开的。该语言是由Adobe公司开发的,它是一个成熟的、用于描述一个文档每个页面内容的程序语言。它是一种与设备无关的打印机语言,即在定义图像时可以根本不考虑输出设备的特性(如打印机的分辨率、纸张大小等),而且它对文本和图形实行同样的处理流程,这给处理字体带来了极大的灵活性。通过PS驱动程序,各种不同的应用软件将各自的数据转换成PostScript格式。
如今很多打印机中都有一个嵌入式的PostScript解释器,它负责使用PostScript将页面在打印纸上再现出来。现在,所有桌面Linux应用程序都有一个打印选项,可以生成PostScript数据来打印整页的文档。
在Linux中,虽然PostScript是产生打印文档的事实上的标准,但打印机本身却并不需要知道PostScript,因为这需要使用到相对比较昂贵的技术。在一般情况下,尤其是在低端打印机中,PostScript数据要被翻译成打印机本地的页面描述语言。这是通过使用一个特殊的转化过滤器来完成的。一般而言,一个过滤器实际上就是一个特殊的程序,它可以处理输入的数据,并且输出经过加工的数据。现在,Linux打印系统中使用着各种不同的过滤器:转换过滤器、I/O过程器(负责将数据传送到设备)、处理过滤器(转换文档数据)。
打印系统的基础是一个假脱机程序(Spooler)。它可以管理打印任务队列,而一个队列通常和一个打印机相关联,并且用户提交的任务都是按照先进先出的原则来处理的。当一个打印任务被处理时,任务中的数据在送达打印机前一般都要通过一定数量的过滤器。Unix打印假脱机程序有很多种形式,目前在Linux系统中使用广泛的几种形式:
1)、BSD LPD打印系统
2)、LPRng打印系统
3)、通用Unix打印系统(CUPS)。cups允许用户为每个打印任务设定不同的选项而不用提前配置整个打印队列。每个打印队列的打印机选项被保存在PPD(PostScript printer description)文件中。在打印机配置对话框中这些选项可以被设成对用户可使用。默认情况,PPD文件允许用户控制所有打印机选项,但是系统管理员通过编辑PPD文件可以限制打印机的功能。
1.2 重要的标准打印机语言
1)、ASCII text。多数打印机至少能够打印ASCII文本,少数的打印机不能够打印ASCII文本,但是可以识别下面几种打印机语言。
2)、PostScript。PostScript打印机语言是Unix和Linux下公认的标准打印机语言。PostScript格式的输出可以被PostScript打印机直接打印,然而这些打印机相对成本高,因为PostScript打印机语言虽然强大但是复杂,需要较高的硬件成本去解析。
3)、PCL3,PCL4,PCL5e,PCL6,ESC/P,ESC/P2和ESC/P raster。光栅语言。
如果PostScript不被打印机支持,打印机过滤器用Ghostscript程序将PostScript格式的数据转换成其他格式的数据。Ghostscript根据不同的打印机使用不同的驱动。
1.3 打印流程
1)、打印任务可以通过命令行或者应用中启动;
2)、相应的打印数据暂时存储在打印队列中,然后由打印机spooler程序读取,并发送给打印过滤器;
3)、打印过滤器进行如下操作:
a、过滤器判断打印数据的格式;
b、如果数据格式不是PostScript格式,首先打印数据被转换成标准的PostScript格式。通常ASCII文本也被转换成PostScript格式;
c、PostScript格式数据根据需要转换成另外格式的打印数据:
●如果打印机支持PostScript格式,不转换;
●如果打印机不是PostScript格式打印机,Ghostscript程序运行将PostScript格 式数据转换成指定打印机支持的数据格式,然后将转换后得数据发送给打印机
4)、所有打印任务都发给打印机后,打印spooler从打印队列中删除该打印任务。
1.3 Linux打印原理
在Linux下采用假脱机(spooling)打印方法,当用户需要打印一个文件时,该文件并不直接送到打印机,而是送到spool目录下,然后由一个负责打印的后台进程把这些数据送入打印机。
Linux对每台打印机都定义了一个打印缓冲区,打印守护程序经常扫描缓冲区以查看有无要打印的新文件。如果存在,就按先进先出的顺序打印缓冲区中的文件。
Linux系统除了可以在本地打印机上打印外,还可以通过网络打印机远程打印。
Linux系统上的打印原理如下:
各种类型的文档经由一个(或一些)转换程序转换成用户正在使用的打印机可以识别的格式,即用各种类型的打印机语言描述的流,系统将这个流直接发送到打印机端口,由打印机对其进行解释并形成硬拷贝。
目前大多数Linux系统以下面的流程来实现文档到打印机语言的转换:
普通文本文件和各种类型的图形由适当的转换程序转换成PostScript文件,有些应用程序将其输出直接写成PostScript文件,这些PostScript文件经由一个作为打印机过滤器的应用程序Ghostscript转换成打印机语言。因此,如果系统的打印系统已经配置成使用Ghostscript作为打印过滤器,应用程序要实现的就是输出合乎程序要求和语法的PostScript文件。
1.4 Linux打印流程
在打印过程中,通常是应用程序产生输出并以管道的方式传送给lpr或者直接应用lpr打印一个文件。lpr与打印机后台服务程序通过网络进行连接并进行通信,传送相应的打印数据和打印选项。打印机后台服务程序将在相应的spool目录存储打印信息,在输出设备可以利用的情况下将打印任务送给打印设备。
1、IPP和Server
IPP-- Internet Printing Protocol
Server -- http://localhost: 631
2、cups内部打印业务处理
1)、转换成PostScript
根据...cups/mime.types判断打印文件格式,根据...cups/mime.convs决定采用哪个转换工具。
2)、统计。
打印文件转换成PostScript格式之后,cups统计每个打印任务的页数,靠pstops程序完成(...lib/cups/filter/pstops),统计数据被写到...var/log/cups/page_log中,该文件的每一行包含如下信息:
●printer name(例如,lp)
●user name(例如,root)
●job number
●date and time(在方括号中)
●current page number
●number of copies
3)、转换成打印机认识的语言
使用指定过滤器转换PostScript格式为打印机认识的语言格式,过滤器位于...lib/cups/filter/文件夹下,过滤器是由PPD文件中的*cupsFilter项决定。如果该项不存在,cups认为打印机支持PostScript,其它的设置项也在PPD文件中
4)、传送数据到打印机
是最后一步,cups调用一个后端(back-end)。后端是特殊的过滤器,用于传输打印数据到设备或网络打印机。后端保持与设备或网络打印机的通讯。如果后端是usb,cups运行.../lib/cups/backend/usb,它会打开并锁定相应的USB设备文件,初始化,传递来自过滤器的打印数据。当打印任务结束,后端关闭并解锁USB设备文件
5)、无过滤器打印
lpr -l 或者 lp -oraw ,通常打印出来的是空的。
3、cups的过滤系统
1)、The pre-filters
如果输入格式不是PostScript,预过滤器将转化它为PostScript格式(更确切的是转换成MIMEtype application/postscript),所使用的过滤器有:texttops,pdftops,hpgltops。(也有imagetops,但是严格来讲,它不是预过滤器):
2)、The pstops-filter
一旦有PostScript格式的可用内容(MIME type application/postscript),pstops filter开始工作。这个过滤器标准化前级输入的PostScript文件,另外执行统计操作(用户的设置,如页数等),它输出的格式为application/vnd.cups-postscript:
3)、The pstoraster-filter
再接着调用的是pstoraster过滤器,该过滤器是CUPS RIP(Raster Imageprocessor)的核心,目前它还衍生了Ghostscript版本5.50。该版本听起来相当的老,但是cups的开发者打了很多补丁,因此这个链中的光栅驱动程序依然能驱动很多喷墨打印机打印出高品质图片,Gimp-Print驱动在Epson打印机上的打印效果比厂家自己提供的Windows驱动打印效果更赞。(注意:pstoraster 工作的时候,cupsomatic开始工作,并且在返回光栅数据给cups后端(backend)之前,cupsomatic引导CUPS-PostScript)。
pstoraster输出光栅数据,格式为MIME type application/vnd.cups-raster:
4)、The imagetoraster-filter
如果输入文件格式是MIME type "image/*",打印机不是PostScript打印机,imagetoraster工作。
5)、imagetops-filter
输入文件格式是MIMEtype "image/*",打印机是PostScript打印机。
6)、The printer-specific filters
最后,但并非最不重要,CUPS光栅数据该转换成打印机特有的格式,同时嵌入与打印机交互的控制指令。这些都是靠打印机对应的特殊过滤器实现的,或者靠调用一个更加通用的但是带有打印机特殊参数的过滤器实现。此时,第三方过滤器可以被调用。
7)、Foomatic和cupsomaticfilter
Foomatic是Linuxprinting.org的数据库。它包含关于打印机模型、合适的Ghostscript驱动、支持的打印参数和驱动执行细节的最完整信息。你可以在网络服务器上使用"PPD-O-Matic"脚本存取这些信息,甚至可以产生针对任何打印机的最新的PPD文件(注:不应当再使用名为"CUPS-O-Matic"的老脚本产生PPD文件,因为和有些应用不兼容)。
最简单的方式:选择你的打印机模型,阅读说明,选定建议的驱动,点击产生PPD,保存PPD然后按照指南安装。PPD-O-Matic产生的PPD文件不是只能被CUPS使用,也能被其他识别PPD的程序使用。PPD文件包含所有可用的驱动和打印机的组合。PPD识别程序能够加载PPD文件,并且解析里面的内容。
为了PPD能够确切的在CUPS服务器上工作,一些先决条件要满足:
●cupsomatic Perl脚本要装在...lib/cups/filter/目录下;
●Ghostscript过滤器要安装,这将要被cupsomatic调用;
●一些Perl模块要安装,cupsomatic运行时需要。
与其他"non-PS-printer-PPD"类似,PPD-O-Matic产生的PPD文件有一行以"*cupsFilter"开始:
*cupsFilter:"application/vnd.cups-postscript 0cupsomatic"
这告诉cups在已经将输入打印数据通过上述标准过滤器机制转换成MIME type of "application/vnd.cups-postscript"格式后使用cupsomatic作为接下来的过滤器。cupsomatic读取该PPD文件中的选项和指令,通过这些指令Ghostscript命令行正确的启动,并且运行合适的过滤器。最后,cupsomatic将转换后得数据交给cups后端,然后后端将数据发送个打印机。
foomatic/cupsomatic将打印机和Ghostscript过滤器的工作整合,使得它在cups上可用。
8)、整体介绍
支持一款打印机最主要的问题是使spooler调用正确的过滤器,并且用户可以控制打印机。大多GNU/Linux分布式计算机使用自己的工具实现,但是这些工具通常支持的打印机不是最新的,并且只能操作很基本的功能。
为了改善这种情况,Grant Taylor创建了一个数据库,用于列出免费的打印机驱动,这个数据库叫做Foomatic,Foomatic目前位于linuxprinting.org。列出了所有免费的打印机驱动和它们的指令以及可用的选项,同时也列出了我们可以获得的所有打印机的支持情况。Foomatic以XML实现,它们是Perl脚本,这些脚本可以自动创建配置文件,为众多周知的免费spooler完成打印队列,这些免费spooler有:LPD、LPRng、GNUlpr、CUPS、PPR、PDQ等。通过Foomatic用户可以独立于spooler接口,因此可以以同样的方式操作所有的spooler。
使用Foomatic有两种方法:
●从linuxprinting.org获得必要的文件,并且手动放在某个位置。
●下载Foomatic包,然后使用它的命令行使用工具。
接下来会一步步的介绍怎样利用上述两种方法安装一款打印机。
利用linuxprinting.org网站配置打印机
1、在linuxprinting.org上查找打印机
2、为打印机选择合适的驱动(使用推荐的)
在linuxprinting.org上进行
3、查看目前系统中是否安装了所选择(所期望)的驱动
目前系统必须安装了Ghostscript。如果所选择的驱动类型是“Ghostscript”,则该驱动必须被编译进Ghostscript。执行gs -h,在可用设备行查看是否所选择的驱动被支持。如果不被支持,有两种选择:
1)、从打印机驱动主页下载驱动,在Ghostscript中编译它。
2)、下载并安装ESP GhostScript 7.05.4或者更新的包含所有"GhostScript"驱动的版本,版本可以从linuxprinting.org上找到。从两方面确保Ghostscript字体能用:一、确保已经安装指定的Ghostscript字体安装包;二、配置Ghostscript时指明字体,如下。
使用gs -h查询的Searchpath项中的后面就有Ghostscript的字体路径。
使用which + “驱动名”的方式查看是否Ghostscript中有自己的驱动,例如:$ which hpijs
/usr/bin/hpijs
如果没有需要从驱动的主页下载安装该驱动。
4、为spooler获取配置文件(PPD文件)
登录http://www.openprinting.org/printers选择打印机型号,选择驱动,点击生成PPD文件,下载保存。注意,PPD文件不是打印机的驱动,它只是用来描述spooler怎样使用打印机驱动。
5、建立打印机队列
首先确保系统已经安装CUPS,安装了Ghostscript,安装了Foomatic;
拷贝生成的PPD文件到...usr/share/cups/model目录下;
重新启动cups;
使用命令行(对于嵌入式未开启远程管理的)或者CUPS的网络接口配置打印队列。命令行如下:
lpadmin -p DJ990 -E -v usb:/dev/usb/lp0 -m HP-DeskJet_990C-hpijs-ppd.ppd -o PageSize=A4
6、配置选项
配置打印机的选项,可以使用CUPS的web接口也可以使用命令行。
在web接口的主界面点击“ManagePrinters”,在指定的打印机上点击“Configure Printer”。以“root”用户登录,
以命令行为例:
1)、首先打印出打印机的帮助页(插上打印机-P之后是打印机的型号,-o docs使不打印,只在终端输出)。
lpr -P DJ990 -o docs ~/.bashrc
2)、列出打印机现在的设置项
lpoptions -p DJ990 -l
3)、配置打印机项
lpadmin -p DJ990 -o Resolution=600ColorCMYK -o Duplex=DuplexNoTumble
或者
lpoptions -p DJ990 -o Resolution=600ColorCMYK -o Duplex=DuplexNoTumble
使用Foomatic包配置打印机
1、安装Foomatic。
系统中必选先安装Perl和libxml2。也必须安装perl-devel和libxml2-devel包,因为这两个包在编译Foomatic时使用
./configure
make
make install
2、决定打印机数据库ID。
1)、使用foomatic-configure命令查询打印机在数据库中对应的id:
foomatic-configure -O | less
输出为:
2)、设置。
这一步做完了所有的步骤:产生PPD,建立队列,配置打印机选项。
对于打印和任务管理可以使用foomatic-printjob命令:
1、lpadmin
用于配置CUPS套件中的打印机和类,也被用来设置打印服务器默认打印机。
语法
选项
-x:删除指定打印机
参数
例如:lpadmin -p hp_lj_pm202n-E -v usb:/dev/usb/lp0 -m Generic-PCL-Laser.ppd
lpadmin -d hp_lj_pm202n
2、lpstat
用于显示CUPS中打印机的状态信息。
语法
lpstat(选项)
选项
例如:lpstat -t
3、lp
用于打印文件,或者修改排队的打印任务。与lpr命令类似,lp命令既支持文件输入也支持标准输入。它与lpr的不同之处在于它有一个不同(稍微复杂点)的参数选项设置。
语法
lp(选项)(参数)
选项
更多参看https://www.cups.org/doc/man-lp.html
退出状态:
4、lpr
用于将文件发送给指定打印机进行打印,如果不指定目标打印机,则使用默认打印机
语法
选项
更多参看https://www.cups.org/doc/man-lpr.html
5、lpoptions
显示或设定打印机选项和默认值。如果没有指定默认打印机需要使用-p选项。该命令设定的参数被lp和lpr目录使用。当以root登录时,lpoptions为所有用户获得以及设定默认选项,这些选项存储在/etc/cups/lpoptions文件中。
语法
选项
详见https://www.cups.org/doc/man-lpoptions.html
打印系统移植
说明:板卡上使用的C库为glibc-2.10.1。而这一点恰恰限制了如下有些版本的软件不能使用。在移植过程中由于没有指导,因为版本的问题,尝尽苦头。
一、移植cups
版本:CUPS-1.5.4(由于历史原因,选取的。)
下载地址:
http://www.cups.org/software.php?VERSION=1.5.4&FILE=1.5.4/cups-1.5.4-source.tar.gz
下面介绍交叉编译过程,遇到的错误以及如何解决:
1、配置。
./configureARCH=arm CC=arm-linux-gcc CXX=arm-linux-g++ AR=arm-linux-ar LD=arm-linux-ld--target=arm-linux --host=arm-linux --build=i386-linux--prefix=/dymind/lib/cups--exec_prefix=/dymind/lib/cups --disable-gnutls --disable-gssapi --disable-dbus --enable-static
2、make
出错,关于man的。
解决方法:
Makedefs中的BUILDDIR去掉man
出错
../cups/libcups.a(transcode.o):In function `_cupsCharmapFlush':
/work/printer/cups-1.5.4-arm/cups/transcode.c:64:undefined reference to `libiconv_close'
解决:
修改Makedefs
添加-liconv
COMMONLIBS = -lpthread -lcrypt -lm -liconv
出错
Generatinglocalization strings...
./genstrings:1: ./genstrings: Syntax error: word unexpected (expecting ")")
解决:
viMakedefs
修改:LD = /usr/bin/ld
为:LD = arm-linux-ld
make通过
更改config.h,屏蔽掉#define HAVE_LIBUSB 1,再make。否则编译出来的后端usb不能用。
进入Makedefs,将44行的INSTALL_BIN = $(LIBTOOL)$(INSTALL) -c -m 555 -s改为
INSTALL_BIN = $(LIBTOOL) $(INSTALL) -c -m 755
49行的INSTALL_LIB = $(LIBTOOL)$(INSTALL) -c -m 555 -s改为
INSTALL_LIB = $(LIBTOOL) $(INSTALL) -c -m 755
51行的INSTALL_SCRIPT = $(INSTALL)-c -m 555改为
INSTALL_SCRIPT = $(INSTALL)-c -m 755
查看Makedefs中的dbus相关内容,如果存在就屏蔽。因为配置时指明--disable-dbus,但是如果系统中安装了dbus,它还是会编译进去的。下面是我的Ubuntu中交叉编译时虽然指定disable-dbus,但是还是在Makedefs生成dbus相关内容:
屏蔽等号后的内容。
如果宿主机或linux系统是64位的,还会生成lib64,更改Makedefs中的lib64相关项。
注意自己的交叉编译工具路径,可以在Makedefs中查看,如果不对,改正。
注意可能会出现多次./genstrings:1: ./genstrings: Syntax error: word unexpected (expecting ")")的错误,按照上面处理。
3、make install
生成/dymind/lib/cups目录,进入etc/cups目录,打开cupsd.conf,进行如下更改:
cd /dymind/lib/cups/etc/cups
打开cupsd.conf文件,更改cups配置,如下:
1)、在第15行加入:
# Allow new printers to be added using device URIs"file:/filename"
FileDevice Yes
2)、在
下增加
DefaultEncryption Never
以下更改是使cups可以远程管理
2)、更改监听端口:
Listen localhost:631改为Port 631
3)、# Restrict access to the server做如下更改
在Orderallow,deny下面增加一行Allowfrom All
4)、# Restrict access to the admin pages做如下更改
在Orderallow,deny下面增加一行Allowfrom All
5)、# Restrict access to configuration files做如下更改
在Orderallow,deny下面增加一行Allowfrom All
开机启动
在修改系统启动文件/ets/init.d/rcS
添加/etc/init.d/cups start
/etc/init.d/cups是安装第3步中安装cups时在编译机的/etc/init.d中生成的。从编译机的/etc/init.d中将cups拷贝到目标板卡文件系统的根目录下。
二、移植Ghostscript
版本:ghostscript 8.63(历史原因)
下载地址:
http://sourceforge.net/projects/ghostscript/files/GPL%20Ghostscript/8.63/ghostscript-8.63.tar.gz/download
交叉编译
# 1.下载源码
http://sourceforge.net/projects/ghostscript/files/GPL%20Ghostscript/8.63/ghostscript-8.63.tar.gz/download
# 2.解压源码
tar xvzf ghostscript-8.63.tar.gz
# 3.分别拷贝为PC版本和ARM版本
cp ghostscript-8.63 ghostscript-8.63-arm -r && mv ghostscript-8.63 ghostscript-8.63-pc
# 4.编译PC版本
# -DHAVE_SYS_TIME_H是解决warning: implicit declaration of function 'gettimeofday'
cd ghostscript-8.63-pc && ./configure && make XCFLAGS=-DHAVE_SYS_TIME_H=1 && cd ../
注:配置的时候因为jasper/configure.status是生成的被加密,所以会出现./config.status:./config.status: cannot execute binary file
configure: error: jasper configure script failed故障,因此无法编译。后来更改加密策略(加上.status)后可以配置。但是Makefile又被加密了,更改加密策略后可以编译。后面也有加密的问题,放弃在加密客户端下编译
# 5.配置arm版本
cd ghostscript-8.63-arm && ./configure --host=arm-linux --enable-cups --with-libiconv=none --prefix=/dymind/lib/printer
注意:如果编译机系统装有cairo库,在Makefile中得手动去掉cairo相关内容;另外确保Makefile中的cups相关项有效。
# 6.修改Makefile中STDLIBS=-lpthread -lm 为STDLIBS=-lpthread-lm -static
make XCFLAGS=-DHAVE_SYS_TIME_H=1
报错:
# 7.拷贝PC版本工具
cp ../ghostscript-8.63-pc/obj/genarch ../ghostscript-8.63-pc/obj/genconf ../ghostscript-8.63-pc/obj/echogs ./obj/
# 8.编译
make
报错:
# 9.拷贝PC版本工具
cp ../ghostscript-8.63-pc/obj/geninit ./obj/
make
报错:
cp ../ghostscript-8.63-pc/obj/mkromfs ./obj/
make
Ubuntu系统能够编译通过,但是centos系统编译不过,原因是加密造成的。
# 10.安装(这个版本不支持make install的DESTDIR指定根目录所以要手动拷贝,以后要调整目录)
make install
安装在根目录的/dymind/lib/printer下
安装完之后将/dymind/lib/printer下的bin所有内容拷贝到cups的bin目录;删除/dymind/lib/printer下的bin
三、移植cups-filters
注1、cups-filters1.11.5之后引入execvpe,这需要使用glibc2.11以后的版本。
注2、cups-filters1.0.55引入mkstemps,这需要使用glibc2.11以后的版本。
注3、实际交叉编译cups-filters1.0.53,发现foomatic-rip也需要mkstemps。放弃编译foomatic-rip。
版本:cups-filters-1.0.53
下载地址:
http://www.openprinting.org/download/cups-filters/
交叉编译
1、配置
./configure --host=arm-linux --prefix=$(pwd)/_install--with-cups-config=/dymind/lib/cups/bin/cups-config--with-gs-path=/dymind/lib/cups/bin/gs --disable-braille--with-pdftops-path=/dymind/lib/cups/lib/cups/filter/pdftops --disable-avahi--without-tiff ENABLE_DRIVERLESS_TRUE='#' --enable-poppler ac_cv_header_poppler_cpp_poppler_version_h=yes--disable-dbus GLIB_CFLAGS="-I/home/chanprj/zengxiangwei/glib-2.50.3/install/include-I/home/chanprj/zengxiangwei/glib-2.50.3/install/include/glib-2.0 -I/home/chanprj/zengxiangwei/glib-2.50.3/install/lib/glib-2.0/include"GLIB_LIBS="-L/home/chanprj/zengxiangwei/glib-2.50.3/install/lib-lglib-2.0" FONTCONFIG_CFLAGS="-I/home/chanprj/zengxiangwei/fontconfig-2.12.1/install/include" FONTCONFIG_LIBS="-L/home/chanprj/zengxiangwei/fontconfig-2.12.1/install/lib-lfontconfig" IJS_CFLAGS="-I/home/chanprj/zengxiangwei/ijs-0.35/install/include"IJS_LIBS="-L/home/chanprj/zengxiangwei/ijs-0.35/install/lib -lijs" POPPLER_CFLAGS="-I/home/chanprj/zengxiangwei/poppler-0.20.5/install/include/poppler"POPPLER_LIBS="-L/home/chanprj/zengxiangwei/poppler-0.20.5/install/lib-lpoppler" LIBQPDF_CFLAGS="-I/home/chanprj/zengxiangwei/qpdf-6.0.0/install/include"LIBQPDF_LIBS="-L/home/chanprj/zengxiangwei/qpdf-6.0.0/install/lib-lqpdf" FREETYPE_CFLAGS="-I/home/chanprj/zengxiangwei/freetype-2.7/install/include/freetype2"FREETYPE_LIBS="-L/home/chanprj/zengxiangwei/freetype-2.7/install/lib -lfreetype"
注意:依赖库的安装路径根据具体安装位置填写。
遇到的问题:
1)、需要移植glib2.0,且版本号要高于2.30.2.
下载glib-2.50.3源码包(ftp://ftp.gnome.org/pub/gnome/sources/glib/2.50/)(注意2.0会提示版本低,版本要高于2.30.2)
解压、配置
echoac_cv_type_long_long=yes> arm-linux.cache&& echo glib_cv_stack_grows=no>>arm-linux.cache && echo glib_cv_uscore=no>>arm-linux.cache&& echo ac_cv_func_posix_getpwuid_r=yes>>arm-linux.cache&& ./configure --host=arm-linux --prefix=$(pwd)/install --cache-file=arm-linux.cache--enable-libmount=no --with-libiconv=gnu PCRE_CFLAGS="-I/home/chanprj/zengxiangwei/pcre-8.40/install/include"PCRE_LIBS="-L/home/chanprj/zengxiangwei/pcre-8.40/install/lib -lpcre"
注意:依赖库的安装路径根据具体安装位置填写。
遇到的问题:
①、需要移植zlib。
自glib-2.23开始就需要zlib,zlib是提供数据压缩用的函数库。
从https://sourceforge.net/projects/libpng/files/zlib/1.2.8/zlib-1.2.8.tar.gz/download下载源码包;
./configure
make
makeinstall
②、需要移植libpcre。
⑴、从ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.40.tar.bz2下载pcre源码包。
⑵、交叉编译
./configure --host=arm-linux--prefix=$(pwd)/install
make
makeinstall
根据不同的编译环境,可能需要不同的依赖包。附录会列出我遇到的主要问题。
make之前需要确认交叉编译器的路径是否对,查看Makefile,如果不对修改,注意所有的Makefile。
make
make出错
该函数是glibc2.11后得函数glibc2.10没有。更改config.h屏蔽掉HAVE_FALLOCATE宏的定义。
make install
2)、需要移植fontconfig,且版本要高于2.0.0。
从https://www.freedesktop.org/software/fontconfig/release/下载源码包fontconfig-2.12.1。
解压、配置
./configure--host=arm-linux --prefix=$(pwd)/install --enable-static --enable-libxml2 LIBXML2_CFLAGS="-I/home/chanprj/zengxiangwei/libxml2-2.9.0/install/include/libxml2"LIBXML2_LIBS="-L/home/chanprj/zengxiangwei/libxml2-2.9.0/install/lib-lxml2" FREETYPE_CFLAGS="-I/home/chanprj/zengxiangwei/freetype-2.7/install/include/freetype2"FREETYPE_LIBS="-L/home/chanprj/zengxiangwei/freetype-2.7/install/lib -lfreetype"ICONV_CFLAGS="-I/opt/arm/4.4.6/arm-embedsky-linux-gnueabi/include" ICONV_LIBS="-L/opt/arm/4.4.6/arm-embedsky-linux-gnueabi/embedsky/usr/lib-liconv"
注意:依赖库的安装路径根据具体安装位置填写。
遇到的问题:
①、需要移植libxml2.
从ftp://xmlsoft.org/libxml2/libxml2-2.9.0.tar.gz下载源码包。
./configure CC=arm-linux-gcc--host=arm-linux --prefix=$(pwd)/install --enable-static --build=i686-linux--with-gnu-ld
make
make install
②、需要移植freetype2.7.
从https://sourceforge.net/projects/freetype/files/freetype下载freetype2.7源码包.
./configure --host=arm-linux --prefix=$(pwd)/install--exec-prefix=$(pwd)/install --enable-static
make
make install
make
make install
3)、需要移植ijs
从https://www.openprinting.org/download/ijs/download/ijs-0.35.tar.bz2下载ijs源码。
交叉编译
./configure --host=arm-linux--prefix=$(pwd)/install
make
make install
4)、需要移植poppler
从http://poppler.freedesktop.org/poppler-0.20.5.tar.gz下载源码
交叉编译
./configure --host=arm-linux --prefix=$(pwd)/install FONTCONFIG_CFLAGS="-I/home/chanprj/zengxiangwei/fontconfig-2.12.1/install/include" FONTCONFIG_LIBS="-L/home/chanprj/zengxiangwei/fontconfig-2.12.1/install/lib-lfontconfig" FREETYPE_CFLAGS="-I/home/chanprj/zengxiangwei/freetype-2.7/install/include/freetype2"FREETYPE_LIBS="-L/home/chanprj/zengxiangwei/freetype-2.7/install/lib -lfreetype"
make
make install
make过程中如果遇到找不到指定库,将制定库拷贝到交叉编译器库路径下。
注意:依赖库的安装路径根据具体安装位置填写。
5)、需要移植libqpdf
从http://downloads.sourceforge.net/qpdf/qpdf-6.0.0.tar.gz下载源码。
交叉编译
./configure --host=arm-linux--prefix=$(pwd)/install --exec-prefix=$(pwd)/install--with-random=/dev/urandom CPPFLAGS=-I/home/chanprj/zengxiangwei/pcre-8.40/install/includeLDFLAGS=-L/home/chanprj/zengxiangwei/pcre-8.40/install/lib
注意:依赖库的安装路径根据具体安装位置填写。
2、make
遇到的问题:
1)、找不到制定的库。解决方式,拷贝指定库到交叉编译器库路径下。
2)、找不到制定的头文件。解决方式,根据错误提示,将头文件拷贝到指定目录下。
3)、
①、解决方式,屏蔽调相关行。
②、在Page.h中增加 。
4)、
解决方式,将头文件拷贝到源码目录。
5)、
mkstemps是glibc2.11之后的函数,无解。屏蔽掉foomatic-rip的编译(当然照着foomatic-filters中的foomaticrip.c函数更改也是可以的)。后面专门移植foomatic-rip。解决方式:
打开Makefile,去掉pkgfilter_PROGRAMS中的foomatic-rip$(EXEEXT)。
3、make install
1)、安装完后再cups的安装目录自动安装过滤器等,在cups-filters的源码目录下生成_install目录。
2)、将cups-filters安装目录下的lib下的所有拷贝到cups的安装目录中的lib中。
3)、将cups-filters依赖的库libpcre拷贝到cups的安装目录中的lib中。
4)、将cups-filters依赖的库libqpdf拷贝到cups的安装目录中的lib中。
5)、将cups-filters依赖的库libpoppler拷贝到cups的安装目录的lib中。
6)、将cups-filters依赖的库libfontconfig拷贝到cups的安装目录的lib中.
7)、将cups-filters依赖的库libxml2拷贝到cups的安装目录的lib中。
注:指明了gs的位置,gs一定要放到/dymind/lib/cups/bin中,否则打印时总是报“No pages were found”
四、移植foomatic-filters
版本:foomatic-filters-4.0.12
下载地址:http://www.openprinting.org/download/foomatic/
1、安装autoconf工具和automake工具;
2、安装libdbus-glib-1-dev
3、下载foomatic-filters包http://www.openprinting.org/download/foomatic/
1)、./configure--host=arm-linux --prefix=$(pwd)/_install --exec-prefix=$(pwd)/_install --disable-dbus --with-execpath=/dymind/lib/cups/lib/cups/filter:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/sbin
2)、
报错编译不过,更改config.h文件:
屏蔽#definemalloc rpl_malloc和#define realloc rpl_realloc
3)、更改foomatic-filters的Makefile中的CUPS的安装目录。
4)、更改源码包中的foomaticrip.c的源码,增加cupsfilters的路径。
5)、更改源码包中的foomaticrip.c的源码,将/bin/bash给为/bin/sh。
make
make install-cups
在_install目录下生成bin、etc、cups三个目录,bin目录下的是执行程序foomatic-rip,拷贝它到CUPS安装目录的bin下;etc目录下有文件夹foomatic,拷贝它到cups安装目录的etc下;cups中暂时不用。
在... cups/lib/cups/filter下面建立foomatic-rip的链接:
ln -s /dymind/lib/cups/bin/foomatic-ripfoomatic-rip
注:目前字体有限,后期可能要维护
附录1cups-filters移植记录
基于cups+foomatic+Ghostscript的打印方案,理论上是行的通的,但是在打印时总是报“unsupported document format”类错误,Google上没有给出原因,但是给出了解决方式,即移植cups-filters。(自己猜测可能是cups1.6之前版本的过滤器有问题)
另外,
ⅰ、下载cups-filters源码(http://www.openprinting.org/download/cups-filters/);
注1、cups-filters1.11.5之后引入execvpe,这需要使用glibc2.11以后的版本。我开始交叉编译的cups-filters的版本为1.13.4,也成功的移植了glibc2.15,但是板卡上系统自带的glibc为2.10版本。因此有两个方法:一、更新板卡的c库;二、重新编译1.11.5以下版本的cups-filters。
但是C库由busy-box提供,如果更新,全部得更新(尝试直接换掉c库,但是总是报段错误。),所以我重新移植cups-filters1.11.4.
注2、cups-filters1.0.55引入mkstemps,这需要使用glibc2.11以后的版本。我交叉编译的cups-filters1.11.4版本当运行foomatic-rip时提示需要glibc2.11。有两种方法:一、交叉编译1.0.55之后的版本;2、使用foomatic-filters。
注3、实际交叉编译cups-filters1.0.53,发现foomatic-rip也需要mkstemps。这也cups-filters的NEWS说明的不一样。尝试编译更低版本的cups-filters。
ⅱ、拷贝到指定目录,解压。
ⅲ、配置、编译、安装。
./configure --host=arm-linux--prefix=$(pwd)/_install --with-cups-config=/dymind/lib/cups/bin/cups-config--with-gs-path=/dymind/lib/cups/bin/gs --disable-braille--with-pdftops-path=/dymind/lib/cups/lib/cups/filter/pdftops --disable-avahi --without-tiff ENABLE_DRIVERLESS_TRUE='#' --enable-poppler--disable-dbus
可能遇到的问题:
1、 ,一般而言交叉编译器是有libpng库的,只是库的路径可能没有添加到搜索路径中,解决方式在环境变量PKG_CONFIG_PATH中添加交叉编译器库路径。
返回到cups-filters的配置
2、
原因是交叉编译时指定的cups目录不是实际安装的目录,解决方法是按照要做的文件系统,安装cups和Ghostscript。(或者更改前面的配置路径,这里就是更改前面的配置路径)
返回到cups-filters的配置
3、
1)、下载tiff源码包(ftp://download.osgeo.org/libtiff/)
2)、解压,配置
./configure --host=arm-linux --prefix=$(pwd)/install
3)、make
4)、make install
但是安装后无论怎么设定还是报这个错误所以将tiff文件的支持去掉,即配置中加--without-tiff参数。
返回到cups-filters的配置
4、
注:这一步是在centos上遇到的问题,Ubuntu下已经有这个包了。
1)、下载glib-2.50.3源码包(ftp://ftp.gnome.org/pub/gnome/sources/glib/2.50/)(注意2.0会提示版本低,版本要高于2.30.2)
2)、解压、配置
echo ac_cv_type_long_long=yes> arm-linux.cache&& echo glib_cv_stack_grows=no>>arm-linux.cache && echo glib_cv_uscore=no>>arm-linux.cache&& echo ac_cv_func_posix_getpwuid_r=yes>>arm-linux.cache&& ./configure --host=arm-linux --prefix=$(pwd)/install--cache-file=arm-linux.cache --enable-libmount=no --with-libiconv=gnu
可能遇到的问题:
①、
原因configure不能为交叉编译检查glib_cv_stack_grows,即堆栈增长方向,configure无法再目标机上运行测试程序,自然无法检查,只好手工指定。顺便看一下还有哪些相关的变量不能检查的,一起写到cache文件中,并重新配置:
②、在centos下提示没有gettext软件,直接用yum命令安装;
③、
自glib-2.23开始就需要zlib,zlib是提供数据压缩用的函数库。
从https://sourceforge.net/projects/libpng/files/zlib/1.2.8/zlib-1.2.8.tar.gz/download下载源码包;
./configure
make
make install
④、configure: error: *** Could not find libmount
libmount 是util-linux(Linux标准软件包)中的一个工具,我的交叉编译器工具链中没有,这儿采取的办法是加参数--enable-libmount=no。
⑤、
移植libpcre库,见后面章节。
配置通过。
3)、make
可能遇到的问题:
①、
配置时设置参数--with-libiconv=gnu.
②、
和
结构体没有地方定义,查看函数,发现由宏
#if !defined (G_OS_WIN32)&& defined (HAVE_SENDMMSG)
和
#if !defined (G_OS_WIN32) &&defined (HAVE_RECVMMSG)
控制编译,配置生成的config.h中宏G_OS_WIN32没有定义但是HAVE_SENDMMSG和
HAVE_RECVMMSG都定义了。在config.h中屏蔽掉这两个宏。
编译通过
4)、make install
返回到cups-filters的配置
5、
注意:fontconfig2.3.93以下的版本必须配合freetype2.2以下的版本使用,否则make时会出现如下错误:
下载fontconfig-2.12.1配置时没有报任何错误。
最终使用fontconfig-2.12.1配合freetype2.7。
1)、从https://www.freedesktop.org/software/fontconfig/release/下载源码包。
2)、解压、配置
./configure --host=arm-linux--prefix=$(pwd)/install --enable-static --enable-libxml2
可能遇到的问题:
①、
搜索freetype-config的安装路径(一般在交叉编译器的路劲下),加上参数--with-freetype-config=安装路径。
注:后来fontconfig make时出错,这里改为交叉编译freetype
https://sourceforge.net/projects/freetype/files/freetype/(这里的版本是1.3.1)
./configure --host=arm-linux--prefix=$(pwd)/install --exec-prefix=$(pwd)/install --enable-static
修改config.cache的第32行为ac_cv_path_LD=${ac_cv_path_LD='arm-linux-ld'}
修改config.cache的第36行为ac_cv_prog_CC=${ac_cv_prog_CC='arm-linux-gcc'}
修改config.cache的第37行为ac_cv_prog_CPP=${ac_cv_prog_CPP='arm-linux-gcc-E'}
再配置一次 ./configure --host=arm-linux --prefix=$(pwd)/install --enable-static
make 出错
解决方法:
移植X11(注本人没有实际移植过,这儿受阻后就更改fontconfig的版本为2.12.1(开始为2.2.2))
gedit test/ftdump.c
将155行的#define PRINT_MEM( field, string ) Print_Mem( memory_footprint.##field, string )改为
#define PRINT_MEM(field, string ) Print_Mem( memory_footprint.field, string )
将143行的#define FOOTPRINT( field ) Save_Memory( &memory_footprint.##field )
改为
#define FOOTPRINT( field) Save_Memory(&memory_footprint.field )
[曾祥伟1] 修改产生的Makefile文件,以跳过编译test目录。去掉“all:”后面的变量“tttest”,以及注释掉“install:”下的第二行:“cd$(FTTESTDIR); $(MAKE) -f $(MAKEFILE) install”。
make
make install
[曾祥伟2] freetype-2.7版本make时出错如下
解决:
打开指定头文件在相应位置增加宏,默认屏蔽该段,我加的宏的名称为SKIP_PNG_SETJMP_CHECK
make install
将安装路径添加到环境变量PKG_CONFIG_PATH中。返回fontconfig编译
配置变为:
./configure --host=arm-linux --prefix=$(pwd)/install --with-freetype-config=/home/work/freetype-2.7/install/bin/freetype-config
[曾祥伟3] ②、
从https://sourceforge.net/projects/expat/files/expat/下载expat源码包,解压、配置,这里用2.2.0版本
进入expat-2.2.0目录下:
./configure--host=arm-linux --prefix=$(pwd)/install
make
makeinstall
将安装路径添加到环境变量PKG_CONFIG_PATH中。返回fontconfig的编译。
[曾祥伟4] ③、
fontconfig2.12.1刚开始解压后配置、编译能过,但是make distclean后再开始就报上面的错误,得移植libxml
从ftp://xmlsoft.org/libxml2/libxml2-2.9.0.tar.gz下载源码包
./configure CC=arm-linux-gcc --host=arm-linux--prefix=$(pwd)/install --enable-static --build=i686-linux --with-gnu-ld
make
make install
添加环境变量,返回fontconfig配置,
配置通过[曾祥伟5] ,
3)、在fontconfig配置中添加--with-expat-include=上一步中的expat头文件安装路径,--with-expat-lib=上一步中的expat库安装路径。
./configure--host=arm-linux --with-arch=arm-linux --prefix=$(pwd)/install --with-freetype-config=/home/work/freetype-2.7/install/bin/freetype-config--with-expat-includes=/home/work/expat-2.2.0/install/include/--with-expat-lib=/home/work/expat-2.2.0/install/lib/
配置通过
4)、make
5)、make install
[曾祥伟6] 返回到cups-filters的配置。
6、
1)、从http://downloads.sourceforge.net/qpdf/qpdf-6.0.0.tar.gz下载源码。
2)、交叉编译
./configure --host=arm-linux--prefix=$(pwd)/install --exec-prefix=$(pwd)/install --with-random=/dev/urandomCPPFLAGS=-I/home/work/pcre-8.40/install/include LDFLAGS=-L/home/work/pcre-8.40/install/lib
可能遇到的问题如下:
①、
由于是在主机上配置、编译,所以配置期间没有找到合适于目标系统的随机数生成器,/dev/urandom就是。加上参数--with-random=/dev/urandom.
②、
解决方式,交叉编译pcre。
⑴、从ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.40.tar.bz2下载pcre源码包。
⑵、交叉编译
./configure--host=arm-linux --prefix=$(pwd)/install
make
makeinstall
设置环境变量,返回libqpdf配置。
配置libqpdf时任然报相同的错误,解决方法为:
加参数CPPFLAGS=-I/home/work/pcre-8.40/install/include
LDFLAGS=-L/home/work/pcre-8.40/install/lib
make
make install
设置环境变量,返回cups-filters的配置
7、
1)、从http://poppler.freedesktop.org/poppler-0.51.0.tar.xz下载源码
(https://poppler.freedesktop.org/releases.html)
2)、交叉编译
./configure --host=arm-linux--prefix=$(pwd)/install
make
出错
①、
该库为后来自己移植的原来的工具链中没有。
将/home/work/fontconfig-2.12.1/install/lib/下的所有库拷贝到交叉编译工具链的库路径/opt/EmbedSky/4.4.6/arm-embedsky-linux-gnueabi/embedsky/usr/lib下。
将/home/work/libxml2-2.9.0/install/lib/下的所有库拷贝到交叉编译工具链的库路径/opt/EmbedSky/4.4.6/arm-embedsky-linux-gnueabi/embedsky/usr/lib下。
make通过
make install
设置环境变量,返回cups-filters的配置
8、
1)、从https://www.openprinting.org/download/ijs/download/ijs-0.35.tar.bz2下载ijs源码
2)、交叉编译
./configure --host=arm-linux--prefix=$(pwd)/install
make
make install
设置环境变量,返回cups-filters的配置
9、
将/home/work/poppler-0.51.0/install/include下的poppler文件夹及内容拷贝到/opt/EmbedSky/4.4.6/arm-embedsky-linux-gnueabi/embedsky/usr/include目录下
返回cups-filters的配置
10、
加上参数ENABLE_DRIVERLESS_FALSE='#'
返回cups-filters的配置。配置通过,下面进行cups-filters的make。
make
可能出现的问题:
1、
找不到这些头文件,这些头文件在cups安装目录的include中。拷贝头文件到交叉编译工具链的路径下。
2、
将相关库拷贝到交叉编译工具链路径所在库。
cp -a /dymind/lib/cups/lib/* /opt/EmbedSky/4.4.6/arm-embedsky-linux-gnueabi/lib
3、
该宏没有定义,原本cups安装目录的include/cups/ipp.h中应该有定义,可是1.5.4版本的cups安装后ipp.h中却没有,怀疑与版本有关,放弃编译cups-filters的后端中的implicitclass
Makefile中
改为
另外该C文件中没有区分cups版本号,而使用的宏却在高版本的cups头文件中才定义的,查看cups-filters的源码,发现cups-filters确实只只针对cups1.6以后的版本,cups1.5.4严格来说并不需要cups-filters,这一点正如本章开始阐明的那样。
4、
类似这类错误是由于某些安装包源码的头文件路径没有包含,将相关头文件拷贝到/opt/EmbedSky/4.4.6/arm-embedsky-linux-gnueabi/include。
cd /home/work/poppler-0.51.0
cp -a goo /opt/EmbedSky/4.4.6/arm-embedsky-linux-gnueabi/include
cp -a splash/opt/EmbedSky/4.4.6/arm-embedsky-linux-gnueabi/include
cp -a cpp/opt/EmbedSky/4.4.6/arm-embedsky-linux-gnueabi/include
cp poppler/poppler-config.h/opt/EmbedSky/4.4.6/arm-embedsky-linux-gnueabi/include
cp -a poppler/opt/EmbedSky/4.4.6/arm-embedsky-linux-gnueabi/include
cp poppler/CharTypes.h/opt/EmbedSky/4.4.6/arm-embedsky-linux-gnueabi/include
cp poppler/GlobalParams.h/opt/EmbedSky/4.4.6/arm-embedsky-linux-gnueabi/include
cp poppler/Error.h/opt/EmbedSky/4.4.6/arm-embedsky-linux-gnueabi/include
cp poppler/Object.h/opt/EmbedSky/4.4.6/arm-embedsky-linux-gnueabi/include
cp poppler/Array.h/opt/EmbedSky/4.4.6/arm-embedsky-linux-gnueabi/include
cp poppler/Dict.h/opt/EmbedSky/4.4.6/arm-embedsky-linux-gnueabi/include
cp poppler/Stream.h/opt/EmbedSky/4.4.6/arm-embedsky-linux-gnueabi/include
cp poppler/GfxState.h/opt/EmbedSky/4.4.6/arm-embedsky-linux-gnueabi/include
cp poppler/GfxFont.h/opt/EmbedSky/4.4.6/arm-embedsky-linux-gnueabi/include
cp poppler/Link.h/opt/EmbedSky/4.4.6/arm-embedsky-linux-gnueabi/include
cp poppler/CharCodeToUnicode.h/opt/EmbedSky/4.4.6/arm-embedsky-linux-gnueabi/include
cp poppler/FontEncodingTables.h/opt/EmbedSky/4.4.6/arm-embedsky-linux-gnueabi/include
cp -a fofi /opt/EmbedSky/4.4.6/arm-embedsky-linux-gnueabi/include
cp poppler/CMap.h/opt/EmbedSky/4.4.6/arm-embedsky-linux-gnueabi/include
cp poppler/OutputDev.h/opt/EmbedSky/4.4.6/arm-embedsky-linux-gnueabi/include
cp poppler/Function.h/opt/EmbedSky/4.4.6/arm-embedsky-linux-gnueabi/include
cp poppler/PopplerCache.h/opt/EmbedSky/4.4.6/arm-embedsky-linux-gnueabi/include
cp poppler/PDFDoc.h/opt/EmbedSky/4.4.6/arm-embedsky-linux-gnueabi/include
cp poppler/Gfx.h/opt/EmbedSky/4.4.6/arm-embedsky-linux-gnueabi/include
cp poppler/XRef.h/opt/EmbedSky/4.4.6/arm-embedsky-linux-gnueabi/include
cp poppler/Catalog.h/opt/EmbedSky/4.4.6/arm-embedsky-linux-gnueabi/include
cp poppler/Page.h/opt/EmbedSky/4.4.6/arm-embedsky-linux-gnueabi/include
cp poppler/Annot.h/opt/EmbedSky/4.4.6/arm-embedsky-linux-gnueabi/include
cp poppler/Form.h/opt/EmbedSky/4.4.6/arm-embedsky-linux-gnueabi/include
cp poppler/OptionalContent.h/opt/EmbedSky/4.4.6/arm-embedsky-linux-gnueabi/include
cp poppler/PDFDocEncoding.h/opt/EmbedSky/4.4.6/arm-embedsky-linux-gnueabi/include
cp poppler/SplashOutputDev.h/opt/EmbedSky/4.4.6/arm-embedsky-linux-gnueabi/include
5、
是语法的错误,看看源文件截图
这是定义,但是由于宏HAVE_CUPS_1_7没有指定,所以没有定义。
这儿是使用,很显然该段程序不关注宏HAVE_CUPS_1_7。改法是将定义移除宏 HAVE_CUPS_1_7。
6、
找不到execvpe函数,该函数在unistd.h中声明,在libc.so.6中定义(注:libc.so.6是符号链接,指向某版本的libc,例如libc-2.15.so)。值得注意的是execvpe在glibc2.11引进的新函数,低版本不支持。
交叉编译glibc-2.15。
1)、从ftp.gnu.org/gnu/glibc/glibc-2.15.tar.gz和ftp.gnu.org/gnu/glibc/glibc-ports-2.15.tar.gz下载源码
2)、交叉编译
解压
mv glibc-ports-2.15 glibc-2.15/ports
mkdir glibc-build-2.15 &&cd glibc-build-2.15
../glibc-2.15/configure --host=arm-linux-gnueabi --build=i686-pc-linux-gnu --prefix=$(pwd)/install CC=arm-linux-gcc --enable-add-on=nptl libc_cv_forced_unwind=yes libc_cv_c_cleanup=yes libc_cv_mips_tls=yes libc_cv_gnu99_inline=yes ARCH=arm CFLAGS="-O2 -U_FORTIFY_SOURCE" --enable-kernel=2.6.0
交叉编译会遇到一些问题,详见网上的博客
http://blog.csdn.net/fjhyy/article/details/18960899
http://www.voidcn.com/blog/cfxks1989/article/p-1924428.html
和http://blog.chinaunix.net/uid-26766564-id-3190493.html(注意这篇博客中的补丁不要使用否则在链接时报错)
①、
如果没有创建一个构建目录会报这个错误。解决方式为在glibc-2.15的源码目录下创建glibc-build-2.15目录。
②、
警告先不管,错误说LD_LIBRARY_PATH有问题。原因是LD_LIBRARY_PATH不能以终结符作为开始和最后一个字符,不能有2给终结符连在一起。export发现确实存在这个问题,改过来,配置能够通过。
make
会遇到以下错误:
①、
工具的问题。解决方式为
②、
将配置中的--host=arm-linux换成--host=arm-linux-gnueabi
③、
加参数CFLAGS="-O2 -U_FORTIFY_SOURCE"解决。
make通过
make install
返回cups-filters make
7、
此问题与问题5一样。
8、
该宏没有定义,原本cups安装目录的include/cups/ipp.h中应该有定义,可是1.5.4版本的cups安装后ipp.h中却没有,网上查得该宏的实际值为11,改为11
9、
10、
分析代码filter/pdftoopvp/oprs/OPVPSplashXPath.h,发现是poppler的版本检查没有起作用,原因不详。在该头文件的开始出增加
11、
猜测原因同上,如上处理有效。
12、
原因同上
13、
原因同上
14、
原因同上
15、
原因同上
16、
原因同上
17、
原因同上
注:问题10到17也可以通过配置时加参数--enable-poppler ac_cv_header_poppler_cpp_poppler_version_h=yes解决
18、
该宏在ipp.h头文件中定义,但是cups1.5.4版本没有。这是一类问题,从高版本的ipp.h中找出枚举定义的值,加在报错C文件的开头。这里有一系列类似问题。
19、
交叉编译glib-2.0,修改cups-filters的Makefile。
将GIO_CFLAGS = -pthread -I/home/work/pcre-8.40/install/include -I/usr/include/glib-2.0 -I/usr/lib/i386-linux-gnu/glib-2.0/include相关的改为
或者重新配置cups-filters,再make。
20、
先看第一个问题,没有定义httpConnect2.该函数在cups的http.c函数中定义,但是在cups1.7之后增加的,我们的版本cups1.5.4没有
所以问题无法解决。
屏蔽掉该功能的编译,更改Makefile,更改如下:(屏蔽掉=后面的)
sbin_PROGRAMS = #cups-browsed$(EXEEXT)
21、
交叉编译dbus。
./configure --host=arm-linux --prefix=$(pwd)/install CFLAGS=-I/home/work/expat-2.2.0/install/include LDFLAGS=-L/home/work/expat-2.2.0/install/lib
make时报错:交叉编译工具下没有找到dbus库。
这个问题很蹊跷,在编译dbus还报找不到dbus库。问题出在编译test时,解决方法为去掉Makefile 496行中的test,不编译它。
make install。拷贝安装目录下的库到交叉编译器库下。
make通过
make install。
I、从http://www.openprinting.org/download/cups-filters/下载指定版本的源码。
II、交叉编译
1、配置
./configure --host=arm-linux--prefix=$(pwd)/_install --with-cups-config=/dymind/lib/cups/bin/cups-config--with-gs-path=/dymind/lib/cups/bin/gs --disable-braille--with-pdftops-path=/dymind/lib/cups/lib/cups/filter/pdftops --disable-avahi--without-tiff ENABLE_DRIVERLESS_TRUE='#' --enable-poppler ac_cv_header_poppler_cpp_poppler_version_h=yes --disable-dbus
所遇到的问题与1.13.4版本一样。
2、make。所遇到的问题与1.13.4一样
3、make install。在源码目录下生成_install目录。
4、将cups-filters安装目录下的lib下的所有拷贝到cups的安装目录中的lib中。
5、将cups-filters依赖的库libpcre拷贝到cups的安装目录中的lib中。
6、将cups-filters依赖的库libqpdf拷贝到cups的安装目录中的lib中。
注:指明了gs的位置,gs一定要放到/dymind/lib/cups/bin中,否则打印时总是报“No pages were found”
配置与1.11.4版本一样。
make
报错
原因是不同版本的poppler的问题,根据源代码,需要0.20版本的poppler。交叉编译poppler-0.20.5。添加相应环境变量。我这儿由于之前交叉编译过0.51.0版本的,所以交叉编译后更改Makefile,将先关替换成0.20.5。另外将交叉编译器的头文件中的0.51.0版本的相关文件去掉,在0.20.5安装目录下的include/poppler下面添加相关文件。又发现poppler0.20.5版本中实际的函数定义与cups-filters1.0.54中宏定义的不一样。如:
cups-filters1.0.54中:
但是poppler0.20.5中却是这样定义的:
很显然cups-filters1.0.54的写法是有问题的。目前的解决方式是将poppler-version中版本号手动改成0.22.5
poppler0.20.5的相关头文件中定义的类确实没有该成员,0.51.0是有的。这块又是版本匹配的问题。目前的问题是cups-filters1.0.54有的地方需要低版本的poppler,但是有的地方又需要高版本的poppler,矛盾。这儿的解决方法是屏蔽相关代码。
也会遇到类似的问题,但也可以采取增加相关代码实现。
make install
./configure --host=arm-linux--prefix=$(pwd)/_install --with-poppler-source=/home/work/poppler-0.20.5 CC=arm-linux-gcc CXX=arm-linux-g++ LD=arm-linux-ld CFLAGS="-I/home/work/poppler-0.20.5/install/include/poppler -I/home/work/ijs-0.35/install/include"CXXFLAG="-I/home/work/poppler-0.20.5/install/include/poppler -I/home/work/ijs-0.35/install/include"CPPFLAGS="-I/home/work/poppler-0.20.5/install/include/poppler -I/home/work/ijs-0.35/install/include"LDFLAGS="-L/home/work/poppler-0.20.5/install/lib -L/home/work/ijs-0.35/install/lib"
make报错
原因是交叉编译的程序在x86平台下自然无法运行,合理的做法是得在x86下make一下,拷贝覆盖该工具,但是PC下make需要很多东西,这儿直接屏蔽掉testcmyk的执行。
打开testcmyk所在路径的Makefile,屏蔽掉:
如上
附录2hplip-3.16.11交叉编译
该工具包是hp所有打印机在linux下的打印驱动包,该工具包持续更新。
1、配置
./configure --host=arm-linux--build=i386-linux --prefix=$(pwd)/_install --exec-prefix=$(pwd)/_install --enable-hpijs-only-build--enable-hpcups-only-build --enable-hpijs-install --enable-hpcups-install --enable-foomatic-ppd-install--enable-cups-ppd-install --with-cupsbackenddir=/dymind/lib/cups/lib/cups/backend--with-cupsfilterdir=/dymind/lib/cups/lib/cups/filter
./configure --host=arm-linux--enable-dependency-tracking --enable-shared --enable-doc-build --enable-hpijs-only-build--enable-hpijs-install
./configure --host=arm-linux--build=i386-linux --prefix=$(pwd)/_install --exec-prefix=$(pwd)/_install --enable-udev-acl-rules --enable-qt4 --disable-libusb01_build--enable-doc-build --disable-cups-ppd-install --disable-foomatic-drv-install--disable-foomatic-ppd-install --disable-hpijs-install--disable-udev_sysfs_rules --disable-policykit --enable-cups-drv-install--enable-hpcups-install --enable-network-build --enable-dbus-build--enable-scan-build --enable-fax-build --disable-network-build
./configure--host=arm-linux --build=i386-linux --prefix=$(pwd)/_install--exec-prefix=$(pwd)/_install --disable-network-build CFLAGS="-I/dymind/lib/cups/include/ -I/home/chanprj/zengxiangwei/Python-2.7.13/build-arm/_install/include"CPPFLAGS="-I/dymind/lib/cups/include/ -I/home/chanprj/zengxiangwei/Python-2.7.13/build-arm/_install/include"PYTHON=/home/chanprj/zengxiangwei/Python-2.7.13/build-pc/_install/bin/python --disable-scan-build--disable-dbus-build --disable-fax-build --enable-hpijs-install
make
报错找不到libusb.h,该头文件在交叉编译器头文件中,打开Makefile,在CFLAGS中加入该头文件位置。-I/opt/arm/4.4.6/arm-embedsky-linux-gnueabi/embedsky/usr/include/libusb-1.0/
makeinstall
Python-2.7.13交叉编译
解压源码。
1、编译PC版本的python
mkdirbuild-pc
cdbuid-pc
../configure--prefix=$(pwd)/_install--exec-prefix=$(pwd)/_install
make
makeinstall
2、交叉编译打补丁
拷贝Python-2.7.13-xcompile.patch到源码目录,进行打补丁:
patch-p1 < Python-2.7.13-xcompile.patch
3、交叉编译Python
mkdirbuild-arm
cdbuild-arm
配置
../configure --host=arm-linux --target=arm-linux --build=i386-linux --prefix=$(pwd)/_install --exec-prefix=$(pwd)/_install --disable-ipv6 ac_cv_file__dev_ptmx=yes ac_cv_file__dev_ptc=no --enable-shared PYTHON_FOR_BUILD=../build-pc/python LDFLAGS="-Wl,--rpath=$(pwd)/_install/lib"
编译
HOSTPYTHON指定我们之前编译的X86版本的python文件;
HOSTPGEN指定我们之前编译的X86版本的pgen文件;
make HOSTPYTHON=../build-pc/pythonHOSTPGEN=../build-pc/Parser/pgen BLDSHARED="arm-linux-gcc -shared"
安装
makeinstall -i HOSTPYTHON=../build-pc/python HOSTPGEN=../build-pc/Parser/pgenBLDSHARED="arm-linux-gcc -shared"
1、编译pc版本的语法解析器
由于在编译python的时候,需要先编译一个叫pgen的程序出来,用于生成语法解析器,所以我们要先生成一个pc版本的pgen:
mkdir build.pc
cd build.pc
../configure
make Parser/pgen
然后再Parser目录下就有pgen了。
2、编译arm版本的python
进入源码根目录
mkdir build.arm
cd build.arm
../configure --host=arm-linux--target=arm-linux --build=i386-linux --prefix=$(pwd)/_install--exec-prefix=$(pwd)/_install --disable-ipv6 ac_cv_file__dev_ptmx=no ac_cv_file__dev_ptc=no--enable-shared
修改Makefile
一行中,去掉-g,即不要debug python ,-O3改为-O2,节省空间。
在 下面添加一行:
PGEN_HOST=../build.pc/Parser/pgen$(EXE)
表明我们在HOST上运行的pgen
将使用PGEN的地方改成使用PGEN_HOST
修改所有使用新生成的python的地方。
所有如./$(BUILDPYTHON) 的地方,都改为python
make
make -i install
Python交叉编译(以Python3.2.2为例)
1、编译pc版本的Python
进入python源码目录,执行:
./configure
编译python和Parser/pgen:
make python Parser/pgen
将X86版本的python可执行文件备份为python_for_build:
mv python python_for_build
将X86版本的pgen可执行文件配备为pgen_for_build:
mv Parser/pgen Parser/pgen_for_build
清理编译好的项目文件,这一步是为了后面的交叉编译做准备:
make distclean
整个步骤最重要的就是保存好python和pgen这两个可执行文件,因为之后在交叉编译Python时需要用到这两个文件。
2、给python源码打上交叉编译补丁
将补丁文件放在python源码根目录,执行
patch-p1 < python-3.2.2-xcompile.patch
3、交叉编译python
配置
./configure --host=arm-linux --target=arm-linux--build=i386-linux --prefix=$(pwd)/_install --exec-prefix=$(pwd)/_install--disable-ipv6 ac_cv_file__dev_ptmx=no ac_cv_file__dev_ptc=no --enable-shared
编译
HOSTPYTHON指定我们之前编译的X86版本的python文件;
HOSTPGEN指定我们之前编译的X86版本的pgen文件;
make HOSTPYTHON=./python_for_buildHOSTPGEN=./Parser/pgen_for_build BLDSHARED="arm-linux-gcc -shared" CROSS_COMPILE=arm-linux-CROSS_COMPILE_TARGET=yes HOSTARCH=arm-linux BUILDARCH=i386-linux
安装
makeinstall -i HOSTPYTHON=./python_for_build HOSTPGEN=./Parser/pgen_for_build BLDSHARED="arm-linux-gcc -shared" CROSS_COMPILE=arm-linux- CROSS_COMPILE_TARGET=yes
附录3 foo2zjs移植
从http://foo2zjs.rkkda.com/foo2zjs.tar.gz下载源码包。
1、解压源码,该源码没有configure,直接更改源码下的Makefile:
①、在合适的位置增加CC=arm-linux-gcc
②、更改安装路径:删除原来的PREFIX,在合适的位置增加PREFIX=/home/chanprj/zengxiangwei/foo2zjs/_install。
③、将FOODB=$(DESTDIR)/usr/share/foomatic/db/source改成指定安装路径
FOODB=$(PREFIX)/share/foomatic/db/source
按照上面一步,更改源码内所有的Makefile。
注意所谓的合适位置。
2、make
3、make install
注安装之后在指定的安装目录下生成bin和share两个目录,bin下是所需的工具或者脚本。
要使用foo2zjs,还需要foo2zjs-wrapper和foo2zjs-pstops两个脚本。
将foo2zjs、foo2zjs-wrapper、foo2zjs-pstops拷贝到文件系统的/bin下,实际运行时会报错说/dev/null没有权限,解决此问题:创建/dymind/lib/cups/tmp/dev/null,并更改权限为777,然后将foo2zjs-wrapper中的/dev/null改为/dymind/lib/cups/tmp/dev/null.
[曾祥伟1]这一块的故障会在使用freetype-1.3.1且没有交叉编译时出现
[曾祥伟2]网上介绍的freetype1.3.1的交叉编译方式,但是此种方式虽然能编译过,但是不会生成bin目录因此没有freetype-config程序,在fontconfig2.2.2中无法使用。
[曾祥伟3]freetype2.7版本时的交叉编译方法。但是freetype2.7配合fontconfig2.2.2使用时,fontconfig2.2.2虽然能够配置过但是make时报错,见上面描述
[曾祥伟4]由于freetype1.3.1卡在需要移植X11,所以最终决定使用fontconfig2.12.1版本(注:该版本是当时能下到的最新版本),此步在使用最新版本前已经交叉编译过,所以不确定fontconfig2.12.1是否还需要交叉编译expat库,这儿没有进行反向验证
[曾祥伟5]解压后目录下有一些中间文件会使用上,make distclean彻底删除了这些有用的中间文件,用make clean。过程中不要make distclean
[曾祥伟6]由于使用fontconfig2.12.1后使用./configure--host=arm-linux --prefix=$(pwd)/install
能直接配置过,所以其他的参数不用了,后面直接make和make install就行了。