发新话题
打印

优化pkgsrc之三:设置CFLAGS参数,加速最终程序运行速度

优化pkgsrc之三:设置CFLAGS参数,加速最终程序运行速度

/usr/pkgsrc/mk/defaults/mk.conf 文件里没有提到CFLAGS之类的参数。但是在/usr/pkgsrc/mk/bsd.pkg.mk文件里有导入CFLAGS之类的参数。 /usr/share/mk/bsd.README文件也含相关说明
可用变量如下。如果想启用它们的话就在/etc/mk.conf增加如下内容
复制内容到剪贴板
代码:
#以下变量你也可不用“+=”,而直接用“=”。但是有可能会导致某些软件编译或运行出错。以下参数无需全改,只改部分即可。建议只改动前三项
CFLAGS+=
CXXFLAGS+=
LDFLAGS+= #这个是连接器ld的参数
CPUFLAGS+=
COPTS+= #此参数用于编译内核和用户层软件等netbsd基本系统。不影响pkgsrc
CC+=
CXX+=

CPUTYPE+= #此参数待查
有部分软件出于保证稳定或者其它的原因,会在Makefile文件里定义自己的CFLAGS,而忽略用户个人设置的参数。所以在编译时不会使用mk.conf里指定的标志
当有多个“-Ox”同时使用的时候。例如,如果软件本身的Makefile和/etc/mk.conf都定义了“-Ox”时,在编译软件时就可以看到。此时只有最后一个是有效的

http://gentoo-wiki.com 里有很多页面含优化参数的相关说明介绍。但是bsd不比linux,所以有些过多的优化可能导致程序编译失败。即使编译通过也不代表可以正常运行。所以参数的设置要在保证稳定的前提下进行优化

安全的CFLAGS参数可参考 http://gentoo-wiki.com/Safe_Cflags
或者参看gcc的文档(注意gcc的对应版本。不同版本的参数会有调整)里介绍的优化参数 http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
以及对应cpu架构的可用参数,例如x86的 http://gcc.gnu.org/onlinedocs/gc ... 002d64-Options.html

netbsd的连接器ld是gnu的ld,所以可以用gnu ld参数
安全的LDFLAGS可参考 http://gentoo-wiki.com/TIP_Safe_LDFLAGS

======================================================================================

官方推荐的方法是使用cpuflags
cd /usr/pkgsrc/devel/cpuflags
make install clean clean-depends
nano -w /etc/mk.conf #然后编辑/etc/mk.conf,增加
复制内容到剪贴板
代码:
.sinclude "/usr/pkg/share/mk/cpuflags.mk"
如果想启用实验性质的优化参数,就使用如下两行。但是有可能损坏代码。原因还是同上,过度的优化可能导致最终编译好的程序运行出错
复制内容到剪贴板
代码:
.sinclude "/usr/pkg/share/mk/cpuflags.mk"
.sinclude "/usr/pkg/share/mk/optimize_gcc.mk"
如果想加快机器编译的速度的话,再增加如下两行。它会让程序间的通讯使用管道而不是临时文件,以加快编译速度。这个不会影响最终编译好的程序
复制内容到剪贴板
代码:
COPTS?=-pipe ${DEFCOPTS}
CFLAGS+=-pipe
具体请参见“man cpuflags”

======================================================================================

如果设置优化的话。最好在/etc/mk.conf加上
复制内容到剪贴板
代码:
PKGSRC_RUN_TEST?=yes
# Run test target before install
# Possible: yes, no
# Default: no
这样会在程序编译完成后对它进行测试工作,如果出现错误的话程序本身就会提示并停止。但是需要程序本身提供测试功能,如果没有的话就不会进行测试。此项就相当于自行编译软件时的“make check”命令。用过LFS的人应该对它比较熟悉。虽然此参数会延长编译时间,但是也可避免程序不稳定

有一点需要注意的是,有时候测试失败不是因为优化参数的问题。而是因为环境变量之类的其它原因。所以不能一概而论。还是要注意看具体的出错信息是什么,以加以判断和解决

======================================================================================

如果你使用ccache作为编译器的话,ccache缓存的编译好的代码含有第一次编译此代码时所用的CFLAGS之类的参数。所以当你再次编译此软件(代码)时,即便更改了CFLAGS之类的参数。系统仍会直接使用ccache缓存的,也就是第一次编译此软件(代码)时所使用的参数
简单的说就是,如果使用了ccache的话,再次编译同一软件(代码)时,/etc/mk.conf文件里CFLAGS之类的参数变更就不会对它产生任何改变了




官方推荐的方法
cd /usr/pkgsrc/devel/cpuflags
make install
nano -w /etc/mk.conf #然后编辑/etc/mk.conf,增加
复制内容到剪贴板
代码:
  .sinclude "/usr/pkg/share/mk/cpuflags.mk"
.sinclude "/usr/pkg/share/mk/optimize_gcc.mk"
COPTS?= -pipe ${DEFCOPTS}
CFLAGS+=-pipe
参见man cpuflags





我用
复制内容到剪贴板
代码:
COPTS+=-s -O3 -pipe -fomit-frame-pointer -march=pentium3 -mtune=pentium3 -mmmx -msse -mfpmath=sse
CFLAGS+=-s -O3 -pipe -fomit-frame-pointer -march=pentium3 -mtune=pentium3 -mmmx -msse -mfpmath=sse
CXXFLAGS+=-s -O3 -pipe -fomit-frame-pointer -march=pentium3 -mtune=pentium3 -mmmx -msse -mfpmath=sse -fno-enforce-eh-specs -fvisibility-inlines-hidden
LDFLAGS+=-Wl,-O1 -Wl,--as-needed
编译pkgsrc里的软件。结果X可以启动,xinit一启动就自动退回终端。编译到gnome2-control-center-2.16.0nb1时报错。可能真的是有点极端了
感觉bsd对CFLAGS的敏感程度高于linux
引用:
/bin/sh ../../libtool --tag=CC --mode=link cc -O2 -s -O3 -pipe -fomit-frame-pointer -march=pentium3 -mtune=pentium3 -mmmx -msse -mfpmath=sse -I/usr/pkg/include -I/usr/pkg/include/nss -I/usr/pkg/include/nspr -I/usr/include -I/usr/pkg/include/freetype2 -Wall -Wl,-O1 -Wl,--as-needed -L/usr/pkg/xorg/lib -Wl,-R/usr/pkg/xorg/lib -L/usr/pkg/lib -Wl,-R/usr/pkg/lib -L/usr/pkg/lib/nss -Wl,-R/usr/pkg/lib/nss -L/usr/pkg/lib/nspr -Wl,-R/usr/pkg/lib/nspr -L/usr/lib -Wl,-R/usr/lib -o gnome-about-me -export-dynamic eel-alert-dialog.o gnome-about-me-password.o e-image-chooser.o gnome-about-me.o ../../capplets/common/libcommon.la -Wl,-R/usr/pkg/lib -Wl,--rpath -Wl,/usr/pkg/lib -Wl,-O1 -Wl,--as-needed -Wl,-R/usr/pkg/xorg/lib -pthread -L/usr/pkg/lib -L/usr/pkg/xorg/lib -lglade-2.0 -lgnome-desktop-2 -lgnomeui-2 -lSM -lICE -lstartup-notification-1 -lbonoboui-2 -lgnome-keyring -lxml2 -lgnomecanvas-2 -lgnome-2 -lpopt -lart_lgpl_2 -lgtk-x11-2.0 -lgdk-x11-2.0 -lXi -latk-1.0 -lgdk_pixbuf-2.0 -lpangocairo-1.0 -lXrandr -lXext -lXcursor -lXfixes -lcairo -lpangoft2-1.0 -lfontconfig -lfreetype -lz -lpango-1.0 -lXrender -lX11 -lbonobo-2 -lgnomevfs-2 -lbonobo-activation -lgconf-2 -lgobject-2.0 -lORBit-2 -lm -lgmodule-2.0 -lgthread-2.0 -lglib-2.0 -lintl -lSM -lICE -L/usr/pkg/xorg/lib -lX11 -Wl,-R/usr/pkg/lib -L/usr/pkg/lib -L/usr/pkg/xorg/lib -lXcursor -lXrender -lX11 -Wl,-R/usr/pkg/lib -L/usr/pkg/lib -ldbus-glib-1 -ldbus-1 -lglib-2.0 -lintl -Wl,-R/usr/pkg/lib -pthread -L/usr/pkg/lib -lebook-1.2 -lgnome-2 -lpopt -ledataserver-1.2 -lgnomevfs-2 -lgobject-2.0 -lxml2 -lz -lgconf-2 -lbonobo-2 -lbonobo-activation -lORBit-2 -lm -lgmodule-2.0 -lgthread-2.0 -lglib-2.0 -lintl -lutil
mkdir .libs
cc -O2 -s -O3 -pipe -fomit-frame-pointer -march=pentium3 -mtune=pentium3 -mmmx -msse -mfpmath=sse -I/usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/include -I/usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/include/nss -I/usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/include/nspr -I/usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/include/freetype2 -Wall -Wl,-O1 -Wl,--as-needed -Wl,-R/usr/pkg/xorg/lib -Wl,-R/usr/pkg/lib -Wl,-R/usr/pkg/lib/nss -Wl,-R/usr/pkg/lib/nspr -o .libs/gnome-about-me eel-alert-dialog.o gnome-about-me-password.o e-image-chooser.o gnome-about-me.o -Wl,--rpath -Wl,/usr/pkg/lib -Wl,-O1 -Wl,--as-needed -pthread -pthread -Wl,--export-dynamic -L/usr/pkgsrc/x11/gnome2-control-center/work/control-center-2.16.0/libwindow-settings/.libs -L/usr/pkgsrc/x11/gnome2-control-center/work/.x11-buildlink/lib -L/usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib -L/usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/nss -L/usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/nspr ../../capplets/common/.libs/libcommon.a /usr/pkgsrc/x11/gnome2-control-center/work/control-center-2.16.0/libwindow-settings/.libs/libgnome-window-settings.so /usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/libgnome-menu.so /usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/libmetacity-private.so -lXinerama /usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/libglade-2.0.so /usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/libgnome-desktop-2.so /usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/libgnomeui-2.so /usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/libjpeg.so /usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/libstartup-notification-1.so /usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/libbonoboui-2.so /usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/libgnome-keyring.so /usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/libgnomecanvas-2.so /usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/libart_lgpl_2.so /usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/libgtk-x11-2.0.so /usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/libgdk-x11-2.0.so -lXi /usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/libatk-1.0.so /usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/libgdk_pixbuf-2.0.so /usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/libpangocairo-1.0.so /usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/libXrandr.so -lXext /usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/libcairo.so /usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/libglitz.so /usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/libpng12.so /usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/libpangoft2-1.0.so /usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/libfontconfig.so /usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/libexpat.so /usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/libfreetype.so /usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/libpango-1.0.so -lSM -lICE /usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/libXcursor.so -lXfixes /usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/libXrender.so -lX11 /usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/libebook-1.2.so /usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/libcamel-1.2.so -lssl3 -lsmime3 -lnss3 -lsoftokn3 /usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/libgnome-2.so /usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/libesd.so -lossaudio /usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/libaudiofile.so /usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/libpopt.so /usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/libedataserver-1.2.so -lplc4 -lplds4 -lnspr4 /usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/libgnomevfs-2.so /usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/libdbus-glib-1.so /usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/libdbus-1.so /usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/libgnutls.so /usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/libtasn1.so /usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/libgcrypt.so /usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/libgpg-error.so -lrt /usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/libxml2.so -lz /usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/libgconf-2.so /usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/libbonobo-2.so /usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/libbonobo-activation.so /usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/libORBitCosNaming-2.so /usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/libORBit-2.so /usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/libgobject-2.0.so -lm /usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/libgmodule-2.0.so /usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/libgthread-2.0.so /usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib/libglib-2.0.so -lintl -lutil -Wl,--rpath -Wl,/usr/pkg/lib -Wl,--rpath -Wl,/usr/pkgsrc/x11/gnome2-control-center/work/.buildlink/lib
/usr/pkg/lib/nss/libsoftokn3.so: warning: warning: mktemp() possibly used unsafely, use mkstemp() or mkdtemp()
creating gnome-about-me
LC_ALL=C ../../intltool-merge -d -u -c ../../po/.intltool-merge-cache ../../po gnome-about-me.desktop.in gnome-about-me.desktop
Found cached translation database
Merging translations into gnome-about-me.desktop.
gmake[3]: Leaving directory `/usr/pkgsrc/x11/gnome2-control-center/work/control-center-2.16.0/capplets/about-me'
gmake[3]: Entering directory `/usr/pkgsrc/x11/gnome2-control-center/work/control-center-2.16.0/capplets'
gmake[3]: Nothing to be done for `all-am'.
gmake[3]: Leaving directory `/usr/pkgsrc/x11/gnome2-control-center/work/control-center-2.16.0/capplets'
gmake[2]: Leaving directory `/usr/pkgsrc/x11/gnome2-control-center/work/control-center-2.16.0/capplets'
Making all in control-center
gmake[2]: Entering directory `/usr/pkgsrc/x11/gnome2-control-center/work/control-center-2.16.0/control-center'
/usr/pkg/bin/gdk-pixbuf-csource --raw --build-list gnomecc_rounded_rect_frame ./text-selection-frame.png > gnomecc-rounded-rect-pixbuf.h
failed to load "./text-selection-frame.png": Couldn't recognize the image file format for file './text-selection-frame.png'
gmake[2]: *** [gnomecc-rounded-rect-pixbuf.h] ?? 1
gmake[2]: Leaving directory `/usr/pkgsrc/x11/gnome2-control-center/work/control-center-2.16.0/control-center'
gmake[1]: *** [all-recursive] ?? 1
gmake[1]: Leaving directory `/usr/pkgsrc/x11/gnome2-control-center/work/control-center-2.16.0'
gmake: *** [all] ?? 2
*** Error code 2

Stop.
make: stopped in /usr/pkgsrc/x11/gnome2-control-center
*** Error code 1

Stop.
make: stopped in /usr/pkgsrc/x11/gnome2-control-center
如果设置优化的话。最好在/etc/mk.conf加上
复制内容到剪贴板
代码:
PKGSRC_RUN_TEST?=yes
# Run test target before install
# Possible: yes, no
# Default: no
这样会在程序编译完成后对它进行测试工作,如果出现错误的话程序本身就会提示并停止。但是需要程序本身提供测试功能,如果没有的话就不会进行测试。此项就相当于自行编译软件时的“make check”命令。用过LFS的人应该对它比较熟悉。虽然此参数会延长编译时间,但是也可避免程序不稳定

今天用 CFLAGS+=-s -O2 -pipe -fomit-frame-pointer -march=pentium3 -mmmx -msse 编译bash。编译没问题,如果不运行测试“PKGSRC_RUN_TEST?=yes”的话bash虽然也可正常工作。但是使用此项后就会出错。去掉 mk.conf里的CFLAGS参数后,测试通过

TOP

发新话题