summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
authorAndy Cedilnik <andy.cedilnik@kitware.com>2003-05-02 17:57:25 (GMT)
committerAndy Cedilnik <andy.cedilnik@kitware.com>2003-05-02 17:57:25 (GMT)
commitbec9b174f5f4460c08e6899f62ef6406de7a3a30 (patch)
tree18b893965d4cadc25417cc285997670f56a36725 /Modules
parentd6b9c96739b38be482105695af6bfc3f50782792 (diff)
downloadCMake-bec9b174f5f4460c08e6899f62ef6406de7a3a30.zip
CMake-bec9b174f5f4460c08e6899f62ef6406de7a3a30.tar.gz
CMake-bec9b174f5f4460c08e6899f62ef6406de7a3a30.tar.bz2
ENH: Fix some dart issues. Now it works fine without dart.
Diffstat (limited to 'Modules')
-rw-r--r--Modules/Dart.cmake219
-rw-r--r--Modules/DartConfiguration.tcl.in53
2 files changed, 181 insertions, 91 deletions
diff --git a/Modules/Dart.cmake b/Modules/Dart.cmake
index d829184..ebef537 100644
--- a/Modules/Dart.cmake
+++ b/Modules/Dart.cmake
@@ -13,7 +13,6 @@ OPTION(BUILD_TESTING "Build the testing tree." "On")
IF(BUILD_TESTING)
INCLUDE(${CMAKE_ROOT}/Modules/FindDart.cmake)
- IF (DART_ROOT)
#
# Section #1:
#
@@ -52,7 +51,8 @@ IF(BUILD_TESTING)
# make program just needs to use CMAKE_MAKE_PROGRAM which is required
# to be defined by cmake
SET(MAKEPROGRAM ${CMAKE_MAKE_PROGRAM})
- OPTION(DART_VERBOSE_BUILD "Show the actual output of the build, or if off show a . for each 1024 bytes." "OFF")
+ OPTION(DART_VERBOSE_BUILD "Show the actual output of the build, or if off show a . for each 1024 bytes."
+ OFF)
OPTION(DART_BUILD_ERROR_REPORT_LIMIT "Limit of reported errors, -1 reports all." -1 )
OPTION(DART_BUILD_WARNING_REPORT_LIMIT "Limit of reported warnings, -1 reports all." -1 )
@@ -66,7 +66,7 @@ IF(BUILD_TESTING)
SET(DART_TESTING_TIMEOUT 1500 CACHE STRING "Time alloted for a test before Dart will kill the test.")
FIND_PROGRAM(COMPRESSIONCOMMAND NAMES gzip compress zip
- DOC "Path to program used to compress files for transfer to the dart server")
+ DOC "Path to program used to compress files for transfer to the dart server")
FIND_PROGRAM(GUNZIPCOMMAND gunzip DOC "Path to gunzip executable")
FIND_PROGRAM(JAVACOMMAND java DOC "Path to java command, used by the Dart server to create html.")
FIND_PROGRAM(PURIFYCOMMAND purify
@@ -122,7 +122,7 @@ IF(BUILD_TESTING)
DART_TESTING_TIMEOUT
SCPCOMMAND
DELIVER_CONTINUOUS_EMAIL
- )
+ )
# BUILDNAME
#
@@ -131,100 +131,137 @@ IF(BUILD_TESTING)
# Make necessary directories and configure testing scripts
#
- # make directories in the binary tree
- MAKE_DIRECTORY(${PROJECT_BINARY_DIR}/Testing/HTML/TestingResults/Dashboard)
- MAKE_DIRECTORY(${PROJECT_BINARY_DIR}/Testing/HTML/TestingResults/Sites/${SITE}/${BUILDNAME})
+ IF (DART_ROOT)
+ # make directories in the binary tree
+ MAKE_DIRECTORY(${PROJECT_BINARY_DIR}/Testing/HTML/TestingResults/Dashboard)
+ MAKE_DIRECTORY(${PROJECT_BINARY_DIR}/Testing/HTML/TestingResults/Sites/${SITE}/${BUILDNAME})
- # configure files
- CONFIGURE_FILE(
- ${DART_ROOT}/Source/Client/Utility.conf.in
- ${PROJECT_BINARY_DIR}/DartConfiguration.tcl )
+ # configure files
+ CONFIGURE_FILE(
+ ${DART_ROOT}/Source/Client/Utility.conf.in
+ ${PROJECT_BINARY_DIR}/DartConfiguration.tcl )
- #
- # Section 3:
- #
- # Custom targets to perform dashboard builds and submissions.
- # These should NOT need to be modified from project to project.
- #
+ #
+ # Section 3:
+ #
+ # Custom targets to perform dashboard builds and submissions.
+ # These should NOT need to be modified from project to project.
+ #
+
+ # add testing targets
+ IF(TCL_TCLSH)
+ ADD_CUSTOM_TARGET(Experimental
+ ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Experimental Start Update Configure Build Test)
+ ADD_CUSTOM_TARGET(ExperimentalSubmit
+ ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Experimental Submit)
+
+ # for non IDE based builds nmake and make
+ # add all these extra targets
+ IF(${CMAKE_MAKE_PROGRAM} MATCHES make)
+ # Make targets for Experimental builds
+ ADD_CUSTOM_TARGET(ExperimentalStart
+ ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Experimental Start)
+ ADD_CUSTOM_TARGET(ExperimentalUpdate
+ ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Experimental Start Update)
+ ADD_CUSTOM_TARGET(ExperimentalConfigure
+ ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Experimental Start Configure)
+ ADD_CUSTOM_TARGET(ExperimentalBuild
+ ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Experimental Start Build)
+ ADD_CUSTOM_TARGET(ExperimentalTest
+ ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Experimental Test)
+ ADD_CUSTOM_TARGET(ExperimentalCoverage
+ ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Experimental Coverage)
+ ADD_CUSTOM_TARGET(ExperimentalDashboardStart
+ ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Experimental DashboardStart)
+ ADD_CUSTOM_TARGET(ExperimentalDashboardEnd
+ ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Experimental DashboardEnd)
- # add testing targets
- IF(TCL_TCLSH)
- ADD_CUSTOM_TARGET(Experimental
- ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Experimental Start Update Configure Build Test)
- ADD_CUSTOM_TARGET(ExperimentalSubmit
- ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Experimental Submit)
-
-# for non IDE based builds nmake and make
-# add all these extra targets
- IF(${CMAKE_MAKE_PROGRAM} MATCHES make)
- # Make targets for Experimental builds
- ADD_CUSTOM_TARGET(ExperimentalStart
- ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Experimental Start)
- ADD_CUSTOM_TARGET(ExperimentalUpdate
- ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Experimental Start Update)
- ADD_CUSTOM_TARGET(ExperimentalConfigure
- ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Experimental Start Configure)
- ADD_CUSTOM_TARGET(ExperimentalBuild
- ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Experimental Start Build)
- ADD_CUSTOM_TARGET(ExperimentalTest
- ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Experimental Test)
- ADD_CUSTOM_TARGET(ExperimentalCoverage
- ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Experimental Coverage)
- ADD_CUSTOM_TARGET(ExperimentalDashboardStart
- ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Experimental DashboardStart)
- ADD_CUSTOM_TARGET(ExperimentalDashboardEnd
- ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Experimental DashboardEnd)
-
- # Continuous
- ADD_CUSTOM_TARGET(Continuous
- ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Continuous Start Update Configure Build Test Submit)
- ADD_CUSTOM_TARGET(ContinuousStart
- ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Continuous Start)
- ADD_CUSTOM_TARGET(ContinuousUpdate
- ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Continuous Update)
- ADD_CUSTOM_TARGET(ContinuousConfigure
- ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Continuous Configure)
- ADD_CUSTOM_TARGET(ContinuousBuild
- ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Continuous Build)
- ADD_CUSTOM_TARGET(ContinuousTest
- ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Continuous Test)
- ADD_CUSTOM_TARGET(ContinuousCoverage
- ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Continuous Coverage)
- ADD_CUSTOM_TARGET(ContinuousSubmit
- ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Continuous Submit)
-
- # Nightly
- ADD_CUSTOM_TARGET(Nightly
- ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Nightly Start Update Configure Build Test Submit)
- ADD_CUSTOM_TARGET(NightlyStart
- ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Nightly Start)
- ADD_CUSTOM_TARGET(NightlyUpdate
- ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Nightly Update)
- ADD_CUSTOM_TARGET(NightlyConfigure
- ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Nightly Configure)
- ADD_CUSTOM_TARGET(NightlyBuild
- ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Nightly Build)
- ADD_CUSTOM_TARGET(NightlyTest
- ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Nightly Test)
- ADD_CUSTOM_TARGET(NightlyCoverage
- ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Nightly Coverage)
- ADD_CUSTOM_TARGET(NightlySubmit
- ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Nightly Submit)
- ADD_CUSTOM_TARGET(NightlyDashboardStart
- ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Nightly DashboardStart)
- ADD_CUSTOM_TARGET(NightlyDashboardEnd
- ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Nightly DashboardEnd)
- ENDIF (${CMAKE_MAKE_PROGRAM} MATCHES make)
-
- ELSE(TCL_TCLSH)
- MESSAGE("Could not find TCL_TCLSH, disabling testing." "Error")
- ENDIF(TCL_TCLSH)
- ENABLE_TESTING()
+ # Continuous
+ ADD_CUSTOM_TARGET(Continuous
+ ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Continuous Start Update Configure Build Test Submit)
+ ADD_CUSTOM_TARGET(ContinuousStart
+ ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Continuous Start)
+ ADD_CUSTOM_TARGET(ContinuousUpdate
+ ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Continuous Update)
+ ADD_CUSTOM_TARGET(ContinuousConfigure
+ ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Continuous Configure)
+ ADD_CUSTOM_TARGET(ContinuousBuild
+ ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Continuous Build)
+ ADD_CUSTOM_TARGET(ContinuousTest
+ ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Continuous Test)
+ ADD_CUSTOM_TARGET(ContinuousCoverage
+ ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Continuous Coverage)
+ ADD_CUSTOM_TARGET(ContinuousSubmit
+ ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Continuous Submit)
+ # Nightly
+ ADD_CUSTOM_TARGET(Nightly
+ ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Nightly Start Update Configure Build Test Submit)
+ ADD_CUSTOM_TARGET(NightlyStart
+ ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Nightly Start)
+ ADD_CUSTOM_TARGET(NightlyUpdate
+ ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Nightly Update)
+ ADD_CUSTOM_TARGET(NightlyConfigure
+ ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Nightly Configure)
+ ADD_CUSTOM_TARGET(NightlyBuild
+ ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Nightly Build)
+ ADD_CUSTOM_TARGET(NightlyTest
+ ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Nightly Test)
+ ADD_CUSTOM_TARGET(NightlyCoverage
+ ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Nightly Coverage)
+ ADD_CUSTOM_TARGET(NightlySubmit
+ ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Nightly Submit)
+ ADD_CUSTOM_TARGET(NightlyDashboardStart
+ ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Nightly DashboardStart)
+ ADD_CUSTOM_TARGET(NightlyDashboardEnd
+ ${TCL_TCLSH} ${DART_ROOT}/Source/Client/DashboardManager.tcl ${PROJECT_BINARY_DIR}/DartConfiguration.tcl Nightly DashboardEnd)
+ ENDIF (${CMAKE_MAKE_PROGRAM} MATCHES make)
+
+ ELSE(TCL_TCLSH)
+ MESSAGE("Could not find TCL_TCLSH, disabling testing." "Error")
+ ENDIF(TCL_TCLSH)
+ ENABLE_TESTING()
+
+ ELSE(DART_ROOT)
+ # make directories in the binary tree
+ MAKE_DIRECTORY(${PROJECT_BINARY_DIR}/Testing/Temporary)
+ GET_FILENAME_COMPONENT(CMAKE_HOST_PATH ${CMAKE_COMMAND} PATH)
+ SET(CMAKE_TARGET_PATH ${EXECUTABLE_OUTPUT_PATH})
+ MESSAGE("Look in: ${CMAKE_HOST_PATH} ${CMAKE_TARGET_PATH}")
+ FIND_PROGRAM(CMAKE_CTEST_COMMAND ctest ${CMAKE_HOST_PATH} ${CMAKE_TARGET_PATH})
+ MARK_AS_ADVANCED(CMAKE_CTEST_COMMAND)
+
+ # Use CTest
+ # configure files
+ CONFIGURE_FILE(
+ ${CMAKE_ROOT}/Modules/DartConfiguration.tcl.in
+ ${PROJECT_BINARY_DIR}/DartConfiguration.tcl )
+
+ #
+ # Section 3:
+ #
+ # Custom targets to perform dashboard builds and submissions.
+ # These should NOT need to be modified from project to project.
+ #
+
+ # add testing targets
+ ADD_CUSTOM_TARGET(Experimental ${CMAKE_CTEST_COMMAND} -D Experimental)
+
+ # for non IDE based builds nmake and make
+ # add all these extra targets
+ IF(${CMAKE_MAKE_PROGRAM} MATCHES make)
+ # Make targets for Experimental builds
+ FOREACH(mode Nightly Experimental Continuous)
+ FOREACH(testtype Start Update Configure Build Test Purify Coverage Submit)
+ ADD_CUSTOM_TARGET(${mode}${testtype}
+ ${CMAKE_CTEST_COMMAND} -D ${mode}${testtype})
+ ENDFOREACH(testtype)
+ ENDFOREACH(mode)
+ ENDIF (${CMAKE_MAKE_PROGRAM} MATCHES make)
ENDIF (DART_ROOT)
ENDIF(BUILD_TESTING)
#
# End of Dart.cmake
#
-
+
diff --git a/Modules/DartConfiguration.tcl.in b/Modules/DartConfiguration.tcl.in
new file mode 100644
index 0000000..bed63d1
--- /dev/null
+++ b/Modules/DartConfiguration.tcl.in
@@ -0,0 +1,53 @@
+# This file is configured by CMake automatically as DartConfiguration.tcl
+# If you choose not to use CMake, this file may be hand configured, by
+# filling in the required variables.
+
+
+# Configuration directories and files
+SourceDirectory: @PROJECT_SOURCE_DIR@
+BuildDirectory: @PROJECT_BINARY_DIR@
+
+# Dart options
+
+# CVS options
+# Default is "-d -P -A"
+CVSUpdateOptions: @CVS_UPDATE_OPTIONS@
+
+# Site is something like machine.domain, i.e. pragmatic.crd
+Site: @SITE@
+
+# Build name is osname-revision-compiler, i.e. Linux-2.4.2-2smp-c++
+BuildName: @BUILDNAME@
+
+# Submission information
+DropSite: @DROP_SITE@
+DropLocation: @DROP_LOCATION@
+DropSiteUser: @DROP_SITE_USER@
+DropSitePassword: @DROP_SITE_PASSWORD@
+DropSiteMode: @DROP_SITE_MODE@
+DropMethod: @DROP_METHOD@
+TriggerSite: @TRIGGER_SITE@
+
+# Dashboard start time
+NightlyStartTime: @NIGHTLY_START_TIME@
+
+# Commands for the build/test/submit cycle
+ConfigureCommand: "@CMAKE_COMMAND@" "@PROJECT_SOURCE_DIR@"
+CMakeCommand: @CMAKE_COMMAND@
+MakeCommand: @MAKECOMMAND@
+CVSCommand: @CVSCOMMAND@
+ScpCommand: @SCPCOMMAND@
+PurifyCommand: @PURIFYCOMMAND@
+ValgrindCommand: @VALGRIND_COMMAND@
+ValgrindCommandOptions: @VALGRIND_COMMAND_OPTIONS@
+# Compression commands
+GunzipCommand: @GUNZIPCOMMAND@
+CompressionCommand: @COMPRESSIONCOMMAND@
+CompressionType: @COMPRESSIONCOMMAND@
+
+# Testing options
+# TimeOut is the amount of time in seconds to wait for processes
+# to complete during testing. After TimeOut seconds, the
+# process will be summaily terminated.
+# Currently set to 25 minutes
+TimeOut: @DART_TESTING_TIMEOUT@