summaryrefslogtreecommitdiffstats
path: root/documentation
diff options
context:
space:
mode:
authorScott Rifenbark <srifenbark@gmail.com>2019-10-30 09:45:49 -0700
committerRichard Purdie <richard.purdie@linuxfoundation.org>2019-11-10 14:07:08 +0000
commit35a556a73217f09a55aa35d4b80e25638b4c73ea (patch)
treec5ee899a3ccd5035a2c86113f834a85789e00c8e /documentation
parent24046332599cc528834df515a90babc83b7cd570 (diff)
downloadpoky-35a556a73217f09a55aa35d4b80e25638b4c73ea.tar.gz
ref-manual: Added 3.0 migration section.
(From yocto-docs rev: c247f87e657cb63c8fd6a79b38ad66affe8c52a7) Signed-off-by: Scott Rifenbark <srifenbark@gmail.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'documentation')
-rw-r--r--documentation/ref-manual/migration.xml497
1 files changed, 449 insertions, 48 deletions
diff --git a/documentation/ref-manual/migration.xml b/documentation/ref-manual/migration.xml
index aa44957894..8d50ab9133 100644
--- a/documentation/ref-manual/migration.xml
+++ b/documentation/ref-manual/migration.xml
@@ -4739,7 +4739,7 @@ id=f4d4f99cfbc2396e49c1613a7d237b9e57f06f81'>commit message</ulink>.
4739 4739
4740 <para> 4740 <para>
4741 This section provides information about packaging changes that have 4741 This section provides information about packaging changes that have
4742 ocurred: 4742 occurred:
4743 <itemizedlist> 4743 <itemizedlist>
4744 <listitem><para> 4744 <listitem><para>
4745 <emphasis><filename>python3</filename> Changes:</emphasis> 4745 <emphasis><filename>python3</filename> Changes:</emphasis>
@@ -6597,14 +6597,6 @@ id=f4d4f99cfbc2396e49c1613a7d237b9e57f06f81'>commit message</ulink>.
6597 </section> 6597 </section>
6598</section> 6598</section>
6599 6599
6600
6601
6602
6603
6604
6605
6606
6607
6608<section id='moving-to-the-yocto-project-3.0-release'> 6600<section id='moving-to-the-yocto-project-3.0-release'>
6609 <title>Moving to the Yocto Project 3.0 Release</title> 6601 <title>Moving to the Yocto Project 3.0 Release</title>
6610 6602
@@ -6613,64 +6605,392 @@ id=f4d4f99cfbc2396e49c1613a7d237b9e57f06f81'>commit message</ulink>.
6613 Yocto Project 3.0 Release from the prior release. 6605 Yocto Project 3.0 Release from the prior release.
6614 </para> 6606 </para>
6615 6607
6616 <section id='migration-3.0-lsb-support-removed'> 6608 <section id='migration-3.0-init-system-selection'>
6617 <title>LSB Support Removed</title> 6609 <title>Init System Selection</title>
6618 6610
6619 <para> 6611 <para>
6620 LSB support has been removed. 6612 Changing the init system manager previously required setting a
6613 number of different variables.
6614 You can now change the manager by setting the
6615 <filename>INIT_MANAGER</filename> variable and the corresponding
6616 include files
6617 (i.e. <filename>conf/distro/include/init-manager-*.conf</filename>).
6618 Include files are provided for four values: "none", "sysvinit",
6619 "systemd", and "mdev-busybox".
6620 The default value, "none", for <filename>INIT_MANAGER</filename>
6621 should allow your current settings to continue working.
6622 However, it is advisable to explicitly set
6623 <filename>INIT_MANAGER</filename>.
6621 </para> 6624 </para>
6622 </section> 6625 </section>
6623 6626
6624 <section id='migration-3.0-poky-lsb-replaced'> 6627 <section id='migration-3.0-lsb-support-removed'>
6625 <title><filename>poky-lsb</filename> Replaced</title> 6628 <title>LSB Support Removed</title>
6629
6630 <para>
6631 Linux Standard Base (LSB) as a standard is not current, and
6632 is not well suited for embedded applications.
6633 Support can be continued in a separate layer if needed.
6634 However, presently LSB support has been removed from the core.
6635 </para>
6626 6636
6627 <para> 6637 <para>
6628 <filename>poky-lsb</filename> replaced by 6638 As a result of this change, the <filename>poky-lsb</filename>
6629 <filename>poky-altcfg</filename> for alternate configurations to 6639 derivative distribution configuration that was also used for
6630 be tested on the autobuilder. 6640 testing alternative configurations has been replaced with a
6631 As well as an example of subclassing a distro config. 6641 <filename>poky-altcfg</filename> distribution that has LSB
6642 parts removed.
6632 </para> 6643 </para>
6633 </section> 6644 </section>
6634 6645
6635 <section id='migration-3.0-openssl-removed'> 6646 <section id='migration-3.0-removed-recipes'>
6636 <title>OpenSSL 1.0.X removed</title> 6647 <title>Removed Recipes</title>
6637 6648
6638 <para> 6649 <para>
6639 OpenSSL 1.0.X removed. 6650 The following recipes have been removed.
6651 <itemizedlist>
6652 <listitem><para>
6653 <filename>core-image-lsb-dev</filename>: Part of removed
6654 LSB support.
6655 </para></listitem>
6656 <listitem><para>
6657 <filename>core-image-lsb</filename>: Part of removed
6658 LSB support.
6659 </para></listitem>
6660 <listitem><para>
6661 <filename>core-image-lsb-sdk</filename>: Part of removed
6662 LSB support.
6663 </para></listitem>
6664 <listitem><para>
6665 <filename>cve-check-tool</filename>: Functionally replaced
6666 by the <filename>cve-update-db</filename> recipe and
6667 <filename>cve-check</filename> class.
6668 </para></listitem>
6669 <listitem><para>
6670 <filename>eglinfo</filename>: No longer maintained.
6671 <filename>eglinfo</filename> from
6672 <filename>mesa-demos</filename> is an adequate and
6673 maintained alternative.
6674 </para></listitem>
6675 <listitem><para>
6676 <filename>gcc-8.3</filename>: Version 8.3 removed.
6677 Replaced by 9.2.
6678 </para></listitem>
6679 <listitem><para>
6680 <filename>gnome-themes-standard</filename>: Only needed
6681 by gtk+ 2.x, which has been removed.
6682 </para></listitem>
6683 <listitem><para>
6684 <filename>gtk+</filename>: GTK+ 2 is obsolete and has been
6685 replaced by gtk+3.
6686 </para></listitem>
6687 <listitem><para>
6688 <filename>irda-utils</filename>: Has become obsolete.
6689 IrDA support has been removed from the Linux kernel in
6690 version 4.17 and later.
6691 </para></listitem>
6692 <listitem><para>
6693 <filename>libnewt-python</filename>:
6694 <filename>libnewt</filename> Python support merged into
6695 main <filename>libnewt</filename> recipe.
6696 </para></listitem>
6697 <listitem><para>
6698 <filename>libsdl</filename>: Replaced by newer
6699 <filename>libsdl2</filename>.
6700 </para></listitem>
6701 <listitem><para>
6702 <filename>libx11-diet</filename>: Became obsolete.
6703 </para></listitem>
6704 <listitem><para>
6705 <filename>libxx86dga</filename>: Removed obsolete client
6706 library.
6707 </para></listitem>
6708 <listitem><para>
6709 <filename>libxx86misc</filename>: Removed. Library is
6710 redundant.
6711 </para></listitem>
6712 <listitem><para>
6713 <filename>linux-yocto</filename>: Version 5.0 removed,
6714 which is now redundant (5.2 / 4.19 present).
6715 </para></listitem>
6716 <listitem><para>
6717 <filename>lsbinitscripts</filename>: Part of removed LSB
6718 support.
6719 </para></listitem>
6720 <listitem><para>
6721 <filename>lsb</filename>: Part of removed LSB support.
6722 </para></listitem>
6723 <listitem><para>
6724 <filename>lsbtest</filename>: Part of removed LSB support.
6725 </para></listitem>
6726 <listitem><para>
6727 <filename>openssl10</filename>: Replaced by newer
6728 <filename>openssl</filename> version 1.1.
6729 </para></listitem>
6730 <listitem><para>
6731 <filename>packagegroup-core-lsb</filename>: Part of removed
6732 LSB support.
6733 </para></listitem>
6734 <listitem><para>
6735 <filename>python-nose</filename>: Removed the Python 2.x
6736 version of the recipe.
6737 </para></listitem>
6738 <listitem><para>
6739 <filename>python-numpy</filename>: Removed the Python 2.x
6740 version of the recipe.
6741 </para></listitem>
6742 <listitem><para>
6743 <filename>python-scons</filename>: Removed the Python 2.x
6744 version of the recipe.
6745 </para></listitem>
6746 <listitem><para>
6747 <filename>source-highlight</filename>: No longer needed.
6748 </para></listitem>
6749 <listitem><para>
6750 <filename>stress</filename>: Replaced by
6751 <filename>stress-ng</filename>.
6752 </para></listitem>
6753 <listitem><para>
6754 <filename>vulkan</filename>: Split into
6755 <filename>vulkan-loader</filename>,
6756 <filename>vulkan-headers</filename>, and
6757 <filename>vulkan-tools</filename>.
6758 </para></listitem>
6759 <listitem><para>
6760 <filename>weston-conf</filename>: Functionality moved to
6761 <filename>weston-init</filename>.
6762 </para></listitem>
6763 </itemizedlist>
6640 </para> 6764 </para>
6641 </section> 6765 </section>
6642 6766
6643 <section id='migration-3.0-hash-Equivalence added'> 6767 <section id='migration-3.0-packaging-changes'>
6644 <title>Hash Equivalence Added</title> 6768 <title>Packaging Changes</title>
6645 6769
6646 <para> 6770 <para>
6647 Hash Equivalence added. 6771 The following packaging changes have occurred.
6648 See <ulink url='https://git.openembedded.org/openembedded-core/commit/?id=49b10ab3f802bf36d8a2add7db208a868f525d5b'></ulink> 6772 <itemizedlist>
6649 for setup information. 6773 <listitem><para>
6774 The
6775 <ulink url='https://en.wikipedia.org/wiki/GNOME_Web'>Epiphany</ulink>
6776 browser has been dropped from
6777 <filename>packagegroup-self-hosted</filename> as it has
6778 not been needed inside
6779 <filename>build-appliance-image</filename> for
6780 quite some time and was causing resource problems.
6781 </para></listitem>
6782 <listitem><para>
6783 <filename>libcap-ng</filename> Python support has been
6784 moved to a separate <filename>libcap-ng-python</filename>
6785 recipe to streamline the build process when the Python
6786 bindings are not needed.
6787 </para></listitem>
6788 <listitem><para>
6789 <filename>libdrm</filename> now packages the file
6790 <filename>amdgpu.ids</filename> into a separate
6791 <filename>libdrm-amdgpu</filename> package.
6792 </para></listitem>
6793 <listitem><para>
6794 <filename>python3</filename>: The
6795 <filename>runpy</filename> module is now in the
6796 <filename>python3-core</filename> package as it is
6797 required to support the common "python3 -m" command usage.
6798 </para></listitem>
6799 <listitem><para>
6800 <filename>distcc</filename> now provides separate
6801 <filename>distcc-client</filename> and
6802 <filename>distcc-server</filename> packages as typically
6803 one or the other are needed, rather than both.
6804 </para></listitem>
6805 <listitem><para>
6806 <filename>python*-setuptools</filename> recipes now
6807 separately package the <filename>pkg_resources</filename>
6808 module in a <filename>python-pkg-resources</filename> /
6809 <filename>python3-pkg-resources</filename> package as
6810 the module is useful independent of the rest of the
6811 setuptools package.
6812 The main <filename>python-setuptools</filename> /
6813 <filename>python3-setuptools</filename> package depends
6814 on this new package so you should only need to update
6815 dependencies unless you want to take advantage of the
6816 increased granularity.
6817 </para></listitem>
6818 </itemizedlist>
6650 </para> 6819 </para>
6651 </section> 6820 </section>
6652 6821
6653 <section id='migration-3.0-gnu-tests-added'> 6822 <section id='migration-3.0-cve-checking'>
6654 <title><filename>gcc/glibc/binutls</filename> GNU Tests Added</title> 6823 <title>CVE Checking</title>
6655 6824
6656 <para> 6825 <para>
6657 <filename>gcc/glibc/binutls</filename> GNU tests added. 6826 <filename>cve-check-tool</filename> has been functionally replaced
6827 by a new <filename>cve-update-db</filename> recipe and
6828 functionality built into the <filename>cve-check</filename> class.
6829 The result uses NVD JSON data feeds rather than the deprecated
6830 XML feeds that <filename>cve-check-tool</filename> was using,
6831 supports CVSSv3 scoring, and makes other improvements.
6832 </para>
6833
6834 <para>
6835 Additionally, the <filename>CVE_CHECK_CVE_WHITELIST</filename>
6836 variable has been replaced by
6837 <filename>CVE_CHECK_WHITELIST</filename>.
6658 </para> 6838 </para>
6659 </section> 6839 </section>
6660 6840
6661 <section id='migration-3.0-removed-recipes'> 6841 <section id='migration-3.0-bitbake-changes'>
6662 <title>Removed Recipes</title> 6842 <title>Bitbake Changes</title>
6663 6843
6664 <para> 6844 <para>
6665 Some topic... 6845 The following BitBake changes have occurred.
6666 </para> 6846 <itemizedlist>
6847 <listitem><para>
6848 <filename>addtask</filename> statements now properly
6849 validate dependent tasks.
6850 Previously, an invalid task was silently ignored.
6851 With this change, the invalid task generates a warning.
6852 </para></listitem>
6853 <listitem><para>
6854 Other invalid <filename>addtask</filename> and
6855 <filename>deltask</filename> usages now trigger these
6856 warnings: "multiple target tasks arguments with
6857 addtask / deltask", and "multiple before/after clauses".
6858 </para></listitem>
6859 <listitem><para>
6860 The "multiconfig" prefix is now shortened to "mc".
6861 "multiconfig" will continue to work, however it may be
6862 removed in a future release.
6863 </para></listitem>
6864 <listitem><para>
6865 The <filename>bitbake -g</filename> command no longer
6866 generates a <filename>recipe-depends.dot</filename> file
6867 as the contents (i.e. a reprocessed version of
6868 <filename>task-depends.dot</filename>) were confusing.
6869 </para></listitem>
6870 <listitem><para>
6871 The <filename>bb.build.FuncFailed</filename> exception,
6872 previously raised by
6873 <filename>bb.build.exec_func()</filename> when certain
6874 other exceptions have occurred, has been removed.
6875 The real underlying exceptions will be raised instead.
6876 If you have calls to
6877 <filename>bb.build.exec_func()</filename> in custom classes
6878 or <filename>tinfoil-using</filename> scripts, any
6879 references to <filename>bb.build.FuncFailed</filename>
6880 should be cleaned up.
6881 </para></listitem>
6882 <listitem><para>
6883 Additionally, the
6884 <filename>bb.build.exec_func()</filename> no longer accepts
6885 the "pythonexception" parameter.
6886 The function now always raises exceptions.
6887 Remove this argument in any calls to
6888 <filename>bb.build.exec_func()</filename> in custom classes
6889 or scripts.
6890 </para></listitem>
6891 <listitem><para>
6892 The
6893 <ulink url='&YOCTO_DOCS_BB_URL;#var-bb-BB_SETSCENE_VERIFY_FUNCTION2'><filename>BB_SETSCENE_VERIFY_FUNCTION2</filename></ulink>
6894 is no longer used.
6895 In the unlikely event that you have any references to it,
6896 they should be removed.
6897 </para></listitem>
6898 <listitem><para>
6899 The <filename>RunQueueExecuteScenequeue</filename> and
6900 <filename>RunQueueExecuteTasks</filename> events have been
6901 removed since setscene tasks are now executed as part of
6902 the normal runqueue.
6903 Any event handling code in custom classes or scripts that
6904 handles these two events need to be updated.
6905 </para></listitem>
6906 <listitem><para>
6907 The arguments passed to functions used with
6908 <ulink url='&YOCTO_DOCS_BB_URL;#var-bb-BB_HASHCHECK_FUNCTION'><filename>BB_HASHCHECK_FUNCTION</filename></ulink>
6909 have changed.
6910 If you are using your own custom hash check function, see
6911 <ulink url='http://git.yoctoproject.org/cgit/cgit.cgi/poky/commit/?id=40a5e193c4ba45c928fccd899415ea56b5417725'></ulink>
6912 for details.
6913 </para></listitem>
6914 <listitem><para>
6915 Task specifications in <filename>BB_TASKDEPDATA</filename>
6916 and class implementations used in signature generator
6917 classes now use "&lt;fn&gt;:&lt;task&gt;" everywhere rather than
6918 the "." delimiter that was being used in some places.
6919 This change makes it consistent with all areas in the code.
6920 Custom signature generator classes and code that reads
6921 <filename>BB_TASKDEPDATA</filename> need to be updated to
6922 use ':' as a separator rather than '.'.
6923 </para></listitem>
6924 </itemizedlist>
6925 </para>
6667 </section> 6926 </section>
6668 6927
6669 <section id='migration-3.0-removed-classes'> 6928 <section id='migration-3.0-sanity-checks'>
6670 <title>Removed Classes</title> 6929 <title>Sanity Checks</title>
6671 6930
6672 <para> 6931 <para>
6673 Some topic... 6932 The following sanity check changes occurred.
6933 <itemizedlist>
6934 <listitem><para>
6935 <link linkend='var-SRC_URI'><filename>SRC_URI</filename></link>
6936 is now checked for usage of two problematic items:
6937 <itemizedlist>
6938 <listitem><para>
6939 "${PN}" prefix/suffix use - Warnings always appear
6940 if ${PN} is used.
6941 You must fix the issue regardless of whether
6942 multiconfig or anything else that would cause
6943 prefixing/suffixing to happen.
6944 </para></listitem>
6945 <listitem><para>
6946 Github archive tarballs - these are not guaranteed
6947 to be stable.
6948 Consequently, it is likely that the tarballs will
6949 be refreshed and thus the SRC_URI checksums
6950 will fail to apply.
6951 It is recommended that you fetch either an official
6952 release tarball or a specific revision from the
6953 actual Git repository instead.
6954 </para></listitem>
6955 </itemizedlist>
6956 Either one of these items now trigger a warning by default.
6957 If you wish to disable this check, remove
6958 <filename>src-uri-bad</filename> from
6959 <link linkend='var-WARN_QA'><filename>WARN_QA</filename></link>.
6960 </para></listitem>
6961 <listitem><para>
6962 The <filename>file-rdeps</filename> runtime dependency
6963 check no longer expands
6964 <link linkend='var-RDEPENDS'><filename>RDEPENDS</filename></link>
6965 recursively as there is no mechanism to ensure they can be
6966 fully computed, and thus races sometimes result in errors
6967 either showing up or not.
6968 Thus, you might now see errors for missing runtime
6969 dependencies that were previously satisfied recursively.
6970 Here is an example: package A contains a shell script
6971 starting with <filename>#!/bin/bash</filename> but has no
6972 dependency on bash.
6973 However, package A depends on package B, which does depend
6974 on bash.
6975 You need to add the missing dependency or dependencies to
6976 resolve the warning.
6977 </para></listitem>
6978 <listitem><para>
6979 Setting <filename>DEPENDS_${PN}</filename> anywhere
6980 (i.e. typically in a recipe) now triggers an error.
6981 The error is triggered because
6982 <link linkend='var-DEPENDS'><filename>DEPENDS</filename></link>
6983 is not a package-specific variable unlike RDEPENDS.
6984 You should set <filename>DEPENDS</filename> instead.
6985 </para></listitem>
6986 <listitem><para>
6987 systemd currently does not work well with the musl C
6988 library because only upstream officially supports linking
6989 the library with glibc.
6990 Thus, a warning is shown when building systemd in
6991 conjunction with musl.
6992 </para></listitem>
6993 </itemizedlist>
6674 </para> 6994 </para>
6675 </section> 6995 </section>
6676 6996
@@ -6678,22 +6998,103 @@ id=f4d4f99cfbc2396e49c1613a7d237b9e57f06f81'>commit message</ulink>.
6678 <title>Miscellaneous Changes</title> 6998 <title>Miscellaneous Changes</title>
6679 6999
6680 <para> 7000 <para>
6681 Some topic... 7001 The following miscellaneous changes have occurred.
7002 <itemizedlist>
7003 <listitem><para>
7004 The <filename>gnome</filename>
7005 class has been removed because it now does very little.
7006 You should update recipes that previously inherited this
7007 class to do the following:
7008 <literallayout class='monospaced'>
7009 inherit gnomebase gtk-icon-cache gconf mime
7010 </literallayout>
7011 </para></listitem>
7012 <listitem><para>
7013 The
7014 <filename>meta/recipes-kernel/linux/linux-dtb.inc</filename>
7015 file has been removed.
7016 This file was previously deprecated in favor of setting
7017 <link linkend='var-KERNEL_DEVICETREE'><filename>KERNEL_DEVICETREE</filename></link>
7018 in any kernel recipe and only produced a warning.
7019 Remove any <filename>include</filename> or
7020 <filename>require</filename> statements pointing to this
7021 file.
7022 </para></listitem>
7023 <listitem><para>
7024 <link linkend='var-TARGET_CFLAGS'><filename>TARGET_CFLAGS</filename></link>,
7025 <link linkend='var-TARGET_CPPFLAGS'><filename>TARGET_CPPFLAGS</filename></link>,
7026 <link linkend='var-TARGET_CXXFLAGS'><filename>TARGET_CXXFLAGS</filename></link>,
7027 and
7028 <link linkend='var-TARGET_LDFLAGS'><filename>TARGET_LDFLAGS</filename></link>
7029 are no longer exported to the external environment.
7030 This change did not require any changes to core recipes,
7031 which is a good indicator that no changes will be
7032 required.
7033 However, if for some reason the software being built by one
7034 of your recipes is expecting these variables to be set,
7035 then building the recipe will fail.
7036 In such cases, you must either export the variable or
7037 variables in the recipe or change the scripts so that
7038 exporting is not necessary.
7039 </para></listitem>
7040 <listitem><para>
7041 You must change the host distro identifier used in
7042 <link linkend='var-NATIVELSBSTRING'><filename>NATIVELSBSTRING</filename></link>
7043 to use all lowercase characters even if it does not contain
7044 a version number.
7045 This change is necessary only if you are not using
7046 <filename>uninative</filename> and
7047 <link linkend='var-SANITY_TESTED_DISTROS'><filename>SANITY_TESTED_DISTROS</filename></link>.
7048 </para></listitem>
7049 <listitem><para>
7050 In the <filename>base-files</filename> recipe, writing the
7051 hostname into <filename>/etc/hosts</filename> and
7052 <filename>/etc/hostname</filename> is now done within the
7053 main
7054 <link linkend='ref-tasks-install'><filename>do_install</filename></link>
7055 function rather than in the
7056 <filename>do_install_basefilesissue</filename> function.
7057 The reason for the change is because
7058 <filename>do_install_basefilesissue</filename> is more
7059 easily overridden without having to duplicate the hostname
7060 functionality.
7061 If you have done the latter (e.g. in a
7062 <filename>base-files</filename> bbappend), then you should
7063 remove it from your customized
7064 <filename>do_install_basefilesissue</filename> function.
7065 </para></listitem>
7066 <listitem><para>
7067 The <filename>wic --expand</filename> command now uses
7068 commas to separate "key:value" pairs rather than hyphens.
7069 <note>
7070 The wic command-line help is not updated.
7071 </note>
7072 You must update any scripts or commands where you use
7073 <filename>wic --expand</filename> with multiple
7074 "key:value" pairs.
7075 </para></listitem>
7076 <listitem><para>
7077 UEFI image variable settings have been moved from various
7078 places to a central
7079 <filename>conf/image-uefi.conf</filename>.
7080 This change should not influence any existing configuration
7081 as the <filename>meta/conf/image-uefi.conf</filename>
7082 in the core metadata sets defaults that can be overridden
7083 in the same manner as before.
7084 </para></listitem>
7085 <listitem><para>
7086 <filename>conf/distro/include/world-broken.inc</filename>
7087 has been removed.
7088 For cases where certain recipes need to be disabled when
7089 using the musl C library, these recipes now have
7090 <filename>COMPATIBLE_HOST_libc-musl</filename> set with a
7091 comment that explains why.
7092 </para></listitem>
7093 </itemizedlist>
6682 </para> 7094 </para>
6683 </section> 7095 </section>
6684</section> 7096</section>
6685 7097
6686
6687
6688
6689
6690
6691
6692
6693
6694
6695
6696
6697</chapter> 7098</chapter>
6698<!-- 7099<!--
6699vim: expandtab tw=80 ts=4 7100vim: expandtab tw=80 ts=4