VERSION = 3
PATCHLEVEL = 4
SUBLEVEL = 0
-EXTRAVERSION = -rc1
+EXTRAVERSION =
NAME = Saber-toothed Squirrel
# *DOCUMENTATION*
# Where to locate arch specific headers
hdr-arch := $(SRCARCH)
- ifeq ($(ARCH),m68knommu)
- hdr-arch := m68k
- endif
-
KCONFIG_CONFIG ?= .config
export KCONFIG_CONFIG
GENKSYMS = scripts/genksyms/genksyms
INSTALLKERNEL := installkernel
DEPMOD = /sbin/depmod
- KALLSYMS = scripts/kallsyms
PERL = perl
CHECK = sparse
# Files to ignore in find ... statements
-RCS_FIND_IGNORE := \( -name SCCS -o -name BitKeeper -o -name .svn -o -name CVS -o -name .pc -o -name .hg -o -name .git \) -prune -o
-export RCS_TAR_IGNORE := --exclude SCCS --exclude BitKeeper --exclude .svn --exclude CVS --exclude .pc --exclude .hg --exclude .git
+RCS_FIND_IGNORE := \( -name SCCS -o -name BitKeeper -o -name .svn -o -name CVS \
+ -o -name .pc -o -name .hg -o -name .git \) -prune -o
+export RCS_TAR_IGNORE := --exclude SCCS --exclude BitKeeper --exclude .svn \
+ --exclude CVS --exclude .pc --exclude .hg --exclude .git
# ===========================================================================
# Rules shared between *config targets and build targets
no-dot-config-targets := clean mrproper distclean \
cscope gtags TAGS tags help %docs check% coccicheck \
- include/linux/version.h headers_% archheaders \
+ include/linux/version.h headers_% archheaders archscripts \
kernelversion %src-pkg
config-targets := 0
KBUILD_CFLAGS += -O2
endif
+ifdef CONFIG_READABLE_ASM
+# Disable optimizations that make assembler listings hard to read.
+# reorder blocks reorders the control in the function
+# ipa clone creates specialized cloned functions
+# partial inlining inlines only parts of functions
+KBUILD_CFLAGS += $(call cc-option,-fno-reorder-blocks,) \
+ $(call cc-option,-fno-ipa-cp-clone,) \
+ $(call cc-option,-fno-partial-inlining)
+endif
+
include $(srctree)/arch/$(SRCARCH)/Makefile
ifneq ($(CONFIG_FRAME_WARN),0)
libs-y2 := $(patsubst %/, %/built-in.o, $(libs-y))
libs-y := $(libs-y1) $(libs-y2)
- # Build vmlinux
- # ---------------------------------------------------------------------------
- # vmlinux is built from the objects selected by $(vmlinux-init) and
- # $(vmlinux-main). Most are built-in.o files from top-level directories
- # in the kernel tree, others are specified in arch/$(ARCH)/Makefile.
- # Ordering when linking is important, and $(vmlinux-init) must be first.
- #
- # vmlinux
- # ^
- # |
- # +-< $(vmlinux-init)
- # | +--< init/version.o + more
- # |
- # +--< $(vmlinux-main)
- # | +--< driver/built-in.o mm/built-in.o + more
- # |
- # +-< kallsyms.o (see description in CONFIG_KALLSYMS section)
- #
- # vmlinux version (uname -v) cannot be updated during normal
- # descending-into-subdirs phase since we do not yet know if we need to
- # update vmlinux.
- # Therefore this step is delayed until just before final link of vmlinux -
- # except in the kallsyms case where it is done just before adding the
- # symbols to the kernel.
- #
- # System.map is generated to document addresses of all kernel symbols
-
- vmlinux-init := $(head-y) $(init-y)
- vmlinux-main := $(core-y) $(libs-y) $(drivers-y) $(net-y)
- vmlinux-all := $(vmlinux-init) $(vmlinux-main)
- vmlinux-lds := arch/$(SRCARCH)/kernel/vmlinux.lds
- export KBUILD_VMLINUX_OBJS := $(vmlinux-all)
-
- # Rule to link vmlinux - also used during CONFIG_KALLSYMS
- # May be overridden by arch/$(ARCH)/Makefile
- quiet_cmd_vmlinux__ ?= LD $@
- cmd_vmlinux__ ?= $(LD) $(LDFLAGS) $(LDFLAGS_vmlinux) -o $@ \
- -T $(vmlinux-lds) $(vmlinux-init) \
- --start-group $(vmlinux-main) --end-group \
- $(filter-out $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) vmlinux.o FORCE ,$^)
-
- # Generate new vmlinux version
- quiet_cmd_vmlinux_version = GEN .version
- cmd_vmlinux_version = set -e; \
- if [ ! -r .version ]; then \
- rm -f .version; \
- echo 1 >.version; \
- else \
- mv .version .old_version; \
- expr 0$$(cat .old_version) + 1 >.version; \
- fi; \
- $(MAKE) $(build)=init
-
- # Generate System.map
- quiet_cmd_sysmap = SYSMAP
- cmd_sysmap = $(CONFIG_SHELL) $(srctree)/scripts/mksysmap
-
- # Sort exception table at build time
- quiet_cmd_sortextable = SORTEX
- cmd_sortextable = $(objtree)/scripts/sortextable
-
- # Link of vmlinux
- # If CONFIG_KALLSYMS is set .version is already updated
- # Generate System.map and verify that the content is consistent
- # Use + in front of the vmlinux_version rule to silent warning with make -j2
- # First command is ':' to allow us to use + in front of the rule
- define rule_vmlinux__
- :
- $(if $(CONFIG_KALLSYMS),,+$(call cmd,vmlinux_version))
-
- $(call cmd,vmlinux__)
- $(Q)echo 'cmd_$@ := $(cmd_vmlinux__)' > $(@D)/.$(@F).cmd
-
- $(if $(CONFIG_BUILDTIME_EXTABLE_SORT), \
- $(Q)$(if $($(quiet)cmd_sortextable), \
- echo ' $($(quiet)cmd_sortextable) vmlinux' &&) \
- $(cmd_sortextable) vmlinux)
-
-
- $(Q)$(if $($(quiet)cmd_sysmap), \
- echo ' $($(quiet)cmd_sysmap) System.map' &&) \
- $(cmd_sysmap) $@ System.map; \
- if [ $$? -ne 0 ]; then \
- rm -f $@; \
- /bin/false; \
- fi;
- $(verify_kallsyms)
- endef
-
-
- ifdef CONFIG_KALLSYMS
- # Generate section listing all symbols and add it into vmlinux $(kallsyms.o)
- # It's a three stage process:
- # o .tmp_vmlinux1 has all symbols and sections, but __kallsyms is
- # empty
- # Running kallsyms on that gives us .tmp_kallsyms1.o with
- # the right size - vmlinux version (uname -v) is updated during this step
- # o .tmp_vmlinux2 now has a __kallsyms section of the right size,
- # but due to the added section, some addresses have shifted.
- # From here, we generate a correct .tmp_kallsyms2.o
- # o The correct .tmp_kallsyms2.o is linked into the final vmlinux.
- # o Verify that the System.map from vmlinux matches the map from
- # .tmp_vmlinux2, just in case we did not generate kallsyms correctly.
- # o If 'make KALLSYMS_EXTRA_PASS=1" was used, do an extra pass using
- # .tmp_vmlinux3 and .tmp_kallsyms3.o. This is only meant as a
- # temporary bypass to allow the kernel to be built while the
- # maintainers work out what went wrong with kallsyms.
-
- last_kallsyms := 2
-
- ifdef KALLSYMS_EXTRA_PASS
- ifneq ($(KALLSYMS_EXTRA_PASS),0)
- last_kallsyms := 3
- endif
- endif
-
- kallsyms.o := .tmp_kallsyms$(last_kallsyms).o
-
- define verify_kallsyms
- $(Q)$(if $($(quiet)cmd_sysmap), \
- echo ' $($(quiet)cmd_sysmap) .tmp_System.map' &&) \
- $(cmd_sysmap) .tmp_vmlinux$(last_kallsyms) .tmp_System.map
- $(Q)cmp -s System.map .tmp_System.map || \
- (echo Inconsistent kallsyms data; \
- echo This is a bug - please report about it; \
- echo Try "make KALLSYMS_EXTRA_PASS=1" as a workaround; \
- rm .tmp_kallsyms* ; /bin/false )
- endef
-
- # Update vmlinux version before link
- # Use + in front of this rule to silent warning about make -j1
- # First command is ':' to allow us to use + in front of this rule
- cmd_ksym_ld = $(cmd_vmlinux__)
- define rule_ksym_ld
- :
- +$(call cmd,vmlinux_version)
- $(call cmd,vmlinux__)
- $(Q)echo 'cmd_$@ := $(cmd_vmlinux__)' > $(@D)/.$(@F).cmd
- endef
-
- # Generate .S file with all kernel symbols
- quiet_cmd_kallsyms = KSYM $@
- cmd_kallsyms = $(NM) -n $< | $(KALLSYMS) \
- $(if $(CONFIG_KALLSYMS_ALL),--all-symbols) > $@
+ # Externally visible symbols (used by link-vmlinux.sh)
+ export KBUILD_VMLINUX_INIT := $(head-y) $(init-y)
+ export KBUILD_VMLINUX_MAIN := $(core-y) $(libs-y) $(drivers-y) $(net-y)
+ export KBUILD_LDS := arch/$(SRCARCH)/kernel/vmlinux.lds
+ export LDFLAGS_vmlinux
- .tmp_kallsyms1.o .tmp_kallsyms2.o .tmp_kallsyms3.o: %.o: %.S scripts FORCE
- $(call if_changed_dep,as_o_S)
+ vmlinux-deps := $(KBUILD_LDS) $(KBUILD_VMLINUX_INIT) $(KBUILD_VMLINUX_MAIN)
- .tmp_kallsyms%.S: .tmp_vmlinux% $(KALLSYMS)
- $(call cmd,kallsyms)
+ # Final link of vmlinux
+ cmd_link-vmlinux = $(CONFIG_SHELL) $< $(LD) $(LDFLAGS) $(LDFLAGS_vmlinux)
+ quiet_cmd_link-vmlinux = LINK $@
- # .tmp_vmlinux1 must be complete except kallsyms, so update vmlinux version
- .tmp_vmlinux1: $(vmlinux-lds) $(vmlinux-all) FORCE
- $(call if_changed_rule,ksym_ld)
-
- .tmp_vmlinux2: $(vmlinux-lds) $(vmlinux-all) .tmp_kallsyms1.o FORCE
- $(call if_changed,vmlinux__)
-
- .tmp_vmlinux3: $(vmlinux-lds) $(vmlinux-all) .tmp_kallsyms2.o FORCE
- $(call if_changed,vmlinux__)
-
- # Needs to visit scripts/ before $(KALLSYMS) can be used.
- $(KALLSYMS): scripts ;
-
- # Generate some data for debugging strange kallsyms problems
- debug_kallsyms: .tmp_map$(last_kallsyms)
-
- .tmp_map%: .tmp_vmlinux% FORCE
- ($(OBJDUMP) -h $< | $(AWK) '/^ +[0-9]/{print $$4 " 0 " $$2}'; $(NM) $<) | sort > $@
-
- .tmp_map3: .tmp_map2
-
- .tmp_map2: .tmp_map1
-
- endif # ifdef CONFIG_KALLSYMS
-
- # Do modpost on a prelinked vmlinux. The finally linked vmlinux has
- # relevant sections renamed as per the linker script.
- quiet_cmd_vmlinux-modpost = LD $@
- cmd_vmlinux-modpost = $(LD) $(LDFLAGS) -r -o $@ \
- $(vmlinux-init) --start-group $(vmlinux-main) --end-group \
- $(filter-out $(vmlinux-init) $(vmlinux-main) FORCE ,$^)
- define rule_vmlinux-modpost
- :
- +$(call cmd,vmlinux-modpost)
- $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost $@
- $(Q)echo 'cmd_$@ := $(cmd_vmlinux-modpost)' > $(dot-target).cmd
- endef
-
- # vmlinux image - including updated kernel symbols
- vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) vmlinux.o $(kallsyms.o) FORCE
+ # Include targets which we want to
+ # execute if the rest of the kernel build went well.
+ vmlinux: scripts/link-vmlinux.sh $(vmlinux-deps) FORCE
ifdef CONFIG_HEADERS_CHECK
$(Q)$(MAKE) -f $(srctree)/Makefile headers_check
endif
ifdef CONFIG_BUILD_DOCSRC
$(Q)$(MAKE) $(build)=Documentation
endif
- $(call vmlinux-modpost)
- $(call if_changed_rule,vmlinux__)
- $(Q)rm -f .old_version
-
- # build vmlinux.o first to catch section mismatch errors early
- ifdef CONFIG_KALLSYMS
- .tmp_vmlinux1: vmlinux.o
- endif
-
- modpost-init := $(filter-out init/built-in.o, $(vmlinux-init))
- vmlinux.o: $(modpost-init) $(vmlinux-main) FORCE
- $(call if_changed_rule,vmlinux-modpost)
+ +$(call if_changed,link-vmlinux)
# The actual objects are generated when descending,
# make sure no implicit rule kicks in
- $(sort $(vmlinux-init) $(vmlinux-main)) $(vmlinux-lds): $(vmlinux-dirs) ;
+ $(sort $(vmlinux-deps)): $(vmlinux-dirs) ;
# Handle descending into subdirectories listed in $(vmlinux-dirs)
# Preset locale variables to speed up the build process. Limit locale
ifneq ($(KBUILD_SRC),)
@$(kecho) ' Using $(srctree) as source for kernel'
$(Q)if [ -f $(srctree)/.config -o -d $(srctree)/include/config ]; then \
- echo " $(srctree) is not clean, please run 'make mrproper'";\
+ echo " $(srctree) is not clean, please run 'make mrproper'"; \
echo " in the '$(srctree)' directory.";\
/bin/false; \
fi;
include/config/auto.conf
$(cmd_crmodverdir)
-archprepare: archheaders prepare1 scripts_basic
+archprepare: archheaders archscripts prepare1 scripts_basic
prepare0: archprepare FORCE
$(Q)$(MAKE) $(build)=.
endef
define filechk_version.h
- (echo \#define LINUX_VERSION_CODE $(shell \
- expr $(VERSION) \* 65536 + 0$(PATCHLEVEL) \* 256 + 0$(SUBLEVEL)); \
+ (echo \#define LINUX_VERSION_CODE $(shell \
+ expr $(VERSION) \* 65536 + 0$(PATCHLEVEL) \* 256 + 0$(SUBLEVEL)); \
echo '#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))';)
endef
PHONY += archheaders
archheaders:
+PHONY += archscripts
+archscripts:
+
PHONY += __headers
-__headers: include/linux/version.h scripts_basic asm-generic archheaders FORCE
+__headers: include/linux/version.h scripts_basic asm-generic archheaders archscripts FORCE
$(Q)$(MAKE) $(build)=scripts build_unifdef
PHONY += headers_install_all
# Directories & files removed with 'make clean'
CLEAN_DIRS += $(MODVERDIR)
- CLEAN_FILES += vmlinux System.map \
- .tmp_kallsyms* .tmp_version .tmp_vmlinux* .tmp_System.map
# Directories & files removed with 'make mrproper'
MRPROPER_DIRS += include/config usr/include include/generated \
endif # KBUILD_EXTMOD
clean: $(clean-dirs)
+ $(Q)$(CONFIG_SHELL) $(srctree)/scripts/link-vmlinux.sh clean
$(call cmd,rmdirs)
$(call cmd,rmfiles)
@find $(if $(KBUILD_EXTMOD), $(KBUILD_EXTMOD), .) $(RCS_FIND_IGNORE) \
kernelversion:
@echo $(KERNELVERSION)
+# Clear a bunch of variables before executing the submake
+tools/: FORCE
+ $(Q)$(MAKE) LDFLAGS= MAKEFLAGS= -C $(src)/tools/
+
+tools/%: FORCE
+ $(Q)$(MAKE) LDFLAGS= MAKEFLAGS= -C $(src)/tools/ $*
+
# Single targets
# ---------------------------------------------------------------------------
# Single targets are compatible with:
cmd_crmodverdir = $(Q)mkdir -p $(MODVERDIR) \
$(if $(KBUILD_MODULES),; rm -f $(MODVERDIR)/*)
- a_flags = -Wp,-MD,$(depfile) $(KBUILD_AFLAGS) $(AFLAGS_KERNEL) \
- $(KBUILD_AFLAGS_KERNEL) \
- $(NOSTDINC_FLAGS) $(LINUXINCLUDE) $(KBUILD_CPPFLAGS) \
- $(modkern_aflags) $(EXTRA_AFLAGS) $(AFLAGS_$(basetarget).o)
-
- quiet_cmd_as_o_S = AS $@
- cmd_as_o_S = $(CC) $(a_flags) -c -o $@ $<
-
# read all saved command lines
targets := $(wildcard $(sort $(targets)))
--- /dev/null
+ #!/bin/sh
+ #
+ # link vmlinux
+ #
+ # vmlinux is linked from the objects selected by $(KBUILD_VMLINUX_INIT) and
+ # $(KBUILD_VMLINUX_MAIN). Most are built-in.o files from top-level directories
+ # in the kernel tree, others are specified in arch/$(ARCH)/Makefile.
+ # Ordering when linking is important, and $(KBUILD_VMLINUX_INIT) must be first.
+ #
+ # vmlinux
+ # ^
+ # |
+ # +-< $(KBUILD_VMLINUX_INIT)
+ # | +--< init/version.o + more
+ # |
+ # +--< $(KBUILD_VMLINUX_MAIN)
+ # | +--< drivers/built-in.o mm/built-in.o + more
+ # |
+ # +-< ${kallsymso} (see description in KALLSYMS section)
+ #
+ # vmlinux version (uname -v) cannot be updated during normal
+ # descending-into-subdirs phase since we do not yet know if we need to
+ # update vmlinux.
+ # Therefore this step is delayed until just before final link of vmlinux.
+ #
+ # System.map is generated to document addresses of all kernel symbols
+
+ # Error out on error
+ set -e
+
+ # Nice output in kbuild format
+ # Will be supressed by "make -s"
+ info()
+ {
+ if [ "${quiet}" != "silent_" ]; then
+ printf " %-7s %s\n" ${1} ${2}
+ fi
+ }
+
+ # Link of vmlinux.o used for section mismatch analysis
+ # ${1} output file
+ modpost_link()
+ {
+ ${LD} ${LDFLAGS} -r -o ${1} ${KBUILD_VMLINUX_INIT} \
+ --start-group ${KBUILD_VMLINUX_MAIN} --end-group
+ }
+
+ # Link of vmlinux
+ # ${1} - optional extra .o files
+ # ${2} - output file
+ vmlinux_link()
+ {
+ local lds="${objtree}/${KBUILD_LDS}"
+
+ if [ "${SRCARCH}" != "um" ]; then
+ ${LD} ${LDFLAGS} ${LDFLAGS_vmlinux} -o ${2} \
+ -T ${lds} ${KBUILD_VMLINUX_INIT} \
+ --start-group ${KBUILD_VMLINUX_MAIN} --end-group ${1}
+ else
+ ${CC} ${CFLAGS_vmlinux} -o ${2} \
+ -Wl,-T,${lds} ${KBUILD_VMLINUX_INIT} \
+ -Wl,--start-group \
+ ${KBUILD_VMLINUX_MAIN} \
+ -Wl,--end-group \
+ -lutil ${1}
+ rm -f linux
+ fi
+ }
+
+
+ # Create ${2} .o file with all symbols from the ${1} object file
+ kallsyms()
+ {
+ info KSYM ${2}
+ local kallsymopt;
+
+ if [ -n "${CONFIG_KALLSYMS_ALL}" ]; then
+ kallsymopt=--all-symbols
+ fi
+
+ local aflags="${KBUILD_AFLAGS} ${KBUILD_AFLAGS_KERNEL} \
+ ${NOSTDINC_FLAGS} ${LINUXINCLUDE} ${KBUILD_CPPFLAGS}"
+
+ ${NM} -n ${1} | \
+ scripts/kallsyms ${kallsymopt} | \
+ ${CC} ${aflags} -c -o ${2} -x assembler-with-cpp -
+ }
+
+ # Create map file with all symbols from ${1}
+ # See mksymap for additional details
+ mksysmap()
+ {
+ ${CONFIG_SHELL} "${srctree}/scripts/mksysmap" ${1} ${2}
+ }
+
++sortextable()
++{
++ ${objtree}/scripts/sortextable ${1}
++}
++
+ # Delete output files in case of error
+ trap cleanup SIGHUP SIGINT SIGQUIT SIGTERM ERR
+ cleanup()
+ {
+ rm -f .old_version
+ rm -f .tmp_System.map
+ rm -f .tmp_kallsyms*
+ rm -f .tmp_version
+ rm -f .tmp_vmlinux*
+ rm -f System.map
+ rm -f vmlinux
+ rm -f vmlinux.o
+ }
+
+ #
+ #
+ # Use "make V=1" to debug this script
+ case "${KBUILD_VERBOSE}" in
+ *1*)
+ set -x
+ ;;
+ esac
+
+ if [ "$1" = "clean" ]; then
+ cleanup
+ exit 0
+ fi
+
+ # We need access to CONFIG_ symbols
+ . ./.config
+
+ #link vmlinux.o
+ info LD vmlinux.o
+ modpost_link vmlinux.o
+
+ # modpost vmlinux.o to check for section mismatches
+ ${MAKE} -f "${srctree}/scripts/Makefile.modpost" vmlinux.o
+
+ # Update version
+ info GEN .version
+ if [ ! -r .version ]; then
+ rm -f .version;
+ echo 1 >.version;
+ else
+ mv .version .old_version;
+ expr 0$(cat .old_version) + 1 >.version;
+ fi;
+
+ # final build of init/
+ ${MAKE} -f "${srctree}/scripts/Makefile.build" obj=init
+
+ kallsymso=""
+ kallsyms_vmlinux=""
+ if [ -n "${CONFIG_KALLSYMS}" ]; then
+
+ # kallsyms support
+ # Generate section listing all symbols and add it into vmlinux
+ # It's a three step process:
+ # 1) Link .tmp_vmlinux1 so it has all symbols and sections,
+ # but __kallsyms is empty.
+ # Running kallsyms on that gives us .tmp_kallsyms1.o with
+ # the right size
+ # 2) Link .tmp_vmlinux2 so it now has a __kallsyms section of
+ # the right size, but due to the added section, some
+ # addresses have shifted.
+ # From here, we generate a correct .tmp_kallsyms2.o
+ # 2a) We may use an extra pass as this has been necessary to
+ # woraround some alignment related bugs.
+ # KALLSYMS_EXTRA_PASS=1 is used to trigger this.
+ # 3) The correct ${kallsymso} is linked into the final vmlinux.
+ #
+ # a) Verify that the System.map from vmlinux matches the map from
+ # ${kallsymso}.
+
+ kallsymso=.tmp_kallsyms2.o
+ kallsyms_vmlinux=.tmp_vmlinux2
+
+ # step 1
+ vmlinux_link "" .tmp_vmlinux1
+ kallsyms .tmp_vmlinux1 .tmp_kallsyms1.o
+
+ # step 2
+ vmlinux_link .tmp_kallsyms1.o .tmp_vmlinux2
+ kallsyms .tmp_vmlinux2 .tmp_kallsyms2.o
+
+ # step 2a
+ if [ -n "${KALLSYMS_EXTRA_PASS}" ]; then
+ kallsymso=.tmp_kallsyms3.o
+ kallsyms_vmlinux=.tmp_vmlinux3
+
+ vmlinux_link .tmp_kallsyms2.o .tmp_vmlinux3
+
+ kallsyms .tmp_vmlinux3 .tmp_kallsyms3.o
+ fi
+ fi
+
+ info LD vmlinux
+ vmlinux_link "${kallsymso}" vmlinux
+
++if [ -n "${CONFIG_BUILDTIME_EXTABLE_SORT}" ]; then
++ info SORTEX vmlinux
++ sortextable vmlinux
++fi
++
+ info SYSMAP System.map
+ mksysmap vmlinux System.map
+
+ # step a (see comment above)
+ if [ -n "${CONFIG_KALLSYMS}" ]; then
+ mksysmap ${kallsyms_vmlinux} .tmp_System.map
+
+ if ! cmp -s System.map .tmp_System.map; then
+ echo Inconsistent kallsyms data
+ echo echo Try "make KALLSYMS_EXTRA_PASS=1" as a workaround
+ cleanup
+ exit 1
+ fi
+ fi
+
+ # We made a new kernel - delete old version file
+ rm -f .old_version