1 AUTHOR: Robert Connolly <robert at linuxfromscratch dot org> (ashes)
2 Daniel Baumann <daniel.baumann at panthera-systems.net>
6 LICENSE: GNU General Public License
8 SYNOPSIS: Installing and using the Intel C/C++ compiler with LFS.
11 http://www.linuxfromscratch.org/hints/downloads/files/intel-c-compiler.txt
14 The Intel C/C++ compiler collection (ICC) is a full featured compiler and
15 debugger suite, which is close to compatible with the GNU C/C++ compiler
16 collection (GCC). ICC is made only for Intel chips and takes advantage of
17 Intel technology, such as Hyper-Threading, more than GCC does. Software
18 compiled with ICC usually performs better than if it were compiled with GCC.
19 The performance difference can range between 2% and 40% depending on the
20 software and compiler flags. Most of the LFS base system will compile with ICC.
22 The Intel compiler is not opensource. A non-commercial Linux user license is
23 available for application developers. This license does not expire but only
24 entitles you to upgrades for one year (you may be able to renew the license).
26 A commercial license allows you to distribute packages you built with ICC,
27 and costs up to $400. Discounts are available for students.
29 If you are using ICC for personal use, to help develop ICC, the non-commercial
30 application developer license is right for you.
32 There is a PDF document describing ICC-9.0 here:
33 http://cache-www.intel.com/cd/00/00/22/23/222301_222301.pdf
36 - An Intel CPU (Intel-clones may not work).
38 - The Intel website says a PentiumII with 256MB of RAM is required to use
41 - Glibc (icc is linked to /lib/ld-linux.so.2).
43 - 4GB of free space, above the LFS requirement, to be able to build DB, Bash,
44 and Perl with code profiling (they will be normal size when installed).
46 - This hint is for i86, but could be adapted for other Intel platforms.
49 The homepage for the Intel compiler (application developer license) is here:
50 http://www.intel.com/cd/software/products/asmo-na/eng/compilers/clin/219856.htm
52 The ICC-9.1 compiler is compatible with gcc-4.1 and supports the newest Intel
55 To obtain the Intel compiler, and user license, go to the homepage and
56 register. You should receive an email with a URL for the ICC tarball, and a
57 user license attachment.
59 After that you should have two files (the versions may be different):
61 l_cc_c_9.1.042.tar.gz (279MB)
63 NCOM_L_CMP_CPP_NZDM-FT472MJ3.lic
71 Configuring system files
73 - Building LFS packages
75 # ***************************************
76 # - INSTALLING ICC - Installing ICC files
77 # ***************************************
79 # The rpm packages for ICC are designed to install ICC to /opt. This is
80 # convienient because ICC headers can overwrite libc headers, but is
81 # inconvienient because software built with ICC will be linked to /opt. I don't
82 # like /opt because I think it's redundent. So this hint installs ICC to /usr,
83 # and configures ICC to use private header directories so that ICC will not
84 # overwrite headers from other packages. Installing ICC to /usr is also
85 # compatible with any use, whether you want to use ICC for specific software,
86 # or use ICC to build most of LFS.
88 # ICC does not currently build Glibc, so ICC must be installed after Glibc,
89 # Binutils, and GCC, are installed in the chapter 6 chroot.
91 # As a general rule, always apply GCC4 patches for packages if available.
93 # We need Cpio to unpack the ICC rpm packages. Cpio can be compiled in the
94 # chapter 6 chroot after Binutils. Follow the BLFS instructions:
95 # http://www.linuxfromscratch.org/blfs/view/svn/general/cpio.html
96 # You can rebuild Cpio with ICC later if you want.
98 # We also need the rpm2cpio script:
99 # http://www.rpm.org/tools/scripts/rpm2cpio.sh
101 # Install rpm2cpio to /usr:
103 install -v rpm2cpio.sh /usr/bin/rpm2cpio
105 # Set your ICC package version in the shell environment (you may need to
106 # modify the values for your version). This is done so that the rest of the
107 # commands in this hint can be copied and pasted:
111 export ICC_V_PATCH=042
112 export ICC_VERSION="${ICC_V_MAJOR}.${ICC_V_MINOR}.${ICC_V_PATCH}"
114 # Unpack the Intel CC tarball and change to the data/ directory:
116 tar zxvf l_cc_c_${ICC_VERSION}.tar.gz &&
117 cd l_cc_c_${ICC_VERSION}/data/
119 # Extract the rpm file for the C/C++ compiler:
121 rpm2cpio intel-icc?????-${ICC_VERSION}*.i386.rpm | \
122 cpio --make-directories --extract --verbose &&
123 rm -vf opt/intel/cc/${ICC_VERSION}/bin/uninstall.sh &&
126 # Copy the files to /usr:
128 install -vd /usr/share/doc/icc-${ICC_VERSION} &&
129 mv -v opt/intel/cc/${ICC_VERSION}/doc /usr/share/doc/icc-${ICC_VERSION} &&
130 mv -v opt/intel/cc/${ICC_VERSION}/licenses /usr/share/doc/icc-${ICC_VERSION} &&
131 mv -v opt/intel/cc/${ICC_VERSION}/man/man1/* /usr/share/man/man1 &&
132 install -vd /usr/include/icc/ &&
133 mv -v opt/intel/cc/${ICC_VERSION}/include/* /usr/include/icc
135 # The iccvars.*sh files are shell startup/profile files, and belong in /etc:
137 mv -v opt/intel/cc/${ICC_VERSION}/bin/iccvars.*sh /etc &&
138 mv -v opt/intel/cc/${ICC_VERSION}/bin/* /usr/bin
140 # Runtime libraries should be installed to /lib:
142 mv -v opt/intel/cc/${ICC_VERSION}/lib/libirc.so /lib &&
143 mv -v opt/intel/cc/${ICC_VERSION}/lib/libsvml.so /lib &&
144 mv -v opt/intel/cc/${ICC_VERSION}/lib/libimf.so /lib
146 # The rest of the libraries can go in /usr/lib:
148 mv -v opt/intel/cc/${ICC_VERSION}/lib/locale /usr/lib/locale &&
149 mv -v opt/intel/cc/${ICC_VERSION}/lib/* /usr/lib &&
152 # Extract the rpm and tar files for the ICC headers:
154 rpm2cpio intel-isubh*-${ICC_VERSION}*.i386.rpm \
155 | cpio --make-directories --extract --verbose &&
156 tar -zvxf opt/intel/cc/${ICC_VERSION}/substitute_headers/libio.tar.gz -C \
157 opt/intel/cc/${ICC_VERSION}/substitute_headers/ &&
158 chown -vR 0:0 opt/ &&
159 find opt/intel/cc/${ICC_VERSION}/substitute_headers/libio -type d \
160 -exec chmod -v 755 {} \; &&
161 find opt/intel/cc/${ICC_VERSION}/substitute_headers/libio -type f \
162 -exec chmod -v 644 {} \;
164 # Install the ICC headers:
166 mv -v opt/intel/cc/${ICC_VERSION}/substitute_headers/libio/* \
170 # Extract the rpm for the debugger:
172 rpm2cpio intel-iidb*-${ICC_VERSION}*.i386.rpm | \
173 cpio --make-directories --extract --verbose &&
174 rm -vf opt/intel/idb/${ICC_VERSION}/bin/uninstall.sh
177 # Install the ICC debugger, idbvars.sh belongs in /etc:
179 mv -v opt/intel/idb/${ICC_VERSION}/bin/idbvars.*sh /etc &&
180 mv -v opt/intel/idb/${ICC_VERSION}/bin/* /usr/bin &&
181 mv -v opt/intel/idb/${ICC_VERSION}/doc /usr/share/doc/idb-${ICC_VERSION} &&
182 mv -v opt/intel/idb/${ICC_VERSION}/man/man1/* /usr/share/man/man1 &&
185 # ****************************************
186 # - INSTALLING ICC - Configuring ICC files
187 # ****************************************
189 # The compiler suite is installed. Now we set it up. First install the
192 install -v -m444 *.lic /usr/share/doc/icc-${ICC_VERSION}/licenses/
194 # Configure the compiler:
197 "s/<installpackageid>/l_cc_c_${ICC_V_MAJOR}\.${ICC_V_MINOR}\.${ICC_V_PATCH}/" \
198 -i /usr/share/doc/icc-${ICC_VERSION}/doc/csupport
201 "s/<INSTALLDIR>\/licenses/\/usr\/share\/doc\/icc-${ICC_VERSION}\/licenses/g" \
202 -e 's/<INSTALLDIR>\/bin/\/usr\/bin/g' \
203 -e 's/<INSTALLDIR>\/lib/\/usr\/lib/g' -i /usr/bin/icc
206 "s/<INSTALLDIR>\/licenses/\/usr\/share\/doc\/icc-${ICC_VERSION}\/licenses/g" \
207 -e 's/<INSTALLDIR>\/bin/\/usr\/bin/g' \
208 -e 's/<INSTALLDIR>\/lib/\/usr\/lib/g' -i /usr/bin/icpc
211 "s/<INSTALLDIR>\/licenses/\/usr\/share\/doc\/icc-${ICC_VERSION}\/licenses/g" \
212 -e 's/<INSTALLDIR>\/bin/\/usr\/bin/g' \
213 -e 's/<INSTALLDIR>\/lib/\/usr\/lib/g' \
214 -e 's/<INSTALLDIR>\/man/\/usr\/share\/man/g' -i /etc/iccvars.csh
217 "s/<INSTALLDIR>\/licenses/\/usr\/share\/doc\/icc-${ICC_VERSION}\/licenses/g" \
218 -e 's/<INSTALLDIR>\/bin/\/usr\/bin/g' \
219 -e 's/<INSTALLDIR>\/lib/\/usr\/lib/g' \
220 -e 's/<INSTALLDIR>\/man/\/usr\/share\/man/g' -i /etc/iccvars.sh
222 source /etc/iccvars.sh
224 # If you get "bash: manpath: command not found", don't worry about it.
226 # Configure the Intel debugger:
229 "s/<installpackageid>/l_cc_c_${ICC_V_MAJOR}\.${ICC_V_MINOR}\.${ICC_V_PATCH}/" \
230 -i /usr/share/doc/idb-${ICC_VERSION}/idbsupport
233 "s/<INSTALLDIR>\/licenses/\/usr\/share\/doc\/icc-${ICC_VERSION}\/licenses/g" \
234 -e 's/<INSTALLDIR>\/bin/\/usr\/bin/g' \
235 -e 's/<INSTALLDIR>\/man/\/usr\/share\/man/g' -i /etc/idbvars.csh
238 "s/<INSTALLDIR>\/licenses/\/usr\/share\/doc\/icc-${ICC_VERSION}\/licenses/g" \
239 -e 's/<INSTALLDIR>\/bin/\/usr\/bin/g' \
240 -e 's/<INSTALLDIR>\/man/\/usr\/share\/man/g' -i /etc/idbvars.sh
242 source /etc/idbvars.sh
244 # - INSTALLING ICC - Configuring system files:
246 # ICC links programs to libgcc_s.so. On an LFS system libgcc_s.so is in
247 # /usr/lib. On some systems libgcc_s.so is in /lib. If you plan to install
248 # software built with ICC to /bin or /sbin, you should move libgcc_s.so to
249 # /lib if it is not already there (this is recommended):
251 mv -v /usr/lib/libgcc_s.so.1 /lib/ &&
252 rm -v /usr/lib/libgcc_s.so &&
253 ln -vs libgcc_s.so.1 /lib/libgcc_s.so
255 # We also need to tell ICC where to find the headers we installed to
258 echo "-I/usr/include/icc" >> /usr/bin/icc.cfg
259 echo "-I/usr/include/icc" >> /usr/bin/icpc.cfg
260 echo "-I/usr/include/icc/c++" >> /usr/bin/icpc.cfg
262 # Now we can use the Intel compiler.
264 # Test ICC to see that it is working:
266 echo "int main () {return 0;}" > /tmp/main.c &&
267 icc -o /tmp/main /tmp/main.c &&
271 # If there are no errors then it worked.
273 # You can unset these now:
275 unset ICC_VERSION ICC_V_MAJOR ICC_V_MINOR ICC_V_PATCH
277 # Now we can configure the system to use ICC.
279 # Configure a GNU autoconf site file for ICC. This makes this hint shorter,
280 # and our lives easier. GNU ./configure scripts will search for
281 # "${prefix}/share/config.site" and use it to source environment variables.
282 # Alternately you can put, and name, the "config.site" anywhere and set
283 # the CONFIG_SITE environment variable to point to it:
285 cat > /usr/share/config.site-icc << "EOF"
295 # If you want to build most of your LFS system with ICC you should export
296 # this site configuration:
298 export CONFIG_SITE="/usr/share/config.site-icc"
300 # If you only want to use ICC for specific packages then you can use this:
302 env CONFIG_SITE="/usr/share/config.site-icc" ./configure...
308 # Now you can read the ICC man pages for more information about its features
311 # You should also look at:
312 # http://gentoo-wiki.com/HOWTO_ICC_and_Portage#CFLAGS
315 # http://sc.tamu.edu/help/intel/9.0/main_cls/mergedProjects/optaps_cls/whnjs.htm
317 # I scribbled some notes while reading the ICC man page, and posted them here:
318 # http://www.linuxfromscratch.org/~robert/new/icc-cflag-notes.txt
320 # We can add our optimizations to the ICC config file. This is what I use for
323 # The -xP optimization is just like GCC's -march=prescott:
325 echo "-xP" >> /usr/bin/icc.cfg
326 echo "-xP" >> /usr/bin/icpc.cfg
328 # Note that -axP is just like '-march=i586 -mtune=prescott'.
330 # The -fomit-frame-pointer optimization removes frame pointers from object
331 # code, and makes it perform better. Note that this option makes programs
334 echo "-fomit-frame-pointer" >> /usr/bin/icc.cfg
335 echo "-fomit-frame-pointer" >> /usr/bin/icpc.cfg
337 # The -mno-ieee-fp optimization disables floating-point precision. This breaks
338 # ANSI conformance but increases performance. This can break some software,
339 # if it does then add -mp to CFLAGS. Note that this option makes programs
342 echo "-mno-ieee-fp" >> /usr/bin/icc.cfg
343 echo "-mno-ieee-fp" >> /usr/bin/icpc.cfg
345 # The -no-prec-div optimization disables floating-point division computations.
346 # Note that the man page entry for this option is not completely correct,
347 # check google for this option. Note that this option makes programs harder
350 echo "-no-prec-div" >> /usr/bin/icc.cfg
351 echo "-no-prec-div" >> /usr/bin/icpc.cfg
353 # The -rcd enabled fast float-to-int conversions. This option breaks ANSI
356 echo "-rcd" >> /usr/bin/icc.cfg
357 echo "-rcd" >> /usr/bin/icpc.cfg
359 # This option tells ICC which GCC version to be compatable with:
361 echo "-gcc-version=410" >> /usr/bin/icc.cfg
362 echo "-gcc-version=410" >> /usr/bin/icpc.cfg
364 # Use -no-gcc to break GCC compatability. This will perform better, and some
365 # packages will need this. Libraries compiled with ICC should get -gcc
366 # added to CFLAGS, so that programs compiled with GCC can use the libraries
367 # compiled with ICC. I will provide commands to add -gcc to LFS packages,
368 # but you need to keep this in mind with BLFS packages:
370 echo "-no-gcc" >> /usr/bin/icc.cfg
371 echo "-no-gcc" >> /usr/bin/icpc.cfg
373 # Software-based Speculative Pre-computation (-ssp) performs thread based
374 # prefetching and takes advantage of hyper-threading. This option increases
375 # performance signicicantly. See google for more information. This option
376 # should not go together with -prof_gen, but -prof_use is okay. It might
377 # depend on profrun. This is 5 stage profiling:
381 -prof-gen-sampling -prof-use
382 profrun -dcache ./a.out
385 # The newer Pentium4 cpus perform Hardware-based Speculative Pre-computation,
386 # so I have never tried to use the -ssp option.
388 # The -ansi-alias optimization will add additional optimizations but must
389 # only be used if the package adheres to the ISO C Standard. The -strict-ansi
390 # option should be used with -ansi-alias, to make sure the source comforms
393 # Interprocedural optimizations (-ipo) is a fantastic feature which optimizes
394 # code at link time, including expanding inline functions across multiple
395 # files. This is equivilent to combining all the source code into a single
396 # file. This allows the compiler to make better judgements. This option can
397 # be very particular and error prone (at compile time).
399 # The -ipo option can take an integer argument to specify the limit of output
400 # files it can generate. By default the limit is 1. -ipo0 will allow the
401 # compiler to decide how many object files to create depending on their size.
403 # The -Ob2 optimization adds -ip, a subset of -ipo but for single file
404 # compilation, and inlines functions at the compiler's descretion. This
405 # option can be used with all code.
407 # -Ob2, -ip, and -ipo can not be used during profile generation (see below)
408 # and will cause a compiler warning if we try. If you decide not to profile
409 # your packages then you can add -ipo0 or -Ob2 to the icc.cfg and icpc.cfg
410 # files. Using -ipo0 on the command line will supersede -ip and -Ob2 in
411 # icc.cfg. If you do not plan to use profiling then you can add -ipo0 to the
412 # icc.cfg and icpc.cfg files.
414 # The -fast option enables "-O3 -ipo -static -no-prec-div -xP". Make sure
415 # your cpu works with the -xP (pentium4 sse3) optimization before using -fast.
416 # Because this optimization statically links programs I do not suggest building
417 # most packages with it. Statically linked programs do not share virtual
418 # memory, and will eventually consume all memory when most of the system is
419 # statically linked. I do suggest using -fast with programs which are freed
420 # from memory quickly and are not run often, like Bzip2.
422 # The -ipo option does not work with private static libraries, which most
423 # packages have. So -ipo has to be surgically added.
425 # In ICC the -g option will disable the default -O2 optimization, unless
426 # -O1/-O2/-O3 are used on the command line. Setting CFLAGS in the environment
427 # will remove the -g option from most packages.
429 # Packages configured with Libtool add the --with-pic configure switch. This
430 # switch will build both shared and static libraries with -fPIC. We can take
431 # advantage of this by adding -gcc beside -fPIC so that -gcc will only be
432 # added to libraries, and not the programs. There is a disadvantage too.
433 # Static libraries compiled with -fPIC will perform slightly slower, however
434 # in LFS we link almost everything dynamically, so this should not become an
435 # issue. In this hint I will provide instructions to add -gcc beside -fPIC
436 # to make shared libraries GCC compatable, but not the static libraries. If
437 # the static libraries cause issues for you, you should rebuild the package
438 # with --with-pic. This way if you compile programs statically with ICC they
439 # will perform as well as possible.
441 # Profile-guided optimizations works by first compiling a program, or library,
442 # with profile generation (-prof_gen). When that program is executed it will
443 # generate data files with details about how the program works at runtime,
444 # such as which functions are called the most and how they relate to other
445 # functions. Then the program is recompiled to use the profiling data with
446 # -prof_use. This means compiling the package twice, but also means the
447 # installed package will perform as well as possible. You do not have to do
448 # this, but I do. If you choose not to profile your packages you can skip
449 # much of the rest of this hint and simply use the config.site file as-is.
451 # Rather than resetting our CFLAGS twice for every profiled package, it's
452 # easier to use a script. Some packages use 'libtool' to build packages,
453 # and using 'make CC="icc -prof_gen"' for these packages will not work. When
454 # profiling packages I suggest reconfiguring them. Also, some packages do not
455 # use CFLAGS/CXXFLAGS for all components because the package developer may
456 # not want particular parts of the programs optimized. So it is best to modify
457 # the CC/CXX environment variables, instead of CFLAGS/CXXFLAGS, when using
458 # -prof_gen and -prof_use.
460 # The following commands will add the profiling options to a few scripts,
461 # including additional optimizations when profile data is being used:
463 cat > /usr/bin/prof_gen-env << "EOF"
471 export CXXFLAGS="-O2"
472 export CC="icc -prof_gen -prof_dir=$(pwd)"
473 export CXX="icpc -prof_gen -prof_dir=$(pwd)"
476 chmod -v +x /usr/bin/prof_gen-env
478 cat > /usr/bin/prof_use-env << "EOF"
485 export CFLAGS="-O2 -ipo0"
486 export CXXFLAGS="-O2 -ipo0"
487 export CC="icc -prof_use -prof_dir=$(pwd)"
488 export CXX="icpc -prof_use -prof_dir=$(pwd)"
491 chmod -v +x /usr/bin/prof_use-env
493 cat > /usr/bin/prof_use-fast-env << "EOF"
500 export CFLAGS="-O3 -fast -ipo0"
501 export CXXFLAGS="-O3 -fast -ipo0"
502 export CC="icc -prof_use -prof_dir=$(pwd)"
503 export CXX="icpc -prof_use -prof_dir=$(pwd)"
506 chmod -v +x /usr/bin/prof_use-fast-env
508 # For some reason most GNU ./configure scripts do not pass environment set
509 # AR to Makefile. We need to use Intel's AR, not GNU's. So we need to create
510 # a 'make' wrapper script which will always override the AR variable. I added
511 # LD for good measure:
513 cat > /usr/bin/icc-make << "EOF"
514 nice make AR="xiar" LD="xild" "$@"
516 chmod -v +x /usr/bin/icc-make
518 # Use 'icc-make' instead of 'make' whenever you are compiling with ICC.
520 # ***********************
521 # - Building LFS packages
522 # ***********************
524 # To build packages without profiling then './configure && icc-make'. The
525 # /usr/share/config.site-icc file will be used. You may want to add
526 # "-O2 -ipo0" to CFLAGS and CXXFLAGS in /usr/share/config.site-icc:
528 echo 'CFLAGS="-ipo0 -O2"' >> /usr/share/config.site-icc
529 echo 'CXXFLAGS="-ipo0 -O2"' >> /usr/share/config.site-icc
531 # Some packages, such as Perl and Bash, generate large amounts of profiling
532 # data. You can expect these packages to use 4GB of storage, and more, during
533 # the build. Packages which generate especially large amounts of profiling
534 # data also take a lot of system resources to process this data.
536 # Some packages do not have testsuites, so we can not easily generate profiling
537 # data for them. With small packages we can manually run common commands to
538 # generating the profiling data.
540 # Beware I have frozen my system while computing profiling data (with Perl).
541 # Since then I began using 'nice -n 19' when using -prof_use, and have not
542 # frozen my system since. You can renice your whole login... first find your
543 # process ID for your LFS chroot with 'ps a | grep /tools/bin/bash', and then
544 # 'renice 10 -p ???'.
546 # The truely best way to generate profiling data is to install the programs.
547 # This way the program will be profiled against your specific system and uses.
548 # If you wish to do this, I'll let you modify the following instructions. You
549 # will need to store the profiling data in a dedicated directory, like
550 # /home/icc/prof_data/coreutils, reboot the system and run it normally for a
551 # few days, then rebuild with make-icc-prof_use (-prof_use). I have never
554 # In general, to profile packages, we would do something like this:
556 prof_gen-env ./configure &&
559 icc-make distclean &&
560 prof_use-env ./configure &&
564 # Packages (in the "Linux From Scratch - Version SVN-20061029" order):
566 # You should unset environment CFLAGS/CXXFLAGS, if you set them, so that
567 # ICC will use the optimizations in the icc config files.
569 # You should also run the testsuies whether you are using profiling or not.
571 # - Berkeley DB (and TCL)
572 # DB compiles with ICC, but the testsuite does not work without a full
573 # installation of TCL. Berkeley DB's testsuite takes about 150 SBU (many hours)
574 # to complete. If you are not prepared to do that then simply install Berkeley
575 # DB without profiling, like the LFS book does. These tests will also use
576 # about 4GB of space.
578 # If you want to profile Berkeley DB then install TCL from the BLFS book.
579 # Berkeley DB and TCL contain libraries, so you may want to add the -gcc
580 # option. I built my system using ICC as much as possible, so I did not build
581 # these libraries with -gcc because I have no compatability to worry about.
582 # TCL can also be profiled with ICC. If you want GCC compatability with TCL's
583 # libraries then run this command:
585 sed -e 's/-.*PIC/& -gcc /' -i unix/configure
587 # To profile TCL (make sure the ./configure --options are the same as in the
591 prof_gen-env ./configure --prefix=/usr --enable-threads &&
595 # TCL will fail several tests because networking does not work, and will also
596 # complain about the profiling data files being left behind, that's fine. Then
597 # rebuild TCL to use the profile data and -ipo:
599 icc-make distclean &&
600 prof_use-env ./configure --prefix=/usr --enable-threads &&
603 # You can 'make test' again if you're paranoid. Then install TCL.
605 # We need GCC compatability with Berkeley DB libraries for Man-DB:
607 sed -e 's/-.*PIC/& -gcc /' -i dist/configure
609 # Build Berkeley DB just like TCL, with the prof_gen-env and prof_use-env
610 # scripts. Also add TCL and tests to the configure command:
613 prof_gen-env ../dist/configure --prefix=/usr --enable-cxx \
614 --enable-tcl --with-tcl=/usr/lib --enable-test &&
617 # Then to run the testsuite open the tclsh shell:
621 # At the % promt run the tests (this will take hours):
623 source ../test/test.tcl
624 run_parallel 5 run_std
627 # Then clean Berkeley DB and rebuild:
629 icc-make realclean &&
630 prof_gen-env ../dist/configure --prefix=/usr --enable-cxx \
631 --enable-tcl --with-tcl=/usr/lib &&
634 # Then install Berkeley DB.
637 # E2fsprogs does not build properly with ICC. Build E2fsprogs with GCC:
639 env -u CONFIG_SITE ../configure...
643 # Build Coreutils with profiling:
645 prof_gen-env ./configure --prefix=/usr &&
648 # Then run the testsuite, distclean, and rebuild with the profiling
651 prof_use-env ./configure --prefix=/usr &&
654 # Then install Coreutils.
656 # - Iana-Etc has nothing to compile.
659 # M4 is typical. Build and install it just like Coreutils.
662 # Bison is a typical build, like M4.
665 # Ncurses builds with ICC, but I had serious issues with Bash. So for now
666 # I suggest building Ncurses with GCC:
668 env -u CONFIG_SITE ./configure...
670 # - Procps does not compile with ICC. It will compile with GCC by default.
671 # If you really want a pure ICC system, you can use the Procps utilities from
675 # I compile Sed with -fast. If you don't want to, and/or you are not using
676 # the -xP optimization, then build Sed like Coreutils. To build Sed with
679 prof_gen-env ./configure...
683 prof_use-fast-env ./configure...
689 # 'libtool' itself is a script, but the package includes a library. To add
690 # GCC compatability (this is optional):
692 sed -e 's/^CFLAGS =/& -gcc/' -i libltdl/Makefile.in
694 # Then profile Libtool like Coreutils, but use 'make clean' instead of
698 # Since I started using AR="xiar" I have not been able to get Perl to build
699 # with ICC. Even without AR="xiar" Perl will fail a couple tests. For these
700 # reasons I suggest building Perl with GCC. Just build Perl normally, it will
701 # ignore the config.site file.
704 # Readline is a library and you may want to add -gcc (I don't):
706 sed -e 's/^CFLAGS =/& -gcc/' -i {,shlib/}Makefile.in
708 # Readline does not have a testsuite, so it can not easily be profiled. Build
709 # it normally and it will use the config.site file to use ICC. Remember to
712 # - Zlib can compile with ICC, but X11 will not be able to link to it even if
713 # -gcc is used, so I do not suggest it. To build Zlib with GCC:
715 env -u CONFIG_SITE ./configure...
717 # - Autoconf and Automake are perl scripts.
720 # Bash-3.1 can compile with ICC, and bash-3.2 does not. I do not suggest
721 # using Bash-3.2 because I had bad expirence with it (it's screwy).
722 # Bash-3.1 can be built with profiling, but not with -ipo. Remember to use
723 # the bash-3.1 upstream patch. The Bash sources directory will grow to almost
724 # 3GB with profiling data. Build Bash like this:
726 prof_gen-env ./configure...
730 nice -n 19 env -u CONFIG_SITE LANG="en" LANGUAGE="en" LC_ALL="C" \
731 LD="xild" AR="xiar" CC="icc -prof_use -prof_dir=$(pwd)" \
738 # I'm building bzip2.so,a with -ipo, and bzip2 and bzip2recover with -fast.
739 # If you are not using -xP then change -fast to -ipo0.
741 icc-make CC=icc CFLAGS="-prof_gen -prof_dir=$(pwd) \
742 -D_FILE_OFFSET_BITS=64 -O2" \
743 AR=xiar LD=xild -f Makefile-libbz2_so &&
745 icc-make CC=icc CFLAGS="-prof_gen -prof_dir=$(pwd) \
746 -D_FILE_OFFSET_BITS=64 -O2" \
749 # The bzip2 testsuite tests the bzip2 which has libbz2.a linked to it, so
750 # the libbz2.so shared libraries doesn't get tested and doesn't generate
751 # profiling data. We can do this ourselves:
753 dd if=/dev/urandom of=urandom.file bs=1M count=17
754 env LD_PRELOAD=./libbz2.so.1.0 ./bzip2-shared urandom.file
755 env LD_PRELOAD=./libbz2.so.1.0 ./bzip2-shared -d urandom.file.bz2
756 cat CHANGES LICENSE bzip2 | \
757 env LD_PRELOAD=./libbz2.so.1.0 ./bzip2-shared -4 -c > non-random.bz2
758 env LD_PRELOAD=./libbz2.so.1.0 ./bzip2-shared -d non-random.bz2
759 env LD_PRELOAD=./libbz2.so.1.0 ./bzip2-shared --help
761 # Then rebuild Bzip2 with the profiling data:
764 icc-make -f Makefile-libbz2_so clean &&
765 icc-make CC=icc CFLAGS="-prof_use -prof_dir=$(pwd) -O -gcc -ipo0 -O2 \
766 -D_FILE_OFFSET_BITS=64" AR=xiar LD=xild -f Makefile-libbz2_so &&
768 icc-make CC=icc CFLAGS="-prof_use -prof_dir=$(pwd) -D_FILE_OFFSET_BITS=64 \
769 -ipo0 -fast" AR=xiar LD=xild
771 # Then when installing bzip2, do not install the 'bzip2-shared' version,
772 # install the statically linked (with -fast) 'bzip2' file instead.
774 # - Diffutils does not have a testsuite. You can build it with ICC the way the
775 # LFS book builds Diffutils. Remember to use 'icc-make'.
778 # File builds with ICC, and does not have a testsuite, just like Diffutils.
781 # Findutils can be compiled with ICC profiling, just like Coreutils or M4.
782 # I compile Findutils with -fast because 'find' and 'locate' usually do
783 # intense operations and don't stay in memory after. To build Findutils with
786 prof_gen-env ./configure...
790 prof_use-fast-env ./configure...
793 # Then install Findutils.
796 # Build and install Flex typically, like Coreutils and M4.
798 # - Grub does not compile with ICC:
800 env -u CONFIG_SITE ./configure...
803 # Build and install Gawk typically, like Flex. I used -fast with Gawk, via
806 sed -e 's/CFLAGS =/& -fast/' -i {,awklib/}Makefile &&
812 # Gettext contains libraries, so you may want to add -gcc (I don't):
814 find gettext-runtime/ -name Makefile.in \
815 -exec sed -e 's/^CFLAGS =/& -gcc/' -i {} \;
817 # I couldn't get Gettext to build with -ipo, but it builds with profiling.
818 # After 'make distclean':
820 nice -n 19 env -u CONFIG_SITE LANG="en" LANGUAGE="en" LC_ALL="C" \
821 LD="xild" AR="xiar" CC="icc -prof_use -prof_dir=$(pwd)" ./configure..
824 # Build and install Grep typically. I used -fast for Grep too.
827 # Groff does not build with -ipo, and does not have a testsuite. Build Groff
830 env -u CONFIG_SITE CC="icc" CXX="icpc" LD="xild" AR="xiar" \
831 LANG="en" LANGUAGE="en" LC_ALL="C" ...
833 # Remember to use 'icc-make'.
836 # Gzip doesn't have a testsuite, but we can mimick one:
838 dd if=/dev/urandom of=urandom.file bs=2M count=10
839 ./gzip -9 urandom.file
840 ./gzip -d urandom.file.gz
841 cat AUTHORS README README-alpha ChangeLog | ./gzip -4 -c > non-random.gz
842 ./gzip -d non-random.gz
844 # I build Gzip with -fast too.
847 # Inetutils does not have a testsuite but will compile with ICC.
850 # Iproute2 needs the -gcc option, and does not have a testsuite:
852 icc-make SBINDIR=/sbin CC="icc -gcc" &&
853 icc-make SBINDIR=/sbin CC="icc -gcc" install
856 # Kbd does not have a testsuite:
861 # Less does not have a testsuite. Configure and build it normally.
864 # Build and install Make typically.
867 # Man-DB does not have a testsuite. Configure and build it normally.
870 # Mktemp does not have a testsuite, but we can simulate one:
874 ./mktemp -p . && ./mktemp -p . XXXXXXXX
875 ./mktemp -p . -d && ./mktemp -p . -d XXXXXXXX
877 # You can build Mktemp with -fast if you like.
879 # - Module-init-tools
880 # I suggest you use this patch to dynamically link insmod:
881 # http://www.linuxfromscratch.org/patches/downloads/module-init-tools/
882 # module-init-tools-3.2.2-nostatic-1.patch
884 # Run the Module-init-tools tests like this:
886 prof_gen-env ./configure &&
887 prof_gen-env icc-make check &&
890 # Then rebuild with 'prof_use-env'.
893 # Patch does not have a testsuite. Build and install it normally.
896 # Psmisc does not have a testsuite. Build and install it normally.
899 # Shadow does not have a testsuite. Build and install it normally.
902 # Sysklogd does not have a testsuite. Build Sysklogd with ICC like this:
904 icc-make CC="icc -ipo0"
907 # Sysvinit does not have a testsuite. Build Sysvinit with ICC like this:
909 icc-make -C src CC="icc -ipo0"
912 # Tar can be built typically, like Coreutils.
915 # Texinfo can be built typically, like Coreutils.
917 # - Udev does not compile with ICC.
919 # - Util-linux does not compile with ICC.
922 # Vim can be built typically. Vim's testsuite will almost certainly screw up
923 # your terminal. Pipe the output to a log, or /dev/null:
925 make test 2>&1>/dev/null
927 # Opening and reading the log can also screw up your terminal.
929 # After LFS is installed add the environment files to /etc/profile:
931 echo "source /etc/idbvars.sh" >> /etc/profile
932 echo "source /etc/iccvars.sh" >> /etc/profile
933 echo 'export CONFIG_SITE="/usr/share/config.site-icc"' >> /etc/profile
936 # There is a project to compile the Linux kernel with ICC:
938 # http://www.pyrillion.org/linuxkernelpatch.html
940 # But I couldn't get it to work.
942 # Your system should now be running like lightning :-)
944 # Beyond LFS packages which compile with ICC:
947 # I couldn't get OpenSSL to compile with 'xiar'.
950 # OpenSSH can compile with profiling, but has a couple issues. First the
951 # 'optreset' Glibc function doesn't resolve, but we can use the 'optreset'
952 # included with OpenSSH:
954 prof_gen-env env ac_cv_have_getopt_optreset=no ./configure...
956 # The other issue is with 'ld' not resolving symbols from the Glibc
957 # library, but we can 'icc' instead:
962 # LibPNG can compile with ICC, but X11 won't be able to use it:
964 env -u CONFIG_SITE ./configure...
966 # - Freetype doesn't compile with profiling, but can compile with ICC.
968 # - Expat doesn't compile with profiling, but can compile with ICC.
970 # - Fontconfig can compile with ICC profiling.
973 # Wget will compile with ICC but has weird buggy behaviour, so I suggest
974 # building Wget with GCC:
976 env -u CONFIG_SITE ./configure...
979 # Pkg-config will build with profiling, like Coreutils.
982 # Don't build Xorg with ICC, its not well supported. Use:
984 env -u CONFIG_SITE ../build.sh...
986 # Jpeg-6b can compile with ICC profiling. Add -gcc to CFLAGS and because this
989 # LCMS can compile with ICC profiling. Add -gcc to CFLAGS because of the
992 # LibMNG can compile with ICC.
994 icc-make CC=icc CFLAGS="$ICC_CFLAGS -gcc"
997 # Add "-platform linux-icc -thread" to the ./configure command.
999 # Pkgconfig can compile with ICC profiling.
1001 # Glib2 can compile with ICC profiling. Add -gcc to CFLAGS/CXXFLAGS.
1003 # Libogg can compile with ICC profiling. Add -gcc to CFLAGS/CXXFLAGS.
1005 # Libvorbis does not compile with ICC.
1007 # Alsa-lib doesn't compile with profiling, but does compile with ICC.
1009 # Alsa-utils can compile with ICC profiling.
1011 # Audiofile can compile with ICC profiling. Add -gcc to CFLAGS/CXXFLAGS.
1013 # Libmad can compile with ICC profiling. Add -gcc to CFLAGS/CXXFLAGS.
1015 # Arts supports ICC, but the newest version of ICC does not build the latest
1016 # stable release of Arts. So, for now, it doesn't work. I emailed KDE about it,
1017 # after trying to build an Arts snapshot.
1019 # Libart_lgpl does not compile with ICC.
1021 # Wget can compile with ICC profiling.
1023 # Libxml2 can compile with ICC profiling. Add -gcc to CFLAGS/CXXFLAGS.
1025 # Libxslt can compile with ICC profiling. Add -gcc to CFLAGS/CXXFLAGS.
1027 # KDE does not compile with ICC.
1029 # Zip compiles with ICC:
1031 sed -e 's|gcc|icc|g' -i unix/Makefile
1033 # And use "generic_icc" as the make target.
1035 # Unzip compiles with ICC. Run this after applying the patches:
1037 sed -e 's|gcc|icc|g' -i unix/Makefile
1039 # Cpio can compile with ICC profiling.
1041 # Tcsh can compile with ICC profiling.
1043 # GnuPG can compile with ICC profiling.
1045 # LibIDL can compile with ICC profiling.
1047 # Others that compile with ICC:
1073 # If Lame is compiled with ICC it will cause problems with other packages, like
1074 # FFmpeg, which try to link to libmp3lame. This package should be compiled with
1093 sed -e 's at gcc@/opt/bin/icc at g' -i Makefile
1101 # Add "CC=/opt/bin/icc" to the make command.
1107 # ICC has its own Prelink program... check the man pages.
1110 * Thanks to Daniel Baumann for the original hint.
1111 * Thanks to Gentoo for their wiki page:
1112 http://gentoo-wiki.com/HOWTO_ICC_and_Portage
1118 * Added more supported packages.
1120 * It can reboot now.
1122 * New Intel CC version.
1123 * New Cpio security patch.
1124 * Point Cpio to the correct location of rmt in /tools.
1126 * Several more packages compile now.
1127 * Added instructions to profile code.
1128 * Added -gcc for Iproute2.
1130 * Run 'make check' after building with prof_gen, to generate profiling data.
1132 * Added notes for the -ipo option.
1133 * Added warning about Perl's large amount of generated profiling data.
1134 * Bash may compile with ICC now.
1135 * Fixed up the bzip2 instructions a bit.
1136 * Added note about Diffutils and File's lack of testsuite.
1139 * Use some shell variables for icc version to make it easier for users
1140 who are using a different icc version.
1141 * Add sed commands for -ipo.
1142 * Make a config.site for ICC.
1143 * Added make scripts for code profiling, to make things easier.
1144 * Add ICC_CFLAGS to the ICC config file, to make things easier.
1147 * Bump to ICC-9.1.042.
1148 * Added more uses for the -fast option, and other options.
1149 * Bumped to LFS-SVN-20061021
1150 * Static libraries can be built with -ipo, but only works if AR=xiar
1151 * Added icc-make so xiar (AR) is used.