###############################################################################
#
# vendor.eagle --
#
# Extensible Adaptable Generalized Logic Engine (Eagle)
# Eagle Vendor Initialization File for System.Data.SQLite
#
# Copyright (c) 2007-2012 by Joe Mistachkin. All rights reserved.
#
# See the file "license.terms" for information on usage and redistribution of
# this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: $
#
###############################################################################
#
# STUB: This script file is a placeholder. This file, when present, is always
# evaluated when an interpreter is initialized. Vendors distributing
# Eagle can place custom application-specific, interpreter-specific
# initialization and/or customizations in here. Additionally, this file
# may contain per-interpreter customizations required when porting to
# new platforms, operating systems, etc.
#
###############################################################################
############################## BEGIN VENDOR CODE ##############################
###############################################################################
#
# NOTE: Use our own namespace here because even though we do not directly
# support namespaces ourselves, we do not want to pollute the global
# namespace if this script actually ends up being evaluated in Tcl.
#
namespace eval ::Eagle {
if {[isEagle]} then {
proc checkForVendorQuiet { {name ""} } {
if {[info exists ::env(checkForVendorQuiet)]} then {
return true
}
if {[string length $name] > 0} then {
set envVarName [appendArgs quiet [string toupper \
[string index $name 0]] [string range $name 1 end]]
if {[info exists ::env($envVarName)]} then {
return true
}
}
return false
}
proc checkForTestOverrides { channel varNames quiet } {
set result 0
foreach varName $varNames {
if {![uplevel 1 [list info exists $varName]]} then {
continue
}
incr result
if {!$quiet} then {
catch {
tqputs $channel [appendArgs \
"---- found vendor-specific test override \"" $varName \
"\" with value \"" [uplevel 1 [list set $varName]] \"\n]
}
}
}
#
# NOTE: Keep track of the list of test override variables, for later
# use by the test suite. This needs to be done after the loop
# above because the variable used to keep track is listed with
# the other possible test override variables.
#
if {![uplevel 1 [list info exists test_overrides]]} then {
uplevel 1 [list set test_overrides $varNames]
}
return $result
}
proc refreshAutoPath {} {
if {[llength [info commands debug]] > 0 && \
[llength [info subcommands debug refreshautopath]] > 0 && \
[catch {debug refreshautopath true}] == 0} then {
return debug
}
if {[llength [info commands object]] > 0 && \
[catch {object invoke Utility RefreshAutoPathList true}] == 0} then {
return object
}
return ""
}
proc addTestSuiteToAutoPath { channel varName quiet } {
#
# NOTE: Start with the directory containing this file.
#
set dir [file normalize [file dirname [info script]]]
#
# NOTE: Keep going until the directory name is empty OR is actually the
# root of the associated volume.
#
while {[string length $dir] > 0 && \
[lsearch -exact -nocase -- [file volumes] $dir] == -1} {
#
# NOTE: Set the sub-directory where the package index file should
# be located within the directory to be searched.
#
set dir2 [file join lib System.Data.SQLite]
#
# NOTE: Does this directory have the necessary sub-directory that
# contains a package index file?
#
if {[file exists [file join $dir $dir2]] && \
[file isdirectory [file join $dir $dir2]] && \
[file exists [file join $dir $dir2 pkgIndex.eagle]] && \
[file isfile [file join $dir $dir2 pkgIndex.eagle]]} then {
#
# NOTE: If requested, give our caller access to the name of the
# directory we just found.
#
if {[string length $varName] > 0} then {
upvar 1 $varName dir3
}
#
# NOTE: Ok, show the directory we found.
#
set dir3 [file join $dir $dir2]
#
# NOTE: We found the necessary directory to add to the auto-path;
# However, we cannot simply add it to the auto-path directly
# because the auto-path is dynamically constructed after this
# script is evaluated; therefore, set the Eagle library path
# environment variable and force the appropriate internal path
# list to be refreshed.
#
if {![info exists ::env(EAGLELIBPATH)] || \
[lsearch -exact $::env(EAGLELIBPATH) $dir3] == -1} then {
#
# NOTE: If we have NOT been instructed to be quiet, report now.
#
if {!$quiet} then {
catch {
tqputs $channel [appendArgs \
"---- found vendor-specific test package directory \"" \
$dir3 "\", adding...\n"]
}
}
#
# NOTE: Append the directory to the necessary environment variable
# so that it will get picked up when Eagle actually rebuilds
# the auto-path list (below).
#
lappend ::env(EAGLELIBPATH) $dir3
#
# NOTE: Attempt to force Eagle to rebuild the auto-path for the
# current interpreter right now.
#
set refresh [refreshAutoPath]
if {[string length $refresh] == 0} then {
#
# NOTE: Ok, maybe the [object] command is not available. Rescan
# the package indexes using the [package scan] sub-command
# in that case. The directories within EAGLELIBPATH will
# not be added to the auto-path; however, all the package
# indexes and their associated packages will be available.
#
if {!$quiet} then {
catch {
tqputs $channel [appendArgs \
"---- unable to forcibly refresh auto-path list, " \
"scanning \"" $::env(EAGLELIBPATH) "\" instead...\n"]
}
}
#
# NOTE: In theory, this call to the [package scan] sub-command
# could fail, raising a script error here; however, that
# is highly unlikely.
#
eval package scan -host -normal -refresh -- $::env(EAGLELIBPATH)
} else {
if {!$quiet} then {
catch {
tqputs $channel [appendArgs \
"---- forcibly refreshed auto-path list via \"" \
$refresh "\" command\n"]
}
}
}
}
#
# NOTE: We are done, return success.
#
return true
}
#
# NOTE: Keep going up the directory tree...
#
set dir [file dirname $dir]
}
#
# NOTE: If we have NOT been instructed to be quiet, report now.
#
if {!$quiet} then {
catch {
tqputs $channel \
"---- could not find vendor-specific test package directory\n"
}
}
#
# NOTE: Directory not found, return failure.
#
return false
}
proc findInterpreterTestPath { channel dir varName quiet } {
#
# NOTE: Start with the specified directory.
#
set dir2 $dir
#
# NOTE: Keep going until the directory name is empty OR is actually the
# root of the associated volume.
#
while {[string length $dir2] > 0 && \
[lsearch -exact -nocase -- [file volumes] $dir2] == -1} {
#
# NOTE: Set the sub-directory where the test suite file should be
# located within the directory to be searched.
#
set dir3 Tests
#
# NOTE: Does this directory have the necessary sub-directory that
# contains the test suite file?
#
if {[file exists [file join $dir2 $dir3]] && \
[file isdirectory [file join $dir2 $dir3]] && \
[file exists [file join $dir2 $dir3 all.eagle]] && \
[file isfile [file join $dir2 $dir3 all.eagle]]} then {
#
# NOTE: If requested, give our caller access to the name of the
# directory we just found.
#
if {[string length $varName] > 0} then {
upvar 1 $varName dir4
}
#
# NOTE: Ok, show the directory we found.
#
set dir4 [file join $dir2 $dir3]
#
# NOTE: If we have NOT been instructed to be quiet, report now.
#
if {!$quiet} then {
catch {
tqputs $channel [appendArgs \
"---- found vendor-specific test suite directory \"" \
$dir4 \"\n]
}
}
#
# NOTE: We are done, return success.
#
return true
}
#
# NOTE: Keep going up the directory tree...
#
set dir2 [file dirname $dir2]
}
#
# NOTE: If we have NOT been instructed to be quiet, report now.
#
if {!$quiet} then {
catch {
tqputs $channel \
"---- could not find vendor-specific test suite directory\n"
}
}
#
# NOTE: Directory not found, return failure.
#
return false
}
proc setupInterpreterTestPath { channel dir quiet } {
if {[llength [info commands debug]] > 0 && \
[llength [info subcommands debug testpath]] > 0 && \
[catch {debug testpath} testPath] == 0} then {
if {$dir ne $testPath} then {
debug testpath $dir
if {!$quiet} then {
catch {
tqputs $channel [appendArgs \
"---- set interpreter test path to \"" $dir \
"\" via \"debug\" command\n"]
}
}
}
} elseif {[llength [info commands object]] > 0 && [catch {
object invoke -flags +NonPublic Interpreter.GetActive TestPath
} testPath] == 0} then {
if {$dir ne $testPath} then {
object invoke -flags +NonPublic Interpreter.GetActive TestPath $dir
if {!$quiet} then {
catch {
tqputs $channel [appendArgs \
"---- set interpreter test path to \"" $dir \
"\" via \"object\" command\n"]
}
}
}
} else {
if {!$quiet} then {
catch {
tqputs $channel "---- cannot set interpreter test path\n"
}
}
}
}
#
# NOTE: Check for any overridden settings that may have been specified via
# the command line, etc.
#
checkForTestOverrides stdout [expr {[info exists test_overrides] ? \
$test_overrides : [list binary_directory build_base_directory \
build_directory common_directory compile_option_prefix \
connection_flags core_library_version database_directory \
datetime_format define_constant_prefix execute_on_setup \
interop_assembly_file_names native_library_file_names \
release_version scratch_directory temporary_directory test_clr \
test_clr_v2 test_clr_v4 test_configuration test_configurations \
test_configuration_suffix test_constraints test_extra test_extras \
test_machine test_native_configuration_suffix test_native_year \
test_net_fx test_net_fx_2005 test_net_fx_2008 test_net_fx_2010 \
test_net_fx_2012 test_net_fx_2013 test_net_fx_2015 test_net_fx_2017 \
test_overrides test_platform test_suite test_year test_years \
test_year_clr_v2 test_year_clr_v4 vendor_directory \
vendor_test_directory]}] [checkForVendorQuiet checkForTestOverrides]
#
# NOTE: Set the name of the running test suite, if necessary.
#
if {![info exists test_suite]} then {
set test_suite "System.Data.SQLite Test Suite for Eagle"
}
#
# NOTE: When being evaluated in a "safe" interpreter, some steps must be
# skipped due to missing commands and/or sub-commands.
#
if {![interp issafe]} then {
#
# NOTE: This variable will contain the name of the directory containing
# the vendor-specific testing infrastructure. If the variable does
# not exist, create it; otherwise, it has been overridden and the
# existing value should be left intact.
#
set have_vendor_directory [info exists vendor_directory]
if {!$have_vendor_directory} then {
set vendor_directory ""
}
#
# NOTE: This variable will contain the name of the directory containing
# the vendor-specific test suite. If the variable does not exist,
# create it; otherwise, it has been overridden and the existing
# value should be left intact.
#
set have_vendor_test_directory [info exists vendor_test_directory]
if {!$have_vendor_test_directory} then {
set vendor_test_directory ""
}
#
# NOTE: This procedure will attempt to find the vendor-specific testing
# infrastructure directory and add it to the auto-path for the
# current interpreter. Normally, this will also set the variable
# created above to point to the directory added to the auto-path;
# however, this will not be done if the variable was not created
# by us.
#
addTestSuiteToAutoPath stdout \
[expr {$have_vendor_directory ? "" : "vendor_directory"}] \
[checkForVendorQuiet addTestSuiteToAutoPath]
unset have_vendor_directory
#
# NOTE: This procedure will attempt to find the vendor-specific testing
# directory. Normally, this will also set the variable created
# above to point to the directory; however, this will not be done
# if the variable was not created by us.
#
findInterpreterTestPath stdout $vendor_directory \
[expr {$have_vendor_test_directory ? "" : "vendor_test_directory"}] \
[checkForVendorQuiet findInterpreterTestPath]
unset have_vendor_test_directory
#
# NOTE: If we actually found a vendor-specific testing infrastructure
# directory then modify the TestPath property of the current
# interpreter to point directly to it.
#
if {[string length $vendor_test_directory] > 0} then {
setupInterpreterTestPath stdout $vendor_test_directory \
[checkForVendorQuiet setupInterpreterTestPath]
}
}
#
# HACK: Prevent the Eagle core test suite infrastructure from checking
# test constraints that are time-consuming and/or most likely to
# be superfluous to third-party test suites (i.e. those that are
# not testing the Eagle core library itself).
#
set no(core) 1
#
# HACK: Prevent the Eagle core test suite infrastructure from checking
# for a usable instance of Excel because it can be quite slow to
# do so.
#
set no(excelUsable) 1
#
# NOTE: Make the per-test connection flag output a little less noisy.
#
set no(emitLocalFlagsIfNone) 1
set no(emitSharedFlagsIfNone) 1
set no(emitGlobalFlagsIfNone) 1
set no(emitCombinedFlagsIfNone) 1
#
# NOTE: Force use of the native library pre-loader when applicable.
#
if {[isWindows]} then {
set no(deleteSqliteImplicitNativeFiles) 1
set no(copySqliteImplicitNativeFiles) 1
}
}
}
###############################################################################
############################### END VENDOR CODE ###############################
###############################################################################