674baa3c4f
changes. MFC after: 2 weeks X-MFC-With: r361677
385 lines
14 KiB
Makefile
385 lines
14 KiB
Makefile
# Makefile.win for Win32 APR + APR-iconv + APR-util
|
|
#
|
|
# Targets are:
|
|
#
|
|
# buildall - compile everything
|
|
# checkall - run APR + APR-util regression tests
|
|
# install - compile everything
|
|
# clean - mop up everything
|
|
#
|
|
# You can override the build mechanism, choose only one;
|
|
#
|
|
# USEMAK=1 - compile from exported make files
|
|
# USEDSW=1 - compile from .dsw / .dsp VC6 projects
|
|
# USESLN=1 - compile from converted .sln / .vcproj VC7+ files
|
|
#
|
|
# Define ARCH to your desired preference (your PATH must point
|
|
# to the correct compiler tools!) Choose only one;
|
|
#
|
|
# ARCH="Win32 Release"
|
|
# ARCH="Win32 Debug"
|
|
# ARCH="Win32 Release9x"
|
|
# ARCH="Win32 Debug9x"
|
|
# ARCH="x64 Release"
|
|
# ARCH="x64 Debug"
|
|
#
|
|
# Provide the APR_PATH, API_PATH and APU_PATH entirely relative
|
|
# to one another! At this time, building the libraries themselves
|
|
# is only expected to work if the defaults (../apr, ../apr-iconv
|
|
# and ../apr-util) are used, or if they are built with USEMAK=1.
|
|
#
|
|
# APR_PATH=..\apr-1.3.0
|
|
# API_PATH=..\apr-iconv-1.3.0
|
|
# APU_PATH=..\apr-util-1.3.0
|
|
#
|
|
# Provide a DBD_LIST argument after configuring LIB and INCLUDE with
|
|
# the SDK paths of the corresponding client support libraries.
|
|
# ODBC is always built on Windows, so it does not get included in DBD_LIST
|
|
# Note that at this time, none of these are supported on win32, per say.
|
|
#
|
|
# DBD_LIST="sqlite3 pgsql oracle mysql freetds"
|
|
#
|
|
# Provide a DBM_LIST argument after configuring LIB and INCLUDE with
|
|
# the SDK paths of the corresponding database support libraries. Right
|
|
# now only db has been configured, gdbm and ndbm require additional study.
|
|
# Note that at this time, none of these are supported on win32, per say.
|
|
#
|
|
# DBM_LIST="db gdbm"
|
|
#
|
|
# Provide a CRYPTO_LIST argument after configuring LIB and INCLUDE with
|
|
# the SDK paths of the corresponding cryptographic support libraries.
|
|
#
|
|
# CRYPTO_LIST="nss openssl"
|
|
#
|
|
# Provide the XML_PARSER argument after configuring LIB and INCLUDE with
|
|
# the expat path of the corresponding xml parser, e.g. libexpatMT to choose
|
|
# static, or libexpat (default) to choose the dynamic library for aprutil-1.dll
|
|
# (Static libaprutil-1.lib always presumes libexpatMT with XML_STATIC flag.)
|
|
#
|
|
# XML_PARSER="libexpat"
|
|
#
|
|
# For example;
|
|
#
|
|
# nmake -f Makefile.win PREFIX=C:\APR buildall checkall installall clean
|
|
#
|
|
|
|
!IF EXIST("aprutil.sln") && ([devenv /help > NUL 2>&1] == 0) \
|
|
&& !defined(USEMAK) && !defined(USEDSW)
|
|
USESLN=1
|
|
USEMAK=0
|
|
USEDSW=0
|
|
!ELSEIF EXIST("aprutil.mak") && !defined(USEDSW)
|
|
USESLN=0
|
|
USEMAK=1
|
|
USEDSW=0
|
|
!ELSE
|
|
USESLN=0
|
|
USEMAK=0
|
|
USEDSW=1
|
|
!ENDIF
|
|
|
|
PREFIX=..\apr-dist
|
|
|
|
!IF EXIST("..\openssl")
|
|
!IF EXIST("..\openssl\libcrypto.lib")
|
|
SSLOPT=_HAVE_OSSL110=1
|
|
!ENDIF
|
|
!ENDIF
|
|
|
|
# Legacy default (and unwise alternative) for libapr-1.dll is libexpatMT
|
|
XML_PARSER="libexpat"
|
|
!IF "$(XML_PARSER)" == "libexpat"
|
|
XMLOPT=XML_PARSER=$(XML_PARSER)
|
|
!ELSE
|
|
XMLOPT=XML_PARSER=$(XML_PARSER) XML_OPTIONS="/D XML_STATIC"
|
|
!ENDIF
|
|
|
|
!IF [$(COMSPEC) /c cl /nologo /? \
|
|
| $(SystemRoot)\System32\find.exe "x64" >NUL ] == 0
|
|
ARCH=x64 Release
|
|
!ELSE
|
|
ARCH=Win32 Release
|
|
!ENDIF
|
|
|
|
APR_PATH=..\apr
|
|
API_PATH=..\apr-iconv
|
|
APU_PATH=..\apr-util
|
|
|
|
!MESSAGE ARCH = $(ARCH)
|
|
!MESSAGE APR_PATH = $(APR_PATH)
|
|
!MESSAGE API_PATH = $(API_PATH) (apr-iconv)
|
|
!MESSAGE APU_PATH = $(APU_PATH) (apr-util)
|
|
!MESSAGE PREFIX = $(PREFIX) (install path)
|
|
!MESSAGE DBD_LIST = $(DBD_LIST)
|
|
!MESSAGE DBM_LIST = $(DBM_LIST)
|
|
!MESSAGE CRYPTO_LIST = $(CRYPTO_LIST)
|
|
|
|
# Utility and Translation things, nothing here for the user
|
|
#
|
|
!IF "$(ARCH)" == "Win32 Release"
|
|
SLNARCH=Release|Win32
|
|
ARCHPATH=Release
|
|
LIBSPATH=LibR
|
|
ARCHOSPATH=Release
|
|
LIBSOSPATH=LibR
|
|
!ELSEIF "$(ARCH)" == "Win32 Debug"
|
|
SLNARCH=Debug|Win32
|
|
ARCHPATH=Debug
|
|
LIBSPATH=LibD
|
|
ARCHOSPATH=Debug
|
|
LIBSOSPATH=LibD
|
|
!ELSEIF "$(ARCH)" == "Win32 Release9x"
|
|
SLNARCH=Release9x|Win32
|
|
ARCHPATH=Release
|
|
LIBSPATH=LibR
|
|
ARCHOSPATH=9x\Release
|
|
LIBSOSPATH=9x\LibR
|
|
!ELSEIF "$(ARCH)" == "Win32 Debug9x"
|
|
SLNARCH=Debug9x|Win32
|
|
ARCHPATH=Debug
|
|
LIBSPATH=LibD
|
|
ARCHOSPATH=9x\Debug
|
|
LIBSOSPATH=9x\LibD
|
|
!ELSEIF "$(ARCH)" == "x64 Release"
|
|
SLNARCH=Release|x64
|
|
ARCHPATH=x64\Release
|
|
LIBSPATH=x64\LibR
|
|
ARCHOSPATH=x64\Release
|
|
LIBSOSPATH=x64\LibR
|
|
!ELSEIF "$(ARCH)" == "x64 Debug"
|
|
SLNARCH=Debug|x64
|
|
ARCHPATH=x64\Debug
|
|
LIBSPATH=x64\LibD
|
|
ARCHOSPATH=x64\Debug
|
|
LIBSOSPATH=x64\LibD
|
|
!ENDIF
|
|
|
|
!IFNDEF MAKEOPT
|
|
# Only default the behavior if MAKEOPT= is omitted
|
|
!IFDEF _NMAKE_VER
|
|
# Microsoft NMake options
|
|
MAKEOPT=-nologo
|
|
!ELSEIF "$(MAKE)" == "make"
|
|
# Borland make options? Not really supported (yet)
|
|
MAKEOPT=-s -N
|
|
!ENDIF
|
|
!ENDIF
|
|
|
|
|
|
# Sanity Checks
|
|
#
|
|
!IF !EXIST("$(APR_PATH)\apr.dsp") || !EXIST("$(API_PATH)\apriconv.dsp") \
|
|
|| !EXIST("$(APU_PATH)\aprutil.dsp")
|
|
!MESSAGE Please check out or download and unpack the Apache Portability Runtime
|
|
!MESSAGE sources (apr, apr-iconv and apr-util) under a single parent dir,
|
|
!MESSAGE or provide APR_PATH, API_PATH and APU_PATH (all relative to each other,
|
|
!MESSAGE or all absolute paths).
|
|
!MESSAGE Apache cannot build without these libraries!
|
|
!MESSAGE
|
|
!ERROR Need apr and apr-iconv alongside apr-util to build!
|
|
!ENDIF
|
|
|
|
|
|
all: buildall checkall
|
|
|
|
# To help win32 pick up the locations where they don't fall in the usual
|
|
# path locations. This may not be completely effective for USESLN/USEDSP
|
|
# oriented builds, just yet
|
|
#
|
|
LIB=$(APR_PATH)\$(ARCHOSPATH);$(APR_PATH)\$(LIBSOSPATH);$(API_PATH)\$(ARCHPATH);$(API_PATH)\$(LIBSPATH);$(APU_PATH)\$(ARCHPATH);$(APU_PATH)\$(LIBSPATH);$(LIB)
|
|
INCLUDE=$(APR_PATH)\include;$(API_PATH)\include;$(INCLUDE)
|
|
|
|
!IF $(USEMAK) == 1
|
|
|
|
clean:
|
|
$(MAKE) $(MAKEOPT) -f Makefile.win ARCH="$(ARCH)" \
|
|
CTARGET=CLEAN buildall
|
|
|
|
buildall:
|
|
cd $(APR_PATH)
|
|
$(MAKE) $(MAKEOPT) -f apr.mak CFG="apr - $(ARCH)" RECURSE=0 $(CTARGET)
|
|
$(MAKE) $(MAKEOPT) -f libapr.mak CFG="libapr - $(ARCH)" RECURSE=0 $(CTARGET)
|
|
cd build
|
|
$(MAKE) $(MAKEOPT) -f aprapp.mak CFG="aprapp - $(ARCH)" RECURSE=0 $(CTARGET)
|
|
$(MAKE) $(MAKEOPT) -f libaprapp.mak CFG="libaprapp - $(ARCH)" RECURSE=0 $(CTARGET)
|
|
cd ..
|
|
cd $(API_PATH)
|
|
$(MAKE) $(MAKEOPT) -f apriconv.mak CFG="apriconv - $(ARCH)" RECURSE=0 $(CTARGET)
|
|
$(MAKE) $(MAKEOPT) -f libapriconv.mak CFG="libapriconv - $(ARCH)" RECURSE=0 $(CTARGET)
|
|
!IF "$(CTARGET)" == "CLEAN"
|
|
$(MAKE) $(MAKEOPT) -f build\modules.mk.win clean \
|
|
BUILD_MODE="$(ARCH)" BIND_MODE=shared API_SOURCE=.
|
|
!ELSE
|
|
cd ccs
|
|
$(MAKE) $(MAKEOPT) -f Makefile.win all \
|
|
BUILD_MODE="$(ARCH)" BIND_MODE=shared
|
|
cd ..\ces
|
|
$(MAKE) $(MAKEOPT) -f Makefile.win all \
|
|
BUILD_MODE="$(ARCH)" BIND_MODE=shared
|
|
cd ..
|
|
!ENDIF
|
|
cd $(APU_PATH)
|
|
$(MAKE) $(MAKEOPT) $(SSLOPT) $(XMLOPT) -f aprutil.mak CFG="aprutil - $(ARCH)" RECURSE=0 $(CTARGET)
|
|
$(MAKE) $(MAKEOPT) $(SSLOPT) $(XMLOPT) -f libaprutil.mak CFG="libaprutil - $(ARCH)" RECURSE=0 $(CTARGET)
|
|
cd ldap
|
|
$(MAKE) $(MAKEOPT) -f apr_ldap.mak CFG="apr_ldap - $(ARCH)" RECURSE=0 $(CTARGET)
|
|
cd ..
|
|
cd dbd
|
|
for %d in (odbc $(DBD_LIST)) do \
|
|
$(MAKE) $(MAKEOPT) -f apr_dbd_%d.mak CFG="apr_dbd_%d - $(ARCH)" RECURSE=0 $(CTARGET)
|
|
cd ..
|
|
cd dbm
|
|
for %d in ($(DBM_LIST) x) do if not %d == x \
|
|
$(MAKE) $(MAKEOPT) -f apr_dbm_%d.mak CFG="apr_dbm_%d - $(ARCH)" RECURSE=0 $(CTARGET)
|
|
cd ..
|
|
cd crypto
|
|
for %d in ($(CRYPTO_LIST) x) do if not %d == x \
|
|
$(MAKE) $(MAKEOPT) $(SSLOPT) -f apr_crypto_%d.mak CFG="apr_crypto_%d - $(ARCH)" RECURSE=0 $(CTARGET)
|
|
cd ..
|
|
|
|
!ELSEIF $(USESLN) == 1
|
|
|
|
clean:
|
|
-for %d in (odbc $(DBD_LIST)) do \
|
|
devenv aprutil.sln /useenv /clean "$(SLNARCH)" /project apr_dbd_%d
|
|
-for %d in ($(DBM_LIST) x) do if not %d == x \
|
|
devenv aprutil.sln /useenv /clean "$(SLNARCH)" /project apr_dbm_%d
|
|
-for %d in ($(CRYPTO_LIST) x) do if not %d == x \
|
|
devenv aprutil.sln /useenv /clean "$(SLNARCH)" /project apr_crypto_%d
|
|
-devenv aprutil.sln /useenv /clean "$(SLNARCH)" /project apr_ldap
|
|
-devenv aprutil.sln /useenv /clean "$(SLNARCH)" /project libaprutil
|
|
-devenv aprutil.sln /useenv /clean "$(SLNARCH)" /project aprutil
|
|
cd $(API_PATH)
|
|
-$(MAKE) $(MAKEOPT) -f build\modules.mk.win clean \
|
|
BUILD_MODE="$(ARCH)" BIND_MODE=shared API_SOURCE=.
|
|
cd $(APU_PATH)
|
|
-devenv aprutil.sln /useenv /clean "$(SLNARCH)" /project libapriconv
|
|
-devenv aprutil.sln /useenv /clean "$(SLNARCH)" /project apriconv
|
|
-devenv aprutil.sln /useenv /clean "$(SLNARCH)" /project libaprapp
|
|
-devenv aprutil.sln /useenv /clean "$(SLNARCH)" /project aprapp
|
|
-devenv aprutil.sln /useenv /clean "$(SLNARCH)" /project libapr
|
|
-devenv aprutil.sln /useenv /clean "$(SLNARCH)" /project apr
|
|
|
|
buildall:
|
|
devenv aprutil.sln /useenv /build "$(SLNARCH)" /project aprapp
|
|
devenv aprutil.sln /useenv /build "$(SLNARCH)" /project libaprapp
|
|
devenv aprutil.sln /useenv /build "$(SLNARCH)" /project aprutil
|
|
devenv aprutil.sln /useenv /build "$(SLNARCH)" /project libaprutil
|
|
devenv aprutil.sln /useenv /build "$(SLNARCH)" /project apr_ldap
|
|
for %d in (odbc $(DBD_LIST)) do \
|
|
devenv aprutil.sln /useenv /build "$(SLNARCH)" /project apr_dbd_%d
|
|
for %d in ($(DBM_LIST) x) do if not %d == x \
|
|
devenv aprutil.sln /useenv /build "$(SLNARCH)" /project apr_dbm_%d
|
|
for %d in ($(CRYPTO_LIST) x) do if not %d == x \
|
|
devenv aprutil.sln /useenv /build "$(SLNARCH)" /project apr_crypto_%d
|
|
|
|
!ELSE
|
|
# $(USEDSP) == 1
|
|
|
|
clean:
|
|
-for %d in (odbc $(DBD_LIST)) do \
|
|
msdev aprutil.dsw /USEENV /MAKE "apr_dbd_%d - $(ARCH)" /CLEAN
|
|
-for %d in ($(DBM_LIST) x) do if not %d == x \
|
|
msdev aprutil.dsw /USEENV /MAKE "apr_dbm_%d - $(ARCH)" /CLEAN
|
|
-for %d in ($(CRYPTO_LIST) x) do if not %d == x \
|
|
msdev aprutil.dsw /USEENV /MAKE "apr_crypto_%d - $(ARCH)" /CLEAN
|
|
-msdev aprutil.dsw /USEENV /MAKE "apr_ldap - $(ARCH)" /CLEAN
|
|
-msdev aprutil.dsw /USEENV /MAKE "libaprutil - $(ARCH)" /CLEAN
|
|
-msdev aprutil.dsw /USEENV /MAKE "aprutil - $(ARCH)" /CLEAN
|
|
cd $(API_PATH)
|
|
$(MAKE) $(MAKEOPT) -f build\modules.mk.win clean \
|
|
BUILD_MODE="$(ARCH)" BIND_MODE=shared API_SOURCE=.
|
|
cd $(APU_PATH)
|
|
-msdev aprutil.dsw /USEENV /MAKE "libapriconv - $(ARCH)" /CLEAN
|
|
-msdev aprutil.dsw /USEENV /MAKE "apriconv - $(ARCH)" /CLEAN
|
|
-msdev aprutil.dsw /USEENV /MAKE "libaprapp - $(ARCH)" /CLEAN
|
|
-msdev aprutil.dsw /USEENV /MAKE "aprapp - $(ARCH)" /CLEAN
|
|
-msdev aprutil.dsw /USEENV /MAKE "libapr - $(ARCH)" /CLEAN
|
|
-msdev aprutil.dsw /USEENV /MAKE "apr - $(ARCH)" /CLEAN
|
|
|
|
buildall:
|
|
@msdev aprutil.dsw /USEENV /MAKE "aprapp - $(ARCH)"
|
|
@msdev aprutil.dsw /USEENV /MAKE "aprutil - $(ARCH)"
|
|
@msdev aprutil.dsw /USEENV /MAKE "libaprapp - $(ARCH)"
|
|
@msdev aprutil.dsw /USEENV /MAKE "libaprutil - $(ARCH)"
|
|
@msdev aprutil.dsw /USEENV /MAKE "apr_ldap - $(ARCH)"
|
|
@for %d in (odbc $(DBD_LIST)) do \
|
|
msdev aprutil.dsw /USEENV /MAKE "apr_dbd_%d - $(ARCH)"
|
|
@for %d in ($(DBM_LIST) x) do if not %d == x \
|
|
msdev aprutil.dsw /USEENV /MAKE "apr_dbm_%d - $(ARCH)"
|
|
@for %d in ($(CRYPTO_LIST) x) do if not %d == x \
|
|
msdev aprutil.dsw /USEENV /MAKE "apr_crypto_%d - $(ARCH)"
|
|
|
|
!ENDIF
|
|
|
|
|
|
checkapr:
|
|
cd $(APR_PATH)\test
|
|
$(MAKE) $(MAKEOPT) -f Makefile.win MODEL=static \
|
|
OUTDIR=$(LIBSOSPATH) check
|
|
$(MAKE) $(MAKEOPT) -f Makefile.win MODEL=dynamic \
|
|
OUTDIR=$(ARCHOSPATH) check
|
|
cd ..
|
|
cd $(APU_PATH)
|
|
|
|
checkapu:
|
|
cd $(APU_PATH)
|
|
cd test
|
|
$(MAKE) $(MAKEOPT) -f Makefile.win MODEL=static \
|
|
OUTDIR=$(LIBSPATH) APROUTDIR=$(LIBSOSPATH) \
|
|
APR_PATH=..\$(APR_PATH) API_PATH=..\$(API_PATH) check
|
|
$(MAKE) $(MAKEOPT) -f Makefile.win MODEL=dynamic \
|
|
OUTDIR=$(ARCHPATH) APROUTDIR=$(ARCHOSPATH) \
|
|
APR_PATH=..\$(APR_PATH) API_PATH=..\$(API_PATH) check
|
|
cd ..
|
|
|
|
checkall: checkapr checkapu
|
|
|
|
|
|
install:
|
|
echo Y >.y
|
|
echo A >.A
|
|
@if NOT EXIST "$(PREFIX)\." mkdir "$(PREFIX)"
|
|
@if NOT EXIST "$(PREFIX)\bin\." mkdir "$(PREFIX)\bin"
|
|
@if NOT EXIST "$(PREFIX)\bin\iconv\." mkdir "$(PREFIX)\bin\iconv"
|
|
@if NOT EXIST "$(PREFIX)\include\." mkdir "$(PREFIX)\include"
|
|
@if NOT EXIST "$(PREFIX)\lib\." mkdir "$(PREFIX)\lib"
|
|
copy CHANGES "$(PREFIX)\CHANGES.txt" <.y
|
|
copy LICENSE "$(PREFIX)\LICENSE.txt" <.y
|
|
copy NOTICE "$(PREFIX)\NOTICE.txt" <.y
|
|
xcopy $(APR_PATH)\include\*.h "$(PREFIX)\include\" /d < .a
|
|
xcopy $(APU_PATH)\include\*.h "$(PREFIX)\include\" /d < .a
|
|
copy $(APR_PATH)\$(LIBSOSPATH)\apr-1.lib "$(PREFIX)\lib\" <.y
|
|
copy $(APR_PATH)\$(LIBSOSPATH)\apr-1.pdb "$(PREFIX)\lib\" <.y
|
|
copy $(APU_PATH)\$(LIBSPATH)\aprutil-1.lib "$(PREFIX)\lib\" <.y
|
|
copy $(APU_PATH)\$(LIBSPATH)\aprutil-1.pdb "$(PREFIX)\lib\" <.y
|
|
copy $(APR_PATH)\$(ARCHOSPATH)\libapr-1.lib "$(PREFIX)\lib\" <.y
|
|
copy $(APR_PATH)\$(ARCHOSPATH)\libapr-1.exp "$(PREFIX)\lib\" <.y
|
|
copy $(APU_PATH)\$(ARCHPATH)\libaprutil-1.lib "$(PREFIX)\lib\" <.y
|
|
copy $(APU_PATH)\$(ARCHPATH)\libaprutil-1.exp "$(PREFIX)\lib\" <.y
|
|
copy $(APR_PATH)\$(ARCHOSPATH)\libapr-1.dll "$(PREFIX)\bin\" <.y
|
|
copy $(APR_PATH)\$(ARCHOSPATH)\libapr-1.pdb "$(PREFIX)\bin\" <.y
|
|
copy $(API_PATH)\$(ARCHPATH)\libapriconv-1.dll "$(PREFIX)\bin\" <.y
|
|
copy $(API_PATH)\$(ARCHPATH)\libapriconv-1.pdb "$(PREFIX)\bin\" <.y
|
|
copy $(APU_PATH)\$(ARCHPATH)\libaprutil-1.dll "$(PREFIX)\bin\" <.y
|
|
copy $(APU_PATH)\$(ARCHPATH)\libaprutil-1.pdb "$(PREFIX)\bin\" <.y
|
|
copy $(APU_PATH)\ldap\$(ARCHPATH)\apr_ldap-1.dll "$(PREFIX)\bin\" <.y
|
|
copy $(APU_PATH)\ldap\$(ARCHPATH)\apr_ldap-1.pdb "$(PREFIX)\bin\" <.y
|
|
for %d in (odbc $(DBD_LIST)) do ( \
|
|
copy $(APU_PATH)\dbd\$(ARCHPATH)\apr_dbd_%d-1.dll "$(PREFIX)\bin\" <.y && \
|
|
copy $(APU_PATH)\dbd\$(ARCHPATH)\apr_dbd_%d-1.pdb "$(PREFIX)\bin\" <.y \
|
|
)
|
|
for %d in ($(DBM_LIST) x) do if not %d == x ( \
|
|
copy $(APU_PATH)\dbm\$(ARCHPATH)\apr_dbm_%d-1.dll "$(PREFIX)\bin\" <.y && \
|
|
copy $(APU_PATH)\dbm\$(ARCHPATH)\apr_dbm_%d-1.pdb "$(PREFIX)\bin\" <.y \
|
|
)
|
|
for %d in ($(CRYPTO_LIST) x) do if not %d == x ( \
|
|
copy $(APU_PATH)\crypto\$(ARCHPATH)\apr_crypto_%d-1.dll "$(PREFIX)\bin\" <.y && \
|
|
copy $(APU_PATH)\crypto\$(ARCHPATH)\apr_crypto_%d-1.pdb "$(PREFIX)\bin\" <.y \
|
|
)
|
|
xcopy $(API_PATH)\$(ARCHPATH)\iconv\*.so "$(PREFIX)\bin\iconv\" /d < .a
|
|
xcopy $(API_PATH)\$(ARCHPATH)\iconv\*.pdb "$(PREFIX)\bin\iconv\" /d < .a
|
|
del .y
|
|
del .a
|
|
|