Commit edeee89c authored by Alexandre Julliard's avatar Alexandre Julliard

Create separate makefiles for tests for more flexibility.

parent 63d29eb7
......@@ -20,8 +20,6 @@
# SUBDIRS : subdirectories that contain a Makefile
# EXTRASUBDIRS : subdirectories that do not contain a Makefile
# INSTALLSUBDIRS : subdirectories to run make install/uninstall into
# PLTESTS : Perl test scripts
# CTESTS : C test sources
# First some useful definitions
......@@ -70,6 +68,7 @@ ALLLINTFLAGS = $(LINTFLAGS) $(DEFS) $(OPTIONS) $(DIVINCL)
MKINSTALLDIRS= $(TOPSRCDIR)/tools/mkinstalldirs
WINAPI_CHECK = $(TOPSRCDIR)/tools/winapi_check/winapi_check
WINEWRAPPER = $(TOPSRCDIR)/tools/winewrapper
RUNTEST = $(TOPSRCDIR)/programs/winetest/runtest
WINEBUILD = $(TOOLSDIR)/tools/winebuild/winebuild
MAKEDEP = $(TOOLSDIR)/tools/makedep
WRC = $(TOOLSDIR)/tools/wrc/wrc
......@@ -81,14 +80,6 @@ LIBTSX11 = -L$(TOPOBJDIR)/tsx11 -lwine_tsx11
LIBUNICODE= -L$(TOPOBJDIR)/unicode -lwine_unicode
LIBUUID = -L$(TOPOBJDIR)/ole -lwine_uuid
RUNTEST = $(TOPSRCDIR)/programs/winetest/runtest
RUNTESTFLAGS = -q -P wine -M $(MODULE) -T $(TOPOBJDIR)
TESTRESULTS = $(PLTESTS:.pl=.ok) $(CTESTS:.c=.ok)
TESTPROGRAM = tests/$(MODULE:%.dll=%)_test.exe
TESTLIST = tests/testlist.c
TESTOBJS = $(TESTMAIN) $(TESTLIST:.c=.o) $(CTESTS:.c=.o)
TESTMAIN = $(TOPOBJDIR)/programs/winetest/wtmain.o
@SET_MAKE@
# Installation infos
......@@ -149,10 +140,10 @@ LINTS = $(C_SRCS:.c=.ln)
$(LINT) -c $(ALLLINTFLAGS) $< || ( $(RM) $@ && exit 1 )
.c.ok:
$(RUNTEST) $(RUNTESTFLAGS) -p $(TESTPROGRAM)$(DLLEXT) $< && touch $@
$(RUNTEST) $(RUNTESTFLAGS) $< && touch $@
.pl.ok:
$(RUNTEST) $(RUNTESTFLAGS) $(PLTESTPROGRAM:%=-p %) $< && touch $@
$(RUNTEST) $(RUNTESTFLAGS) $< && touch $@
# 'all' target first in case the enclosing Makefile didn't define any target
......@@ -226,7 +217,7 @@ $(SUBDIRS:%=%/__depend__): $(MAKEDEP) dummy
cd `dirname $@` && $(MAKE) depend
depend: $(MAKEDEP) $(SUBDIRS:%=%/__depend__)
$(MAKEDEP) $(DIVINCL) -C$(SRCDIR) $(C_SRCS) $(RC_SRCS) $(RC_SRCS16) $(MC_SRCS) $(EXTRA_SRCS) $(CTESTS)
$(MAKEDEP) $(DIVINCL) -C$(SRCDIR) $(C_SRCS) $(RC_SRCS) $(RC_SRCS16) $(MC_SRCS) $(EXTRA_SRCS)
.PHONY: depend $(SUBDIRS:%=%/__depend__)
......@@ -242,10 +233,9 @@ $(EXTRASUBDIRS:%=%/__clean__): dummy
-cd `dirname $@` && $(RM) $(CLEAN_FILES)
testclean:: $(SUBDIRS:%=%/__testclean__)
$(RM) $(TESTRESULTS)
clean:: $(SUBDIRS:%=%/__clean__) $(EXTRASUBDIRS:%=%/__clean__)
$(RM) $(CLEAN_FILES) $(GEN_C_SRCS) $(GEN_ASM_SRCS) $(RC_SRCS:.rc=.res) $(RC_SRCS16:.rc=.res) $(MC_SRCS:.mc=.mc.rc) $(TESTRESULTS) $(TESTLIST) $(TESTPROGRAM) $(PROGRAMS)
$(RM) $(CLEAN_FILES) $(GEN_C_SRCS) $(GEN_ASM_SRCS) $(RC_SRCS:.rc=.res) $(RC_SRCS16:.rc=.res) $(MC_SRCS:.mc=.mc.rc) $(PROGRAMS)
.PHONY: clean testclean $(SUBDIRS:%=%/__clean__) $(SUBDIRS:%=%/__testclean__) $(EXTRASUBDIRS:%=%/__clean__)
......@@ -263,33 +253,20 @@ uninstall:: $(INSTALLSUBDIRS:%=%/__uninstall__)
.PHONY: install uninstall $(INSTALLSUBDIRS:%=%/__install__) $(INSTALLSUBDIRS:%=%/__uninstall__)
# Rules for testing
# Rules for checking that no imports are missing
check test:: $(TESTRESULTS)
$(SUBDIRS:%=%/__checklink__): dummy
@cd `dirname $@` && $(MAKE) checklink
.PHONY: checklink $(SUBDIRS:%=%/__checklink__)
# Rules for testing
$(SUBDIRS:%=%/__test__): dummy
@cd `dirname $@` && $(MAKE) test
.PHONY: check test $(SUBDIRS:%=%/__test__)
$(PLTESTS:.pl=.ok): $(PLTESTPROGRAM)
$(CTESTS:.c=.ok): $(TESTPROGRAM)$(DLLEXT)
$(TESTMAIN):
cd $(TOPOBJDIR)/programs/winetest && $(MAKE) wtmain.o
$(TESTLIST): Makefile.in
$(TOPSRCDIR)/programs/winetest/make_ctests $(CTESTS) >$(TESTLIST) || $(RM) $(TESTLIST)
$(TESTPROGRAM).so: $(TESTPROGRAM).spec.o $(TESTOBJS)
$(LDSHARED) @LDDLLFLAGS@ $(TESTPROGRAM).spec.o $(TESTOBJS) -o $@ $(LIBWINE) $(LIBS)
$(TESTPROGRAM).spec.c: $(TESTOBJS) $(WINEBUILD)
$(LDPATH) $(WINEBUILD) $(DEFS) -o $@ -exe $(TESTPROGRAM) -mcui $(TESTOBJS) -L$(DLLDIR) $(TESTIMPORTS:%=-l%)
$(TESTPROGRAM): $(TESTOBJS)
$(CC) $(TESTOBJS) -o $@ $(TESTIMPORTS:%=-l%) $(LIBWINE) $(LIBS)
# Misc. rules
$(SPEC_SRCS:.spec=.spec.c): $(WINEBUILD)
......
......@@ -128,13 +128,9 @@ unicode/__install__: unicode
# Test rules
checklink::
checklink:: $(TESTSUBDIRS:%=%/__checklink__)
$(CC) -o checklink $(TOPSRCDIR)/library/checklink.c && $(RM) checklink
checklink::
@cd dlls && $(MAKE) checklink
@cd programs && $(MAKE) checklink
test_environment: dummy
@cd programs/winetest && $(MAKE) test_environment
......@@ -142,7 +138,7 @@ $(TESTSUBDIRS:%=%/__test__): test_environment
check test:: $(TESTSUBDIRS:%=%/__test__)
.PHONY: checklink test_environment
.PHONY: test_environment
# Misc rules
......
......@@ -1271,7 +1271,6 @@ dnl **** Generate output files ****
AH_TOP([#define __WINE_CONFIG_H])
WINE_CONFIG_EXTRA_DIR(controls)
WINE_CONFIG_EXTRA_DIR(dlls/advapi32/tests)
WINE_CONFIG_EXTRA_DIR(dlls/ddraw/d3ddevice)
WINE_CONFIG_EXTRA_DIR(dlls/ddraw/dclipper)
WINE_CONFIG_EXTRA_DIR(dlls/ddraw/ddraw)
......@@ -1285,15 +1284,9 @@ WINE_CONFIG_EXTRA_DIR(dlls/gdi/enhmfdrv)
WINE_CONFIG_EXTRA_DIR(dlls/gdi/mfdrv)
WINE_CONFIG_EXTRA_DIR(dlls/gdi/win16drv)
WINE_CONFIG_EXTRA_DIR(dlls/kernel/messages)
WINE_CONFIG_EXTRA_DIR(dlls/kernel/tests)
WINE_CONFIG_EXTRA_DIR(dlls/oleaut32/tests)
WINE_CONFIG_EXTRA_DIR(dlls/shlwapi/tests)
WINE_CONFIG_EXTRA_DIR(dlls/user/dde)
WINE_CONFIG_EXTRA_DIR(dlls/user/resources)
WINE_CONFIG_EXTRA_DIR(dlls/user/tests)
WINE_CONFIG_EXTRA_DIR(dlls/wineps/data)
WINE_CONFIG_EXTRA_DIR(dlls/wininet/tests)
WINE_CONFIG_EXTRA_DIR(dlls/winsock/tests)
WINE_CONFIG_EXTRA_DIR(files)
WINE_CONFIG_EXTRA_DIR(graphics)
WINE_CONFIG_EXTRA_DIR(graphics/x11drv)
......@@ -1319,17 +1312,22 @@ AC_SUBST_FILE(MAKE_RULES)
MAKE_DLL_RULES=dlls/Makedll.rules
AC_SUBST_FILE(MAKE_DLL_RULES)
MAKE_TEST_RULES=dlls/Maketest.rules
AC_SUBST_FILE(MAKE_TEST_RULES)
MAKE_PROG_RULES=programs/Makeprog.rules
AC_SUBST_FILE(MAKE_PROG_RULES)
AC_CONFIG_FILES([
Make.rules
dlls/Makedll.rules
dlls/Maketest.rules
programs/Makeprog.rules
Makefile
debugger/Makefile
dlls/Makefile
dlls/advapi32/Makefile
dlls/advapi32/tests/Makefile
dlls/avicap32/Makefile
dlls/avifil32/Makefile
dlls/comcat/Makefile
......@@ -1352,6 +1350,7 @@ dlls/icmp/Makefile
dlls/imagehlp/Makefile
dlls/imm32/Makefile
dlls/kernel/Makefile
dlls/kernel/tests/Makefile
dlls/lzexpand/Makefile
dlls/mapi32/Makefile
dlls/mpr/Makefile
......@@ -1373,6 +1372,7 @@ dlls/ntdll/Makefile
dlls/odbc32/Makefile
dlls/ole32/Makefile
dlls/oleaut32/Makefile
dlls/oleaut32/tests/Makefile
dlls/olecli/Makefile
dlls/oledlg/Makefile
dlls/olepro32/Makefile
......@@ -1390,6 +1390,7 @@ dlls/shdocvw/Makefile
dlls/shell32/Makefile
dlls/shfolder/Makefile
dlls/shlwapi/Makefile
dlls/shlwapi/tests/Makefile
dlls/snmpapi/Makefile
dlls/sti/Makefile
dlls/tapi32/Makefile
......@@ -1398,12 +1399,14 @@ dlls/twain/Makefile
dlls/url/Makefile
dlls/urlmon/Makefile
dlls/user/Makefile
dlls/user/tests/Makefile
dlls/version/Makefile
dlls/win32s/Makefile
dlls/winaspi/Makefile
dlls/winedos/Makefile
dlls/wineps/Makefile
dlls/wininet/Makefile
dlls/wininet/tests/Makefile
dlls/winmm/Makefile
dlls/winmm/joystick/Makefile
dlls/winmm/mcianim/Makefile
......@@ -1420,6 +1423,7 @@ dlls/winmm/winenas/Makefile
dlls/winmm/wineoss/Makefile
dlls/winnls/Makefile
dlls/winsock/Makefile
dlls/winsock/tests/Makefile
dlls/winspool/Makefile
dlls/wintrust/Makefile
dlls/wow32/Makefile
......
Makedll.rules
Makefile
Maketest.rules
......@@ -16,7 +16,6 @@ MAINSPEC = $(MODULE:%.dll=%).spec
SPEC_DEF = $(MAINSPEC).def
ALL_OBJS = $(SPEC_SRCS:.spec=.spec.o) $(OBJS) $(MODULE).dbg.o
ALL_LIBS = $(LIBWINE) $(EXTRALIBS) $(LIBS)
TESTIMPORTS = $(MODULE:%.dll=%) $(DELAYIMPORTS) $(IMPORTS)
all: $(MODULE)$(DLLEXT)
......@@ -45,11 +44,13 @@ $(SPEC_DEF): $(WINEBUILD)
CHECKLINK_RPATH = dlls library tsx11 unicode
checklink:: $(MODULE)$(DLLEXT)
checklink:: $(MODULE)$(DLLEXT) $(SUBDIRS:%=%/__checklink__)
$(CC) -o checklink $(CHECKLINK_RPATH:%=-Wl,-rpath,$(TOPOBJDIR)/%) $(TOPSRCDIR)/library/checklink.c $(MODULE)$(DLLEXT) && $(RM) checklink
# Rules for testing
check test:: $(SUBDIRS:%=%/__test__)
$(TESTRESULTS): $(MODULE)$(DLLEXT)
# Sanity check
......
......@@ -905,9 +905,6 @@ install::
# Misc rules
$(BUILDSUBDIRS:%=%/__checklink__): dummy
@cd `dirname $@` && $(MAKE) checklink
uninstall::
-rmdir $(dlldir)
......@@ -915,6 +912,4 @@ check test:: $(BUILDSUBDIRS:%=%/__test__)
checklink:: $(BUILDSUBDIRS:%=%/__checklink__)
.PHONY: checklink $(BUILDSUBDIRS:%=%/__checklink__)
### Dependencies:
# Global rules for building dll unit tests -*-Makefile-*-
#
# Each individual makefile should define the following variables:
# DLLTEST : the dll to test
# CTESTS : list of C test programs
# EXTRALIBS : extra libraries to link in (optional)
# EXTRADEFS : extra symbol definitions, like -DWINELIB (optional)
#
# plus all variables required by the global Make.rules.in
#
DEFS = @DLLFLAGS@ -D__WINE__ $(EXTRADEFS)
LDDLLFLAGS = @LDDLLFLAGS@
MODULE = $(TESTDLL:%.dll=%)_test.exe
TESTLIST = testlist.c
TESTMAIN = $(TOPOBJDIR)/programs/winetest/wtmain.o
TESTRESULTS = $(CTESTS:.c=.ok)
TESTPROGRAM = $(MODULE)$(DLLEXT)
RUNTESTFLAGS = -q -P wine -M $(TESTDLL) -T $(TOPOBJDIR) -p $(TESTPROGRAM)
C_SRCS = $(CTESTS)
GEN_C_SRCS = $(TESTLIST)
EXTRA_OBJS = $(TESTMAIN)
ALL_LIBS = $(LIBWINE) $(EXTRALIBS) $(LIBS)
@MAKE_RULES@
# Rule for main module spec file
$(MODULE).spec.c: $(RC_SRCS:.rc=.res) $(OBJS) $(WINEBUILD)
$(LDPATH) $(WINEBUILD) $(DEFS) -o $@ -exe $(MODULE) -mcui $(RC_SRCS:%.rc=-res %.res) $(OBJS) -L$(DLLDIR) $(DELAYIMPORTS:%=-dl%) $(IMPORTS:%=-l%)
# Rules for .so main module
$(MODULE).so: $(MODULE).spec.o $(OBJS) Makefile.in
$(LDSHARED) $(LDDLLFLAGS) $(MODULE).spec.o $(OBJS) -o $@ $(ALL_LIBS)
# Rules for .exe main module
$(MODULE): $(OBJS) $(RCOBJS) Makefile.in
$(CC) $(OBJS) $(RCOBJS) -o $@ $(DELAYIMPORTS:%=-l%) $(IMPORTS:%=-l%) $(ALL_LIBS)
# Rules for building test list
$(TESTLIST): Makefile.in
$(TOPSRCDIR)/programs/winetest/make_ctests $(CTESTS) >$(TESTLIST) || $(RM) $(TESTLIST)
# Rules for checking that no imports are missing
CHECKLINK_RPATH = library tsx11 unicode
checklink:: $(MODULE).so $(SUBDIRS:%=%/__checklink__)
$(CC) -o checklink $(CHECKLINK_RPATH:%=-Wl,-rpath,$(TOPOBJDIR)/%) $(TOPSRCDIR)/library/checklink.c $(MODULE).so && $(RM) checklink
# Rules for testing
check test:: $(TESTRESULTS) $(SUBDIRS:%=%/__test__)
$(TESTRESULTS): $(MODULE)$(DLLEXT)
$(TESTMAIN):
cd $(TOPOBJDIR)/programs/winetest && $(MAKE) wtmain.o
# Rules for cleaning
testclean::
$(RM) $(TESTRESULTS)
clean::
$(RM) $(MODULE) $(TESTLIST) $(TESTRESULTS)
......@@ -17,10 +17,7 @@ C_SRCS = \
security.c \
service.c
CTESTS = \
tests/registry.c
EXTRASUBDIRS = tests
SUBDIRS = tests
@MAKE_DLL_RULES@
......
Makefile
advapi32_test.exe.spec.c
registry.ok
testlist.c
TOPSRCDIR = @top_srcdir@
TOPOBJDIR = ../../..
SRCDIR = @srcdir@
VPATH = @srcdir@
TESTDLL = advapi32.dll
IMPORTS = advapi32 kernel32 ntdll
CTESTS = \
registry.c
@MAKE_TEST_RULES@
### Dependencies:
......@@ -35,20 +35,8 @@ MC_SRCS = \
EXTRA_OBJS = $(MODULE).glue.o
EXTRASUBDIRS = \
messages \
nls \
tests
CTESTS = \
tests/alloc.c \
tests/atom.c \
tests/directory.c \
tests/file.c \
tests/locale.c \
tests/path.c \
tests/process.c \
tests/thread.c
SUBDIRS = tests
EXTRASUBDIRS = messages nls
@MAKE_DLL_RULES@
......
Makefile
alloc.ok
atom.ok
directory.ok
......
TOPSRCDIR = @top_srcdir@
TOPOBJDIR = ../../..
SRCDIR = @srcdir@
VPATH = @srcdir@
TESTDLL = kernel32.dll
IMPORTS = kernel32
CTESTS = \
alloc.c \
atom.c \
directory.c \
file.c \
locale.c \
path.c \
process.c \
thread.c
@MAKE_TEST_RULES@
### Dependencies:
......@@ -42,6 +42,8 @@ foreach my $i (split(/\s/,$makefiles))
{
my $module;
next if $i =~ /\/tests\/Makefile.in/;
open MAKE,$i;
$module = undef;
......@@ -283,9 +285,6 @@ print NEWMAKE "\tfi\n\n";
print NEWMAKE <<EOF;
# Misc rules
\$(BUILDSUBDIRS:%=%/__checklink__): dummy
\@cd `dirname \$\@` && \$(MAKE) checklink
uninstall::
-rmdir \$(dlldir)
......@@ -293,8 +292,6 @@ check test:: \$(BUILDSUBDIRS:%=%/__test__)
checklink:: \$(BUILDSUBDIRS:%=%/__checklink__)
.PHONY: checklink \$(BUILDSUBDIRS:%=%/__checklink__)
### Dependencies:
EOF
......
......@@ -28,11 +28,8 @@ C_SRCS = \
RC_SRCS = version.rc
CTESTS = tests/vartest.c
EXTRASUBDIRS = tests
SUBDIRS = tests
@MAKE_DLL_RULES@
### Dependencies:
Makefile
oleaut32_test.exe.spec.c
testlist.c
vartest.ok
TOPSRCDIR = @top_srcdir@
TOPOBJDIR = ../../..
SRCDIR = @srcdir@
VPATH = @srcdir@
TESTDLL = oleaut32.dll
IMPORTS = oleaut32
CTESTS = \
vartest.c
@MAKE_TEST_RULES@
### Dependencies:
......@@ -24,11 +24,7 @@ C_SRCS = \
url.c \
wsprintf.c
EXTRASUBDIRS = tests
CTESTS = \
tests/clist.c \
tests/shreg.c
SUBDIRS = tests
@MAKE_DLL_RULES@
......
Makefile
clist.ok
shlwapi_test.exe.spec.c
shreg.ok
......
TOPSRCDIR = @top_srcdir@
TOPOBJDIR = ../../..
SRCDIR = @srcdir@
VPATH = @srcdir@
TESTDLL = shlwapi.dll
IMPORTS = shlwapi advapi32
CTESTS = \
clist.c \
shreg.c
@MAKE_TEST_RULES@
### Dependencies:
......@@ -82,19 +82,15 @@ RC_SRCS16 = \
resources/mouse.rc \
resources/version16.rc
SUBDIRS = tests
EXTRA_OBJS = $(MODULE).glue.o
EXTRASUBDIRS = \
$(TOPOBJDIR)/controls \
$(TOPOBJDIR)/windows \
dde \
resources \
tests
CTESTS = \
tests/class.c \
tests/sysparams.c \
tests/wsprintf.c
resources
@MAKE_DLL_RULES@
......
Makefile
class.ok
sysparams.ok
testlist.c
......
TOPSRCDIR = @top_srcdir@
TOPOBJDIR = ../../..
SRCDIR = @srcdir@
VPATH = @srcdir@
TESTDLL = user32.dll
IMPORTS = user32 gdi32 advapi32
CTESTS = \
class.c \
sysparams.c \
wsprintf.c
@MAKE_TEST_RULES@
### Dependencies:
......@@ -17,13 +17,9 @@ C_SRCS = \
utility.c \
wininet_main.c
RC_SRCS= \
version.rc
RC_SRCS = version.rc
CTESTS = \
tests/http.c
EXTRASUBDIRS = tests
SUBDIRS = tests
@MAKE_DLL_RULES@
......
Makefile
http.ok
testlist.c
wininet_test.exe.spec.c
TOPSRCDIR = @top_srcdir@
TOPOBJDIR = ../../..
SRCDIR = @srcdir@
VPATH = @srcdir@
TESTDLL = wininet.dll
IMPORTS = wininet
CTESTS = \
http.c
@MAKE_TEST_RULES@
### Dependencies:
......@@ -14,10 +14,7 @@ C_SRCS = \
async.c \
socket.c
CTESTS = \
tests/sock.c
EXTRASUBDIRS = tests
SUBDIRS = tests
@MAKE_DLL_RULES@
......
Makefile
sock.ok
testlist.c
ws2_32_test.exe.spec.c
TOPSRCDIR = @top_srcdir@
TOPOBJDIR = ../../..
SRCDIR = @srcdir@
VPATH = @srcdir@
TESTDLL = ws2_32.dll
IMPORTS = ws2_32
CTESTS = \
sock.c
@MAKE_TEST_RULES@
### Dependencies:
......@@ -92,9 +92,6 @@ clean::
# Rules for testing
$(SUBDIRS:%=%/__checklink__): dummy
@cd `dirname $@` && $(MAKE) checklink
checklink:: $(SUBDIRS:%=%/__checklink__)
check test:: $(SUBDIRS:%=%/__test__)
......
......@@ -15,6 +15,7 @@ ALL_OBJS = $(OBJS) $(MODULE).dbg.o
ALL_LIBS = $(LIBWINE) $(EXTRALIBS) $(LIBS)
BASEMODULE = $(MODULE:.exe=)
TESTIMPORTS = $(DELAYIMPORTS) $(IMPORTS)
RUNTESTFLAGS= -q -P wine -T $(TOPOBJDIR) $(PLTESTPROGRAM:%=-p %)
@MAKE_RULES@
......@@ -42,12 +43,14 @@ $(MODULE): $(ALL_OBJS) $(RCOBJS) Makefile.in
CHECKLINK_RPATH = library tsx11 unicode
checklink:: $(MODULE).so
checklink:: $(MODULE).so $(SUBDIRS:%=%/__checklink__)
$(CC) -o checklink $(CHECKLINK_RPATH:%=-Wl,-rpath,$(TOPOBJDIR)/%) $(TOPSRCDIR)/library/checklink.c $(MODULE).so && $(RM) checklink
# Rules for testing
$(TESTRESULTS): $(MODULE)$(DLLEXT) $(BASEMODULE)$(EXEEXT)
check test:: $(SUBDIRS:%=%/__test__)
$(TESTRESULTS): $(MODULE)$(DLLEXT)
# Rules for installation
......
......@@ -26,7 +26,7 @@ print "/* Automatically generated file; DO NOT EDIT!! */\n\n";
my @testlist = @ARGV;
foreach (@testlist)
{
s!.*/([^/]+)\.c$!$1!;
s!(.*/)*([^/]+)\.c$!$2!;
printf "extern void func_%s(void);\n", $_;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment