From 5fa3d6094e24aa18e6160390c5f37f763eeb776c Mon Sep 17 00:00:00 2001 From: zosrothko Date: Fri, 9 Feb 2018 15:05:15 +0100 Subject: [PATCH] Backport of pocoproject/feature-gradle to pocoproject/develop (#2127) * Backport of feature-gradle Signed-off-by: Francis ANDRE * Replace '/' by '\' to comply with DOS path Signed-off-by: Francis ANDRE * Cleanup Signed-off-by: Francis ANDRE * Put environment setting at the Exec task. Signed-off-by: Francis ANDRE * Use standard release Signed-off-by: Francis ANDRE * Updated mkdoc configuration Signed-off-by: Francis ANDRE * Remove lines guarded by POCO_ENABLE_CPP11 Signed-off-by: Francis ANDRE * Merge remote-tracking branch 'origin/develop' into develop * Fix NuGet & Wix input dependencies file set. Signed-off-by: Francis ANDRE * Remaining fixes for Data2SQL switch. * Use $global:LastExitCode instead of a local LastExitCode --- .gitignore | 19 +- .gitmodules | 3 + CppParser/build.gradle | 32 + CppParser/testsuite/build.gradle | 52 + CppUnit/WinTestRunner/build.gradle | 33 + CppUnit/build.gradle | 35 + Crypto/build.gradle | 45 + Crypto/samples/build.gradle | 27 + Crypto/testsuite/build.gradle | 65 + Foundation/build.gradle | 115 + Foundation/samples/build.gradle | 146 + Foundation/testsuite/build.gradle | 92 + JSON/build.gradle | 47 + JSON/samples/build.gradle | 27 + JSON/testsuite/build.gradle | 63 + MongoDB/build.gradle | 37 + MongoDB/samples/build.gradle | 25 + MongoDB/testsuite/build.gradle | 63 + Net/build.gradle | 40 + Net/samples/build.gradle | 118 + Net/testsuite/build.gradle | 69 + NetSSL_OpenSSL/build.gradle | 41 + NetSSL_OpenSSL/samples/build.gradle | 68 + NetSSL_OpenSSL/testsuite/build.gradle | 74 + NetSSL_Win/build.gradle | 46 + NetSSL_Win/samples/build.gradle | 56 + NetSSL_Win/testsuite/build.gradle | 70 + PDF/build.gradle | 1 + PageCompiler/File2Page/build.gradle | 29 + PageCompiler/build.gradle | 41 + PageCompiler/samples/build.gradle | 28 + PocoDoc/build.gradle | 44 + PocoDoc/cfg/mkdoc-gradle.xml | 136 + Redis/build.gradle | 37 + Redis/testsuite/build.gradle | 63 + SQL/MySQL/build.gradle | 104 + SQL/MySQL/testsuite/build.gradle | 73 + SQL/ODBC/build.gradle | 46 + SQL/ODBC/testsuite/build.gradle | 69 + SQL/PostgreSQL/build.gradle | 233 ++ SQL/PostgreSQL/testsuite/build.gradle | 66 + SQL/SQLite/build.gradle | 69 + SQL/SQLite/testsuite/build.gradle | 64 + SQL/build.gradle | 35 + SQL/samples/build.gradle | 69 + SQL/testsuite/build.gradle | 65 + SevenZip/samples/build.gradle | 26 + Util/build.gradle | 60 + Util/samples/build.gradle | 48 + Util/testsuite/build.gradle | 86 + XML/build.gradle | 57 + XML/samples/build.gradle | 49 + XML/testsuite/build.gradle | 62 + Zip/build.gradle | 38 + Zip/samples/build.gradle | 36 + Zip/testsuite/build.gradle | 62 + appveyor.yml | 2 +- build.gradle | 1053 +++++ doc/00100-GuidedTour.page | 2 +- gradle | 1 + gradle.properties | 45 + packaging/Boost License.rtf | 34 + packaging/Linux/Fedora/.gitignore | 0 packaging/Linux/Ubuntu/debian/.gitignore | 0 packaging/Other/.gitignore | 0 packaging/Other/VMS/.gitignore | 0 packaging/README.md | 111 + packaging/README.txt | 24 + packaging/Unix/.gitignore | 0 packaging/Unix/HP/.gitignore | 0 packaging/Unix/Sun/.gitignore | 0 .../NuGet/Pocoproject.Poco.vs140.nuspec | 52 + .../Pocoproject.Poco.vs140.symbols.nuspec | 31 + .../NuGet/Pocoproject.Poco.vs140.targets | 13 + packaging/Windows/NuGet/api.key | 1 + packaging/Windows/WiX/Poco 128x410.bmp | Bin 0 -> 157494 bytes packaging/Windows/WiX/Poco 312x312.jpg | Bin 0 -> 20438 bytes packaging/Windows/WiX/Poco 64x64.ico | Bin 0 -> 99678 bytes packaging/Windows/WiX/Poco Layers.bmp | Bin 0 -> 195678 bytes packaging/Windows/WiX/Poco Layers.png | Bin 0 -> 8091 bytes packaging/Windows/WiX/Poco.wxs | 3513 +++++++++++++++++ packaging/Windows/WiX/VS2013/.gitignore | 0 packaging/Windows/WiX/VS2015/.gitignore | 0 settings.gradle | 71 + 84 files changed, 8254 insertions(+), 3 deletions(-) create mode 100644 CppParser/build.gradle create mode 100644 CppParser/testsuite/build.gradle create mode 100644 CppUnit/WinTestRunner/build.gradle create mode 100644 CppUnit/build.gradle create mode 100644 Crypto/build.gradle create mode 100644 Crypto/samples/build.gradle create mode 100644 Crypto/testsuite/build.gradle create mode 100644 Foundation/build.gradle create mode 100644 Foundation/samples/build.gradle create mode 100644 Foundation/testsuite/build.gradle create mode 100644 JSON/build.gradle create mode 100644 JSON/samples/build.gradle create mode 100644 JSON/testsuite/build.gradle create mode 100644 MongoDB/build.gradle create mode 100644 MongoDB/samples/build.gradle create mode 100644 MongoDB/testsuite/build.gradle create mode 100644 Net/build.gradle create mode 100644 Net/samples/build.gradle create mode 100644 Net/testsuite/build.gradle create mode 100644 NetSSL_OpenSSL/build.gradle create mode 100644 NetSSL_OpenSSL/samples/build.gradle create mode 100644 NetSSL_OpenSSL/testsuite/build.gradle create mode 100644 NetSSL_Win/build.gradle create mode 100644 NetSSL_Win/samples/build.gradle create mode 100644 NetSSL_Win/testsuite/build.gradle create mode 100644 PageCompiler/File2Page/build.gradle create mode 100644 PageCompiler/build.gradle create mode 100644 PageCompiler/samples/build.gradle create mode 100644 PocoDoc/build.gradle create mode 100644 PocoDoc/cfg/mkdoc-gradle.xml create mode 100644 Redis/build.gradle create mode 100644 Redis/testsuite/build.gradle create mode 100644 SQL/MySQL/build.gradle create mode 100644 SQL/MySQL/testsuite/build.gradle create mode 100644 SQL/ODBC/build.gradle create mode 100644 SQL/ODBC/testsuite/build.gradle create mode 100644 SQL/PostgreSQL/build.gradle create mode 100644 SQL/PostgreSQL/testsuite/build.gradle create mode 100644 SQL/SQLite/build.gradle create mode 100644 SQL/SQLite/testsuite/build.gradle create mode 100644 SQL/build.gradle create mode 100644 SQL/samples/build.gradle create mode 100644 SQL/testsuite/build.gradle create mode 100644 SevenZip/samples/build.gradle create mode 100644 Util/build.gradle create mode 100644 Util/samples/build.gradle create mode 100644 Util/testsuite/build.gradle create mode 100644 XML/build.gradle create mode 100644 XML/samples/build.gradle create mode 100644 XML/testsuite/build.gradle create mode 100644 Zip/build.gradle create mode 100644 Zip/samples/build.gradle create mode 100644 Zip/testsuite/build.gradle create mode 100644 build.gradle create mode 160000 gradle create mode 100644 gradle.properties create mode 100644 packaging/Boost License.rtf create mode 100644 packaging/Linux/Fedora/.gitignore create mode 100644 packaging/Linux/Ubuntu/debian/.gitignore create mode 100644 packaging/Other/.gitignore create mode 100644 packaging/Other/VMS/.gitignore create mode 100644 packaging/README.md create mode 100644 packaging/README.txt create mode 100644 packaging/Unix/.gitignore create mode 100644 packaging/Unix/HP/.gitignore create mode 100644 packaging/Unix/Sun/.gitignore create mode 100644 packaging/Windows/NuGet/Pocoproject.Poco.vs140.nuspec create mode 100644 packaging/Windows/NuGet/Pocoproject.Poco.vs140.symbols.nuspec create mode 100644 packaging/Windows/NuGet/Pocoproject.Poco.vs140.targets create mode 100644 packaging/Windows/NuGet/api.key create mode 100644 packaging/Windows/WiX/Poco 128x410.bmp create mode 100644 packaging/Windows/WiX/Poco 312x312.jpg create mode 100644 packaging/Windows/WiX/Poco 64x64.ico create mode 100644 packaging/Windows/WiX/Poco Layers.bmp create mode 100644 packaging/Windows/WiX/Poco Layers.png create mode 100644 packaging/Windows/WiX/Poco.wxs create mode 100644 packaging/Windows/WiX/VS2013/.gitignore create mode 100644 packaging/Windows/WiX/VS2015/.gitignore create mode 100644 settings.gradle diff --git a/.gitignore b/.gitignore index 0b7f2eb69..5b94880ef 100644 --- a/.gitignore +++ b/.gitignore @@ -22,7 +22,7 @@ config.build config.make # CMake # -######## +######### cmake_install.cmake cmake_uninstall.cmake CMakeFiles @@ -32,6 +32,22 @@ CPackSourceConfig.cmake cmake_* cmake-build* +# Gradle # +########## +.gradle/ +gradle/ +coverage/ + +# NuGet # +######### +*.nupkg + +# WiX # +####### +*.msi +*.wixobj +*.wixpdb + # Packages # ############ # it's better to unpack these files and commit the raw source @@ -52,6 +68,7 @@ cmake-build* *.db test*.txt XML/testsuite/rss.xml +Zip/testsuite/test.dat # OS generated files # ###################### diff --git a/.gitmodules b/.gitmodules index 42c0b9895..905744bdd 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "openssl"] path = openssl url = https://github.com/pocoproject/openssl +[submodule "gradle"] + path = gradle + url = https://github.com/pocoproject/gradle.git diff --git a/CppParser/build.gradle b/CppParser/build.gradle new file mode 100644 index 000000000..da7e51b9b --- /dev/null +++ b/CppParser/build.gradle @@ -0,0 +1,32 @@ +model { + components { + CppParser(NativeLibrarySpec) { + sources { + rc { + source { + srcDir '..' + include 'DLLVersion.rc' + } + } + cpp { + source { + srcDir 'src' + include '**/*.cpp' + } + exportedHeaders { + srcDir 'include' + } + lib project: ':Foundation', library: 'Foundation' + } + } + } + } + binaries { + withType(SharedLibraryBinarySpec) { + if (toolChain in VisualCpp) { + cppCompiler.define "CppParser_EXPORTS" + } + } + } +} +task poco { dependsOn "assemble" } diff --git a/CppParser/testsuite/build.gradle b/CppParser/testsuite/build.gradle new file mode 100644 index 000000000..3cdf0ca7f --- /dev/null +++ b/CppParser/testsuite/build.gradle @@ -0,0 +1,52 @@ +import org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteSpec + +model { + components { + TestSuite(NativeLibrarySpec) { + sources { + cpp { + source { + srcDir 'src' + include '**/*.cpp' + exclude '*Driver.cpp' + } + exportedHeaders { + srcDir 'src' + } + lib project: ':CppUnit', library: 'CppUnit' + lib project: ':CppParser', library: 'CppParser' + lib project: ':Foundation', library: 'Foundation' + } + } + } + } + testSuites { + CppParserTestSuite(org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteSpec) { + testing $.components.TestSuite + } + } + binaries { + all { + if (toolChain in VisualCpp) { + if (buildType == buildTypes.debug) { + cCompiler.args "/MDd" + cppCompiler.args "/MDd" + } else + if (buildType == buildTypes.release) { + cCompiler.args "/MD" + cppCompiler.args "/MD" + } else { + throw new GradleException("Unknown buildType" + buildType) + } + } + if (toolChain in Gcc) { + } + } + withType(org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteBinarySpec) { + lib project: ':CppUnit', library: 'CppUnit', linkage: 'shared' + } + } +} +task testsuite { dependsOn "assemble" } + + diff --git a/CppUnit/WinTestRunner/build.gradle b/CppUnit/WinTestRunner/build.gradle new file mode 100644 index 000000000..c19921c99 --- /dev/null +++ b/CppUnit/WinTestRunner/build.gradle @@ -0,0 +1,33 @@ +project(":CppUnit/WinTestRunner") { + model { + components { + PocoWinTestRunner(NativeExecutableSpec) { + sources { + cpp { + source { + srcDir 'src' + include '**/*.cpp' + } + exportedHeaders { + srcDir 'include' + } + } + } + } + } + binaries { + all { + } + withType(SharedLibraryBinarySpec) { + lib project: ':CppUnit', library: 'PocoCppUnit', linkage: 'shared' + if (toolChain in VisualCpp) { + cppCompiler.define "WinTestRunner_EXPORTS" + } + } + withType(StaticLibraryBinarySpec) { + lib project: ':CppUnit', library: 'PocoCppUnit', linkage: 'static' + } + } + } +} + diff --git a/CppUnit/build.gradle b/CppUnit/build.gradle new file mode 100644 index 000000000..3d51671fb --- /dev/null +++ b/CppUnit/build.gradle @@ -0,0 +1,35 @@ +model { + components { + CppUnit(NativeLibrarySpec) { + sources { + rc { + source { + srcDir '..' + include 'DLLVersion.rc' + } + } + cpp { + source { + srcDir 'src' + include '**/*.cpp' + } + exportedHeaders { + srcDir 'include' + } + } + } + } + } + binaries { + withType(SharedLibraryBinarySpec) { + if (toolChain in VisualCpp) { + cppCompiler.define "CppUnit_EXPORTS" + } + } + withType(StaticLibraryBinarySpec) { + } + } +} +task poco { dependsOn "assemble" } + + diff --git a/Crypto/build.gradle b/Crypto/build.gradle new file mode 100644 index 000000000..5a90c159e --- /dev/null +++ b/Crypto/build.gradle @@ -0,0 +1,45 @@ +model { + components { + Crypto(NativeLibrarySpec) { + sources { + rc { + source { + srcDir '..' + include 'DLLVersion.rc' + } + } + cpp { + source { + srcDir 'src' + include '**/*.cpp' + } + exportedHeaders { + srcDir 'include' + } + lib library: 'ssl' + lib library: 'crypto' + lib project: ':Foundation', library: 'Foundation' + } + } + } + } + binaries { + all { + if (toolChain in VisualCpp) { + linker.args "ws2_32.lib" + linker.args "iphlpapi.lib" + } + if (toolChain in Gcc) { + linker.args "-lssl" + linker.args "-lcrypto" + } + } + withType(SharedLibraryBinarySpec) { + if (toolChain in VisualCpp) { + cppCompiler.define "Crypto_EXPORTS" + } + } + } +} +task poco { dependsOn "assemble" } + diff --git a/Crypto/samples/build.gradle b/Crypto/samples/build.gradle new file mode 100644 index 000000000..8b938c9e5 --- /dev/null +++ b/Crypto/samples/build.gradle @@ -0,0 +1,27 @@ +model { + components { + genrsakey(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'genrsakey/src' include '**/*.cpp' } + cpp.lib project: ':Crypto', library: 'Crypto' + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + } + binaries { + all { + } + withType(SharedLibraryBinarySpec) { + lib project: ':Foundation', library: 'Foundation', linkage: 'shared' + } + withType(StaticLibraryBinarySpec) { + lib project: ':Foundation', library: 'Foundation', linkage: 'static' + } + withType(NativeExecutableSpec) { + lib project: ':Foundation', library: 'Foundation', linkage: 'static' + } + } +} +task sample { dependsOn "assemble" } + + diff --git a/Crypto/testsuite/build.gradle b/Crypto/testsuite/build.gradle new file mode 100644 index 000000000..d53ccbcbc --- /dev/null +++ b/Crypto/testsuite/build.gradle @@ -0,0 +1,65 @@ +import org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteSpec + +model { + components { + withType(NativeComponentSpec) { + binaries.withType(NativeBinarySpec) { + if (buildType == buildTypes.debug) { + if (it instanceof NativeExecutableBinarySpec) { + executable.file = toLocalBin(appendDebugSuffix(executable.file), targetPlatform) + } + } else + if (buildType == buildTypes.release) { + if (it instanceof NativeExecutableBinarySpec) { + executable.file = toLocalBin(executable.file, targetPlatform) + } + } + } + } + TestSuite(NativeLibrarySpec) { + sources { + cpp { + source { + srcDir 'src' + include '**/*.cpp' + exclude '*Driver.cpp' + } + exportedHeaders { + srcDir 'src' + } + lib project: ':CppUnit', library: 'CppUnit' + lib project: ':Crypto', library: 'Crypto' + lib library: 'ssl' + lib library: 'crypto' + lib project: ':Foundation', library: 'Foundation' + } + } + } + } + testSuites { + CryptoTestSuite(org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteSpec) { + testing $.components.TestSuite + } + } + binaries { + withType(org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteBinarySpec) { + lib project: ':CppUnit', library: 'CppUnit', linkage: 'shared' + if (toolChain in VisualCpp) { + if (buildType == buildTypes.debug) { + cCompiler.args "/MDd" + cppCompiler.args "/MDd" + } else + if (buildType == buildTypes.release) { + cCompiler.args "/MD" + cppCompiler.args "/MD" + } else { + throw new GradleException("Unknown buildType" + buildType) + } + } + if (toolChain in Gcc) { + } + } + } +} +task testsuite { dependsOn "assemble" } + diff --git a/Foundation/build.gradle b/Foundation/build.gradle new file mode 100644 index 000000000..c1b0f10b8 --- /dev/null +++ b/Foundation/build.gradle @@ -0,0 +1,115 @@ +model { + components { + Foundation(NativeLibrarySpec) { m -> + sources { +// +// mc { +// source { +// srcDir 'src' +// include '**/*.mc' +// } +// } + rc { + source { + srcDir '..' + include 'DLLVersion.rc' + } + } + c { + source { + srcDir 'src' + include '**/*.c' + } + exportedHeaders { + srcDir 'include' + } + } + cpp { + source { + srcDir 'src' + include '**/*.cpp' + exclude 'ByteOrder.cpp' + exclude 'String.cpp' + exclude 'SignalHandler.cpp' + exclude 'Environment_*.cpp' + exclude 'FPEnvironment_*.cpp' + exclude 'Timezone_*.cpp' + exclude 'DirectoryIterator_*.cpp' + exclude 'File_*.cpp' + exclude 'FileStream_*.cpp' + exclude 'Path_*.cpp' + exclude 'LogFile_*.cpp' + exclude 'NamedEvent_*.cpp' + exclude 'NamedMutex_*.cpp' + exclude 'PipeImpl_*.cpp' + exclude 'Process_*.cpp' + exclude 'SharedMemory_*.cpp' + exclude 'SharedLibrary_*.cpp' + exclude 'Event_*.cpp' + exclude 'Mutex_*.cpp' + exclude 'RWLock_*.cpp' + exclude 'Semaphore_*.cpp' + exclude 'Thread_*.cpp' + + exclude 'EventLogChannel.cpp' + exclude 'UnWindows.cpp' + exclude 'WindowsConsoleChannel.cpp' + exclude 'OpcomChannel.cpp' + exclude 'AndroidLogChannel.cpp' + exclude 'SyslogChannel.cpp' + + } + exportedHeaders { + srcDir 'include' + } + } + } + binaries.all { + sources { + if (targetPlatform.operatingSystem.windows) { + platformWindows(CppSourceSet) { + lib m.sources.cpp + source { + srcDir 'src' + include 'EventLogChannel.cpp' + include 'UnWindows.cpp' + include 'WindowsConsoleChannel.cpp' + } + } + } else + if (targetPlatform.operatingSystem.macOsX || targetPlatform.operatingSystem.linux) { + platformNix(CppSourceSet) { + lib m.sources.cpp + source { + srcDir 'src' + include 'SignalHandler.cpp' + include 'SyslogChannel.cpp' + } + } + } + } + } + } + } + binaries { + all { + if (toolChain in VisualCpp) { + linker.args "ws2_32.lib" + linker.args "iphlpapi.lib" + } + } + withType(NativeExecutableSpec) { + } + withType(StaticLibraryBinarySpec) { + } + withType(SharedLibraryBinarySpec) { + if (toolChain in VisualCpp) { +// addCompilerDefine "Foundation_EXPORTS" "" + cCompiler.define "Foundation_EXPORTS" + cppCompiler.define "Foundation_EXPORTS" + } + } + } +} +task poco { dependsOn "assemble" } + diff --git a/Foundation/samples/build.gradle b/Foundation/samples/build.gradle new file mode 100644 index 000000000..14611660a --- /dev/null +++ b/Foundation/samples/build.gradle @@ -0,0 +1,146 @@ +model { + components { + ActiveMethod(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'ActiveMethod/src' include '**/*.cpp' } + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + Activity(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'ActiveMethod/src' include '**/*.cpp' } + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + base64decode(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'base64decode/src' include '**/*.cpp' } + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + base64encode(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'base64encode/src' include '**/*.cpp' } + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + Benchmark(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'Benchmark/src' include '**/*.cpp' } + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + BinaryReaderWriter(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'BinaryReaderWriter/src' include '**/*.cpp' } + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + DateTime(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'DateTime/src' include '**/*.cpp' } + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + deflate(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'deflate/src' include '**/*.cpp' } + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + dir(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'dir/src' include '**/*.cpp' } + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + grep(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'grep/src' include '**/*.cpp' } + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + hmacmd5(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'hmacmd5/src' include '**/*.cpp' } + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + inflate(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'inflate/src' include '**/*.cpp' } + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + LineEndingConverter(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'LineEndingConverter/src' include '**/*.cpp' } + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + Logger(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'Logger/src' include '**/*.cpp' } + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + LogRotation(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'LogRotation/src' include '**/*.cpp' } + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + md5(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'md5/src' include '**/*.cpp' } + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + NotificationQueue(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'NotificationQueue/src' include '**/*.cpp' } + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + StringTokenizer(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'StringTokenizer/src' include '**/*.cpp' } + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + Timer(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'Timer/src' include '**/*.cpp' } + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + URI(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'URI/src' include '**/*.cpp' } + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + uuidgen(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'uuidgen/src' include '**/*.cpp' } + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + } + binaries { + all { + } + withType(SharedLibraryBinarySpec) { + lib project: ':Foundation', library: 'Foundation', linkage: 'shared' + } + withType(StaticLibraryBinarySpec) { + lib project: ':Foundation', library: 'Foundation', linkage: 'static' + } + withType(NativeExecutableSpec) { + lib project: ':Foundation', library: 'Foundation', linkage: 'static' + } + } +} +task samples { dependsOn "assemble" } + + diff --git a/Foundation/testsuite/build.gradle b/Foundation/testsuite/build.gradle new file mode 100644 index 000000000..fc3d8416a --- /dev/null +++ b/Foundation/testsuite/build.gradle @@ -0,0 +1,92 @@ +import org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteSpec + +model { + components { + withType(NativeComponentSpec) { + binaries.withType(NativeBinarySpec) { + if (buildType == buildTypes.debug) { + if (it instanceof NativeExecutableBinarySpec) { + executable.file = toLocalBin(appendDebugSuffix(executable.file), targetPlatform) + } + } else + if (buildType == buildTypes.release) { + if (it instanceof NativeExecutableBinarySpec) { + executable.file = toLocalBin(executable.file, targetPlatform) + } + } + } + } + TestLib(NativeLibrarySpec) { + sources { + cpp { + source { + srcDir 'src' + include 'TestLibrary.cpp' + include 'TestPlugin.cpp' + } + lib project: ':CppUnit', library: 'CppUnit', linkage: 'shared' + lib project: ':Foundation', library: 'Foundation', linkage: 'shared' + } + } + } + TestApp(NativeExecutableSpec) { + sources { + cpp { + source { + srcDir 'src' + include 'TestApp.cpp' + } + lib project: ':CppUnit', library: 'CppUnit', linkage: 'shared' + lib project: ':Foundation', library: 'Foundation', linkage: 'shared' + lib library: 'TestLib', linkage: 'shared' + } + } + } + TestSuite(NativeLibrarySpec) { + sources { + cpp { + source { + srcDir 'src' + include '**/*.cpp' + exclude '*Driver.cpp' + exclude '*_WINCE.cpp' + exclude 'TestApp*.cpp' + } + exportedHeaders { + srcDir 'src' + } + lib project: ':CppUnit', library: 'CppUnit', linkage: 'shared' + lib project: ':Foundation', library: 'Foundation', linkage: 'shared' + } + } + } + } + testSuites { + FoundationTestSuite(org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteSpec) { + testing $.components.TestSuite + } + } + binaries { + withType(org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteBinarySpec) { + lib project: ':CppUnit', library: 'CppUnit', linkage: 'shared' + if (toolChain in VisualCpp) { + if (buildType == buildTypes.debug) { + cCompiler.args "/MDd" + cppCompiler.args "/MDd" + } else + if (buildType == buildTypes.release) { + cCompiler.args "/MD" + cppCompiler.args "/MD" + } else { + throw new GradleException("Unknown buildType" + buildType) + } + } + if (toolChain in Gcc) { + } + } + } + +} +task testsuite { dependsOn "assemble" } + + diff --git a/JSON/build.gradle b/JSON/build.gradle new file mode 100644 index 000000000..9c4745195 --- /dev/null +++ b/JSON/build.gradle @@ -0,0 +1,47 @@ +model { + components { + JSON(NativeLibrarySpec) { + sources { + rc { + source { + srcDir '..' + include 'DLLVersion.rc' + } + } + c { + source { + srcDir 'src' + include '**/*.c' + } + exportedHeaders { + srcDir 'include' + } + lib project: ':Foundation', library: 'Foundation' + } + cpp { + source { + srcDir 'src' + include '**/*.cpp' + } + exportedHeaders { + srcDir 'include' + } + lib project: ':Foundation', library: 'Foundation' + } + } + } + } + binaries { + all { + if (toolChain in VisualCpp) { + } + } + withType(SharedLibraryBinarySpec) { + if (toolChain in VisualCpp) { + cppCompiler.define "JSON_EXPORTS" + } + } + } +} +task poco { dependsOn "assemble" } + diff --git a/JSON/samples/build.gradle b/JSON/samples/build.gradle new file mode 100644 index 000000000..5c3e9cd8a --- /dev/null +++ b/JSON/samples/build.gradle @@ -0,0 +1,27 @@ +model { + components { + Benchmark(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'Benchmark/src' include '**/*.cpp' } + cpp.lib project: ':JSON', library: 'JSON' + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + } + binaries { + all { + } + withType(SharedLibraryBinarySpec) { + lib project: ':Foundation', library: 'Foundation', linkage: 'shared' + } + withType(StaticLibraryBinarySpec) { + lib project: ':Foundation', library: 'Foundation', linkage: 'static' + } + withType(NativeExecutableSpec) { + lib project: ':Foundation', library: 'Foundation', linkage: 'static' + } + } +} +task samples { dependsOn "assemble" } + + diff --git a/JSON/testsuite/build.gradle b/JSON/testsuite/build.gradle new file mode 100644 index 000000000..2c3e9d7d8 --- /dev/null +++ b/JSON/testsuite/build.gradle @@ -0,0 +1,63 @@ +import org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteSpec + +model { + components { + withType(NativeComponentSpec) { + binaries.withType(NativeBinarySpec) { + if (buildType == buildTypes.debug) { + if (it instanceof NativeExecutableBinarySpec) { + executable.file = toLocalBin(appendDebugSuffix(executable.file), targetPlatform) + } + } else + if (buildType == buildTypes.release) { + if (it instanceof NativeExecutableBinarySpec) { + executable.file = toLocalBin(executable.file, targetPlatform) + } + } + } + } + TestSuite(NativeLibrarySpec) { + sources { + cpp { + source { + srcDir 'src' + include '**/*.cpp' + exclude '*Driver.cpp' + } + exportedHeaders { + srcDir 'src' + } + lib project: ':CppUnit', library: 'CppUnit', linkage: 'shared' + lib project: ':JSON', library: 'JSON', linkage: 'shared' + lib project: ':Foundation', library: 'Foundation', linkage: 'shared' + } + } + } + } + testSuites { + JSONTestSuite(org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteSpec) { + testing $.components.TestSuite + } + } + binaries { + withType(org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteBinarySpec) { + lib project: ':CppUnit', library: 'CppUnit', linkage: 'shared' + if (toolChain in VisualCpp) { + if (buildType == buildTypes.debug) { + cCompiler.args "/MDd" + cppCompiler.args "/MDd" + } else + if (buildType == buildTypes.release) { + cCompiler.args "/MD" + cppCompiler.args "/MD" + } else { + throw new GradleException("Unknown buildType" + buildType) + } + } + if (toolChain in Gcc) { + } + } + } +} +task testsuite { dependsOn "assemble" } + diff --git a/MongoDB/build.gradle b/MongoDB/build.gradle new file mode 100644 index 000000000..d80e1322d --- /dev/null +++ b/MongoDB/build.gradle @@ -0,0 +1,37 @@ +model { + components { + MongoDB(NativeLibrarySpec) { + sources { + rc { + source { + srcDir '..' + include 'DLLVersion.rc' + } + } + cpp { + source { + srcDir 'src' + include '**/*.cpp' + } + exportedHeaders { + srcDir 'include' + } + lib project: ':Net', library: 'Net' + lib project: ':Foundation', library: 'Foundation' + } + } + } + } + binaries { + all { + } + withType(SharedLibraryBinarySpec) { + if (toolChain in VisualCpp) { + cppCompiler.define "MongoDB_EXPORTS" + } + } + } +} +task poco { dependsOn "assemble" } + + diff --git a/MongoDB/samples/build.gradle b/MongoDB/samples/build.gradle new file mode 100644 index 000000000..fc9684742 --- /dev/null +++ b/MongoDB/samples/build.gradle @@ -0,0 +1,25 @@ +model { + components { + SQLToMongo(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'SQLToMongo/src' include '**/*.cpp' } + cpp.lib project: ':MongoDB', library: 'MongoDB' + cpp.lib project: ':Net', library: 'Net' + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + } + binaries { + all { + } + withType(SharedLibraryBinarySpec) { + } + withType(StaticLibraryBinarySpec) { + } + withType(NativeExecutableSpec) { + } + } +} +task samples { dependsOn "assemble" } + + diff --git a/MongoDB/testsuite/build.gradle b/MongoDB/testsuite/build.gradle new file mode 100644 index 000000000..a7c40eabd --- /dev/null +++ b/MongoDB/testsuite/build.gradle @@ -0,0 +1,63 @@ +import org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteSpec + +model { + components { + withType(NativeComponentSpec) { + binaries.withType(NativeBinarySpec) { + if (buildType == buildTypes.debug) { + if (it instanceof NativeExecutableBinarySpec) { + executable.file = toLocalBin(appendDebugSuffix(executable.file), targetPlatform) + } + } else + if (buildType == buildTypes.release) { + if (it instanceof NativeExecutableBinarySpec) { + executable.file = toLocalBin(executable.file, targetPlatform) + } + } + } + } + TestSuite(NativeLibrarySpec) { + sources { + cpp { + source { + srcDir 'src' + include '**/*.cpp' + exclude '*Driver.cpp' + } + exportedHeaders { + srcDir 'src' + } + lib project: ':CppUnit', library: 'CppUnit', linkage: 'shared' + lib project: ':MongoDB', library: 'MongoDB', linkage: 'shared' + lib project: ':Net', library: 'Net', linkage: 'shared' + lib project: ':Foundation', library: 'Foundation', linkage: 'shared' + } + } + } + } + testSuites { + MongoDBTestSuite(org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteSpec) { + testing $.components.TestSuite + } + } + binaries { + withType(org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteBinarySpec) { + lib project: ':CppUnit', library: 'CppUnit', linkage: 'shared' + if (toolChain in VisualCpp) { + if (buildType == buildTypes.debug) { + cCompiler.args "/MDd" + cppCompiler.args "/MDd" + } else + if (buildType == buildTypes.release) { + cCompiler.args "/MD" + cppCompiler.args "/MD" + } else { + throw new GradleException("Unknown buildType" + buildType) + } + } + if (toolChain in Gcc) { + } + } + } +} +task testsuite { dependsOn "assemble" } diff --git a/Net/build.gradle b/Net/build.gradle new file mode 100644 index 000000000..dac3c2867 --- /dev/null +++ b/Net/build.gradle @@ -0,0 +1,40 @@ +model { + components { + Net(NativeLibrarySpec) { + sources { + rc { + source { + srcDir '..' + include 'DLLVersion.rc' + } + } + cpp { + source { + srcDir 'src' + include '**/*.cpp' + } + exportedHeaders { + srcDir 'include' + } + lib project: ':Foundation', library: 'Foundation' + } + } + } + } + binaries { + all { + if (targetPlatform.operatingSystem.windows) { + linker.args "ws2_32.lib" + linker.args "iphlpapi.lib" + } + } + withType(SharedLibraryBinarySpec) { + if (toolChain in VisualCpp) { + cppCompiler.define "Net_EXPORTS" + } + } + } +} +task poco { dependsOn "assemble" } + + diff --git a/Net/samples/build.gradle b/Net/samples/build.gradle new file mode 100644 index 000000000..3e245adae --- /dev/null +++ b/Net/samples/build.gradle @@ -0,0 +1,118 @@ +model { + components { + dict(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'dict/src' include '**/*.cpp' } + cpp.lib project: ':Net', library: 'Net' + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + download(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'download/src' include '**/*.cpp' } + cpp.lib project: ':Net', library: 'Net' + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + EchoServer(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'EchoServer/src' include '**/*.cpp' } + cpp.lib project: ':Net', library: 'Net' + cpp.lib project: ':Util', library: 'Util' + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + HTTPFormServer(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'HTTPFormServer/src' include '**/*.cpp' } + cpp.lib project: ':Net', library: 'Net' + cpp.lib project: ':Util', library: 'Util' + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + httpget(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'httpget/src' include '**/*.cpp' } + cpp.lib project: ':Net', library: 'Net' + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + HTTPLoadTest(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'HTTPLoadTest/src' include '**/*.cpp' } + cpp.lib project: ':Net', library: 'Net' + cpp.lib project: ':Util', library: 'Util' + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + HTTPTimeServer(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'HTTPTimeServer/src' include '**/*.cpp' } + cpp.lib project: ':Net', library: 'Net' + cpp.lib project: ':Util', library: 'Util' + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + ifconfig(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'ifconfig/src' include '**/*.cpp' } + cpp.lib project: ':Net', library: 'Net' + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + Mail(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'Mail/src' include '**/*.cpp' } + cpp.lib project: ':Net', library: 'Net' + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + Ping(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'Ping/src' include '**/*.cpp' } + cpp.lib project: ':Net', library: 'Net' + cpp.lib project: ':Util', library: 'Util' + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + SMTPLogger(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'SMTPLogger/src' include '**/*.cpp' } + cpp.lib project: ':Net', library: 'Net' + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + TimeServer(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'TimeServer/src' include '**/*.cpp' } + cpp.lib project: ':Net', library: 'Net' + cpp.lib project: ':Util', library: 'Util' + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + WebSocketServer(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'WebSocketServer/src' include '**/*.cpp' } + cpp.lib project: ':Net', library: 'Net' + cpp.lib project: ':Util', library: 'Util' + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + } + binaries { + all { + } + withType(SharedLibraryBinarySpec) { + lib project: ':Foundation', library: 'Foundation', linkage: 'shared' + } + withType(StaticLibraryBinarySpec) { + lib project: ':Foundation', library: 'Foundation', linkage: 'static' + } + withType(NativeExecutableSpec) { + lib project: ':Foundation', library: 'Foundation', linkage: 'static' + } + } +} +task samples { dependsOn "assemble" } + + diff --git a/Net/testsuite/build.gradle b/Net/testsuite/build.gradle new file mode 100644 index 000000000..f397ef090 --- /dev/null +++ b/Net/testsuite/build.gradle @@ -0,0 +1,69 @@ +import org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteSpec + +model { + components { + withType(NativeComponentSpec) { + binaries.withType(NativeBinarySpec) { + if (buildType == buildTypes.debug) { + if (it instanceof NativeExecutableBinarySpec) { + executable.file = toLocalBin(appendDebugSuffix(executable.file), targetPlatform) + } + } else + if (buildType == buildTypes.release) { + if (it instanceof NativeExecutableBinarySpec) { + executable.file = toLocalBin(executable.file, targetPlatform) + } + } + } + } + TestSuite(NativeLibrarySpec) { + sources { + cpp { + source { + srcDir 'src' + include '**/*.cpp' + exclude '*Driver.cpp' + } + exportedHeaders { + srcDir 'src' + } + lib project: ':CppUnit', library: 'CppUnit', linkage: 'shared' + lib project: ':Net', library: 'Net', linkage: 'shared' + lib project: ':Foundation', library: 'Foundation', linkage: 'shared' + } + } + } + } + testSuites { + NetTestSuite(org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteSpec) { + testing $.components.TestSuite + } + } + binaries { + all { + if (targetPlatform.operatingSystem.windows) { + linker.args "ws2_32.lib" + linker.args "iphlpapi.lib" + } + } + withType(org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteBinarySpec) { + lib project: ':CppUnit', library: 'CppUnit', linkage: 'shared' + if (toolChain in VisualCpp) { + if (buildType == buildTypes.debug) { + cCompiler.args "/MDd" + cppCompiler.args "/MDd" + } else + if (buildType == buildTypes.release) { + cCompiler.args "/MD" + cppCompiler.args "/MD" + } else { + throw new GradleException("Unknown buildType" + buildType) + } + } + if (toolChain in Gcc) { + } + } + } +} +task testsuite { dependsOn "assemble" } + diff --git a/NetSSL_OpenSSL/build.gradle b/NetSSL_OpenSSL/build.gradle new file mode 100644 index 000000000..188062619 --- /dev/null +++ b/NetSSL_OpenSSL/build.gradle @@ -0,0 +1,41 @@ +model { + components { + NetSSL(NativeLibrarySpec) { + sources { + rc { + source { + srcDir '..' + include 'DLLVersion.rc' + } + } + cpp { + source { + srcDir 'src' + include '**/*.cpp' + } + exportedHeaders { + srcDir 'include' + } + lib library: 'ssl' + lib library: 'crypto' + lib project: ':Crypto', library: 'Crypto' + lib project: ':Net', library: 'Net' + lib project: ':Util', library: 'Util' + lib project: ':Foundation', library: 'Foundation' + } + } + } + } + binaries { + withType(SharedLibraryBinarySpec) { + if (toolChain in VisualCpp) { + cppCompiler.define "NetSSL_EXPORTS" + } + } + withType(StaticLibraryBinarySpec) { + } + } +} +task poco { dependsOn "assemble" } + + diff --git a/NetSSL_OpenSSL/samples/build.gradle b/NetSSL_OpenSSL/samples/build.gradle new file mode 100644 index 000000000..b9b789b03 --- /dev/null +++ b/NetSSL_OpenSSL/samples/build.gradle @@ -0,0 +1,68 @@ +model { + components { + download(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'download/src' include '**/*.cpp' } + cpp.lib project: ':Net', library: 'Net' + cpp.lib project: ':NetSSL_OpenSSL', library: 'NetSSL' + cpp.lib project: ':Crypto', library: 'Crypto' + cpp.lib library: 'crypto' + cpp.lib library: 'ssl' + cpp.lib project: ':Util', library: 'Util' + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + HTTPSTimeServer(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'EchoServer/src' include '**/*.cpp' } + cpp.lib project: ':Net', library: 'Net' + cpp.lib project: ':NetSSL_OpenSSL', library: 'NetSSL' + cpp.lib project: ':Crypto', library: 'Crypto' + cpp.lib library: 'crypto' + cpp.lib library: 'ssl' + cpp.lib project: ':Util', library: 'Util' + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + Mail(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'HTTPFormServer/src' include '**/*.cpp' } + cpp.lib project: ':Net', library: 'Net' + cpp.lib project: ':NetSSL_OpenSSL', library: 'NetSSL' + cpp.lib project: ':Crypto', library: 'Crypto' + cpp.lib library: 'crypto' + cpp.lib library: 'ssl' + cpp.lib project: ':Util', library: 'Util' + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + TwitterClient(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'httpget/src' include '**/*.cpp' } + cpp.lib project: ':Net', library: 'Net' + cpp.lib project: ':NetSSL_OpenSSL', library: 'NetSSL' + cpp.lib project: ':Crypto', library: 'Crypto' + cpp.lib library: 'crypto' + cpp.lib library: 'ssl' + cpp.lib project: ':Util', library: 'Util' + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + } + binaries { + all { + } + withType(SharedLibraryBinarySpec) { + lib project: ':Foundation', library: 'Foundation', linkage: 'shared' + } + withType(StaticLibraryBinarySpec) { + lib project: ':Foundation', library: 'Foundation', linkage: 'static' + } + withType(NativeExecutableSpec) { + lib project: ':Foundation', library: 'Foundation', linkage: 'static' + } + } +} +task samples { dependsOn "assemble" } + + diff --git a/NetSSL_OpenSSL/testsuite/build.gradle b/NetSSL_OpenSSL/testsuite/build.gradle new file mode 100644 index 000000000..3ddc09ce6 --- /dev/null +++ b/NetSSL_OpenSSL/testsuite/build.gradle @@ -0,0 +1,74 @@ +import org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteSpec + +model { + components { + withType(NativeComponentSpec) { + binaries.withType(NativeBinarySpec) { + if (buildType == buildTypes.debug) { + if (it instanceof NativeExecutableBinarySpec) { + executable.file = toLocalBin(appendDebugSuffix(executable.file), targetPlatform) + } + } else + if (buildType == buildTypes.release) { + if (it instanceof NativeExecutableBinarySpec) { + executable.file = toLocalBin(executable.file, targetPlatform) + } + } + } + } + TestSuite(NativeLibrarySpec) { + sources { + cpp { + source { + srcDir 'src' + include '**/*.cpp' + exclude '*Driver.cpp' + } + exportedHeaders { + srcDir 'src' + } + lib project: ':CppUnit', library: 'CppUnit' + lib library: 'crypto' + lib library: 'ssl' + lib project: ':Crypto', library: 'Crypto' + lib project: ':Net', library: 'Net' + lib project: ':NetSSL_OpenSSL', library: 'NetSSL' + lib project: ':Util', library: 'Util' + lib project: ':JSON', library: 'JSON' + lib project: ':XML', library: 'XML' + lib project: ':Foundation', library: 'Foundation' + } + } + binaries.all { + if (targetPlatform.operatingSystem.windows) { + lib library: 'WS2_32', linkage: 'static' + } + } + } + } + testSuites { + NetSSLTestSuite(org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteSpec) { + testing $.components.TestSuite + } + } + binaries { + withType(org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteBinarySpec) { + lib project: ':CppUnit', library: 'CppUnit', linkage: 'shared' + if (toolChain in VisualCpp) { + if (buildType == buildTypes.debug) { + cCompiler.args "/MDd" + cppCompiler.args "/MDd" + } else + if (buildType == buildTypes.release) { + cCompiler.args "/MD" + cppCompiler.args "/MD" + } else { + throw new GradleException("Unknown buildType" + buildType) + } + } + if (toolChain in Gcc) { + } + } + } +} +task testsuite { dependsOn "assemble" } diff --git a/NetSSL_Win/build.gradle b/NetSSL_Win/build.gradle new file mode 100644 index 000000000..544e7089e --- /dev/null +++ b/NetSSL_Win/build.gradle @@ -0,0 +1,46 @@ +model { + components { + NetSSLWin(NativeLibrarySpec) { + binaries.all { + if (targetPlatform.operatingSystem.windows) { + sources { + rc(WindowsResourceSet) { + source { + srcDir '..' + include 'DLLVersion.rc' + } + } + cpp(CppSourceSet) { + source { + srcDir 'src' + include '**/*.cpp' + } + exportedHeaders { + srcDir 'include' + } + lib project: ':Crypto', library: 'Crypto' + lib project: ':Net', library: 'Net' + lib project: ':Util', library: 'Util' + lib project: ':Foundation', library: 'Foundation' + } + } + } + } + } + } + binaries { + all { + if (toolChain in VisualCpp) { + linker.args "Crypt32.lib" + linker.args 'ws2_32.lib' + linker.args 'iphlpapi.lib' + } + } + withType(SharedLibraryBinarySpec) { + if (toolChain in VisualCpp) { + cppCompiler.define "NetSSL_Win_EXPORTS" + } + } + } +} +task poco { dependsOn "assemble" } diff --git a/NetSSL_Win/samples/build.gradle b/NetSSL_Win/samples/build.gradle new file mode 100644 index 000000000..9225dbc98 --- /dev/null +++ b/NetSSL_Win/samples/build.gradle @@ -0,0 +1,56 @@ +model { + components { + download(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'dict/src' include '**/*.cpp' } + cpp.lib project: ':Net', library: 'Net' + cpp.lib project: ':NetSSL_OpenSSL', library: 'NetSSL' + cpp.lib project: ':Crypto', library: 'Crypto' + cpp.lib library: 'crypto' + cpp.lib library: 'ssl' + cpp.lib project: ':Util', library: 'Util' + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + HTTPSTimeServer(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'download/src' include '**/*.cpp' } + cpp.lib project: ':Net', library: 'Net' + cpp.lib project: ':NetSSL_OpenSSL', library: 'NetSSL' + cpp.lib project: ':Crypto', library: 'Crypto' + cpp.lib library: 'crypto' + cpp.lib library: 'ssl' + cpp.lib project: ':Util', library: 'Util' + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + Mail(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'EchoServer/src' include '**/*.cpp' } + cpp.lib project: ':Net', library: 'Net' + cpp.lib project: ':NetSSL_OpenSSL', library: 'NetSSL' + cpp.lib project: ':Crypto', library: 'Crypto' + cpp.lib library: 'crypto' + cpp.lib library: 'ssl' + cpp.lib project: ':Util', library: 'Util' + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + } + binaries { + all { + } + withType(SharedLibraryBinarySpec) { + lib project: ':Foundation', library: 'Foundation', linkage: 'shared' + } + withType(StaticLibraryBinarySpec) { + lib project: ':Foundation', library: 'Foundation', linkage: 'static' + } + withType(NativeExecutableSpec) { + lib project: ':Foundation', library: 'Foundation', linkage: 'static' + } + } +} +task samples { dependsOn "assemble" } + + diff --git a/NetSSL_Win/testsuite/build.gradle b/NetSSL_Win/testsuite/build.gradle new file mode 100644 index 000000000..693834c0a --- /dev/null +++ b/NetSSL_Win/testsuite/build.gradle @@ -0,0 +1,70 @@ +import org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteSpec + +model { + components { + withType(NativeComponentSpec) { + binaries.withType(NativeBinarySpec) { + if (buildType == buildTypes.debug) { + if (it instanceof NativeExecutableBinarySpec) { + executable.file = toLocalBin(appendDebugSuffix(executable.file), targetPlatform) + } + } else + if (buildType == buildTypes.release) { + if (it instanceof NativeExecutableBinarySpec) { + executable.file = toLocalBin(executable.file, targetPlatform) + } + } + } + } + TestSuite(NativeLibrarySpec) { + sources { + cpp { + source { + srcDir 'src' + include '**/*.cpp' + exclude '*Driver.cpp' + } + exportedHeaders { + srcDir 'src' + } + lib project: ':CppUnit', library: 'CppUnit' + lib library: 'crypto' + lib library: 'ssl' + lib project: ':Crypto', library: 'Crypto' + lib project: ':Net', library: 'Net' + lib project: ':NetSSL_OpenSSL', library: 'NetSSL' + lib project: ':Util', library: 'Util' + lib project: ':JSON', library: 'JSON' + lib project: ':XML', library: 'XML' + lib project: ':Foundation', library: 'Foundation' + lib library: 'WS2_32', linkage: 'static' + } + } + } + } + testSuites { + NetSSLTestSuite(org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteSpec) { + testing $.components.TestSuite + } + } + binaries { + withType(org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteBinarySpec) { + lib project: ':CppUnit', library: 'CppUnit', linkage: 'shared' + if (toolChain in VisualCpp) { + if (buildType == buildTypes.debug) { + cCompiler.args "/MDd" + cppCompiler.args "/MDd" + } else + if (buildType == buildTypes.release) { + cCompiler.args "/MD" + cppCompiler.args "/MD" + } else { + throw new GradleException("Unknown buildType" + buildType) + } + } + if (toolChain in Gcc) { + } + } + } +} +task testsuite { dependsOn "assemble" } diff --git a/PDF/build.gradle b/PDF/build.gradle index 3fecdb3b5..a9b7748e8 100644 --- a/PDF/build.gradle +++ b/PDF/build.gradle @@ -20,6 +20,7 @@ project(":PDF") { exportedHeaders { srcDirs 'include', 'include/Poco/PDF' } + lib project: ':XML', library: 'XML' lib project: ':Util', library: 'Util' lib project: ':Foundation', library: 'Foundation' } diff --git a/PageCompiler/File2Page/build.gradle b/PageCompiler/File2Page/build.gradle new file mode 100644 index 000000000..9b6e79957 --- /dev/null +++ b/PageCompiler/File2Page/build.gradle @@ -0,0 +1,29 @@ +project(":PageCompiler:File2Page") { + model { + components { + File2page(NativeExecutableSpec) { + baseName 'f2pc' + sources { + cpp { + source { + srcDir 'src' + include '**/*.cpp' + } + exportedHeaders { + srcDir 'include' + } + lib project: ':Net', library: 'Net' + lib project: ':Util', library: 'Util' + lib project: ':Foundation', library: 'Foundation' + } + } + binaries.withType(NativeExecutableSpec) { + lib project: ':Net', library: 'Net', linkage: 'shared' + lib project: ':Util', library: 'Util', linkage: 'shared' + lib project: ':Foundation', library: 'Foundation', linkage: 'shared' + } + } + } + } +} + diff --git a/PageCompiler/build.gradle b/PageCompiler/build.gradle new file mode 100644 index 000000000..314c23f08 --- /dev/null +++ b/PageCompiler/build.gradle @@ -0,0 +1,41 @@ +model { + components { + cpspc(NativeExecutableSpec) { + sources { + cpp { + source { + srcDir 'src' + include '**/*.cpp' + } + exportedHeaders { + srcDir 'include' + } + lib project: ':Net', library: 'Net', linkage: 'shared' + lib project: ':Util', library: 'Util', linkage: 'shared' + lib project: ':Foundation', library: 'Foundation', linkage: 'shared' + } + } + } + } + binaries { + withType(NativeExecutableBinarySpec) { + if (toolChain in VisualCpp) { + if (buildType == buildTypes.debug) { + cCompiler.args "/MDd" + cppCompiler.args "/MDd" + } else + if (buildType == buildTypes.release) { + cCompiler.args "/MD" + cppCompiler.args "/MD" + } else { + throw new GradleException("Unknown buildType" + buildType) + } + } + if (toolChain in Gcc) { + } + } + } +} +task poco { dependsOn "assemble" } + + diff --git a/PageCompiler/samples/build.gradle b/PageCompiler/samples/build.gradle new file mode 100644 index 000000000..42f74405d --- /dev/null +++ b/PageCompiler/samples/build.gradle @@ -0,0 +1,28 @@ +model { + components { + HTTPTimeServer(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'HTTPTimeServer/src' include '**/*.cpp' } + cpp.lib project: ':Net', library: 'Net' + cpp.lib project: ':Util', library: 'Util' + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + } + binaries { + all { + } + withType(SharedLibraryBinarySpec) { + lib project: ':Foundation', library: 'Foundation', linkage: 'shared' + } + withType(StaticLibraryBinarySpec) { + lib project: ':Foundation', library: 'Foundation', linkage: 'static' + } + withType(NativeExecutableSpec) { + lib project: ':Foundation', library: 'Foundation', linkage: 'static' + } + } +} +task samples { dependsOn "assemble" } + + diff --git a/PocoDoc/build.gradle b/PocoDoc/build.gradle new file mode 100644 index 000000000..de3e17622 --- /dev/null +++ b/PocoDoc/build.gradle @@ -0,0 +1,44 @@ +model { + components { + withType(NativeComponentSpec) { + binaries.withType(NativeBinarySpec) { + if (buildType == buildTypes.debug) { + if (it instanceof NativeExecutableBinarySpec) { + executable.file = toLocalBin(appendDebugSuffix(executable.file), targetPlatform) + } + } else + if (buildType == buildTypes.release) { + if (it instanceof NativeExecutableBinarySpec) { + executable.file = toLocalBin(executable.file, targetPlatform) + } + } + } + } + PocoDoc(NativeExecutableSpec) { + sources { + cpp { + source { + srcDir 'src' + include '**/*.cpp' + } + exportedHeaders { + srcDir 'include' + } + lib project: ':CppParser', library: 'CppParser' + lib project: ':Util', library: 'Util' + lib project: ':Foundation', library: 'Foundation' + } + } + } + } + binaries { + withType(NativeExecutableSpec) { + if (toolChain in VisualCpp) { + } + if (toolChain in Gcc) { + } + } + } +} + + diff --git a/PocoDoc/cfg/mkdoc-gradle.xml b/PocoDoc/cfg/mkdoc-gradle.xml new file mode 100644 index 000000000..349e9e2fb --- /dev/null +++ b/PocoDoc/cfg/mkdoc-gradle.xml @@ -0,0 +1,136 @@ + + + + + ${PocoBuild}/*/include/Poco/*.h + ${PocoBuild}/*/include/Poco/*/*.h + ${PocoBuild}/*/include/Poco/*/*/*.h + ${PocoBuild}/*/include/Poco/*/*.h + ${PocoBuild}/*/*/include/Poco/*/*/*.h + + + *_*.h, + expat*.h, + zconf.h, + zlib.h, + Alignment.h, + QName.h, + CppUnitException.h, + Constants.h, + inffast.h, + PDF/include/*.h, + CppParser/include/*.h, + Data/include/*.h + Data/*/include/*.h + + + + ${PocoBuild}/doc/*.page, + ${PocoBuild}/*/doc/*.page + ${PocoBuild}/*/*/doc/*.page + + + ${PocoBase}/PocoDoc/resources/css, + ${PocoBase}/PocoDoc/resources/js, + ${PocoBase}/PocoDoc/resources/images, + ${PocoBase}/PocoDoc/resources/index.thtml, + ${PocoBuild}/*/doc/images + + + + cl.exe + + ${Includes}, + /I${PocoBase}/openssl/include + /I${VCH}/include, + /I${WDK}/shared + /I${WDK}/um + /I${WDK}/ucrt + /nologo, + /D_DEBUG, + /E, + /C, + /DPOCO_NO_GCC_API_ATTRIBUTE + + ${CLP} + true + + + ${CXX} ${CXXFLAGS} + + ${Includes}, + -I/usr/local/mysql/include, + -I/usr/include/mysql, + -I/usr/include/postgresql, + -D_DEBUG, + -E, + -C, + -DPOCO_NO_GCC_API_ATTRIBUTE + -DPOCO_NO_WINDOWS_H + + + true + + + EN + utf-8 + POCO C++ Libraries + Applied Informatics Software Engineering GmbH and Contributors + http://pocoproject.org/ + + + + All Base Classes + All Symbols + Anonymous + Constructors + Class + Deprecated + Description + Destructor + Direct Base Classes + Enumerations + Functions +
Header
+ if and only if + Inheritance + Inherited Functions + is deprecated and should no longer be used + Known Derived Classes + Library + Member Functions + Member Summary + more... + Namespaces + Namespace + Nested Classes + Package + Packages + Package Index + See also + Struct + Symbol Index + This + Types + Variables + Contents + User Guides and Tutorials + Introduction +
+
+ + + + + c1 + warning + + + + + ConsoleChannel + %s: [%p] %t + + + +
diff --git a/Redis/build.gradle b/Redis/build.gradle new file mode 100644 index 000000000..fd68befb8 --- /dev/null +++ b/Redis/build.gradle @@ -0,0 +1,37 @@ +model { + components { + Redis(NativeLibrarySpec) { + sources { + rc { + source { + srcDir '..' + include 'DLLVersion.rc' + } + } + cpp { + source { + srcDir 'src' + include '**/*.cpp' + } + exportedHeaders { + srcDir 'include' + } + lib project: ':Net', library: 'Net' + lib project: ':Foundation', library: 'Foundation' + } + } + } + } + binaries { + all { + } + withType(SharedLibraryBinarySpec) { + if (toolChain in VisualCpp) { + cppCompiler.define "Redis_EXPORTS" + } + } + } +} +task poco { dependsOn "assemble" } + + diff --git a/Redis/testsuite/build.gradle b/Redis/testsuite/build.gradle new file mode 100644 index 000000000..8c4a09549 --- /dev/null +++ b/Redis/testsuite/build.gradle @@ -0,0 +1,63 @@ +import org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteSpec + +model { + components { + withType(NativeComponentSpec) { + binaries.withType(NativeBinarySpec) { + if (buildType == buildTypes.debug) { + if (it instanceof NativeExecutableBinarySpec) { + executable.file = toLocalBin(appendDebugSuffix(executable.file), targetPlatform) + } + } else + if (buildType == buildTypes.release) { + if (it instanceof NativeExecutableBinarySpec) { + executable.file = toLocalBin(executable.file, targetPlatform) + } + } + } + } + TestSuite(NativeLibrarySpec) { + sources { + cpp { + source { + srcDir 'src' + include '**/*.cpp' + exclude '*Driver.cpp' + } + exportedHeaders { + srcDir 'src' + } + lib project: ':CppUnit', library: 'CppUnit', linkage: 'shared' + lib project: ':Redis', library: 'Redis', linkage: 'shared' + lib project: ':Net', library: 'Net', linkage: 'shared' + lib project: ':Foundation', library: 'Foundation', linkage: 'shared' + } + } + } + } + testSuites { + RedisTestSuite(org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteSpec) { + testing $.components.TestSuite + } + } + binaries { + withType(org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteBinarySpec) { + lib project: ':CppUnit', library: 'CppUnit', linkage: 'shared' + if (toolChain in VisualCpp) { + if (buildType == buildTypes.debug) { + cCompiler.args "/MDd" + cppCompiler.args "/MDd" + } else + if (buildType == buildTypes.release) { + cCompiler.args "/MD" + cppCompiler.args "/MD" + } else { + throw new GradleException("Unknown buildType" + buildType) + } + } + if (toolChain in Gcc) { + } + } + } +} +task testsuite { dependsOn "assemble" } diff --git a/SQL/MySQL/build.gradle b/SQL/MySQL/build.gradle new file mode 100644 index 000000000..574e2033f --- /dev/null +++ b/SQL/MySQL/build.gradle @@ -0,0 +1,104 @@ +model { + repositories { + libs(PrebuiltLibraries) { + mysql { + headers.srcDir "$mysql32Home/include" + binaries.withType(StaticLibraryBinary) { + def libName = "foobar" + if (buildType == buildTypes.debug) { + libName = 'libmysqld.lib' + if (targetPlatform.name == 'win32') { + staticLibraryFile = file("$mysql32Home/lib/$libName") + } else + if (targetPlatform.name == 'win64') { + headers.srcDir "$mysql64Home/include" + staticLibraryFile = file("$mysql64Home/lib/$libName") + } + } else + if (buildType == buildTypes.release) { + libName = 'libmysql.lib' + if (targetPlatform.name == 'win32') { + headers.srcDir "$mysql32Home/include" + staticLibraryFile = file("$mysql32Home/lib/$libName") + } else + if (targetPlatform.name == 'win64') { + headers.srcDir "$mysql64Home/include" + staticLibraryFile = file("$mysql64Home/lib/$libName") + } + } else { + throw new GradleException("Unknown buildType" + buildType) + } + } + binaries.withType(SharedLibraryBinary) { + def dllName + def linkName + if (buildType == buildTypes.debug) { + dllName = 'libmysqld.dll' + linkName = 'libmysqld.lib' + if (targetPlatform.name == 'win32') { + headers.srcDir "$mysql32Home/include" + sharedLibraryFile = file("$mysql32Home/lib/$dllName") + sharedLibraryLinkFile = file("$mysql32Home/lib/$linkName") + } else + if (targetPlatform.name == 'win64') { + headers.srcDir "$mysql64Home/include" + sharedLibraryFile = file("$mysql64Home/lib/$dllName") + sharedLibraryLinkFile = file("$mysql64Home/lib/$linkName") + } + } else + if (buildType == buildTypes.release) { + dllName = 'libmysql.dll' + linkName = 'libmysql.lib' + if (targetPlatform.name == 'win32') { + headers.srcDir "$mysql32Home/include" + sharedLibraryFile = file("$mysql32Home/lib/$dllName") + sharedLibraryLinkFile = file("$mysql32Home/lib/$linkName") + } else + if (targetPlatform.name == 'win64') { + headers.srcDir "$mysql64Home/include" + sharedLibraryFile = file("$mysql64Home/lib/$dllName") + sharedLibraryLinkFile = file("$mysql64Home/lib/$linkName") + } + } else { + throw new GradleException("Unknown buildType" + buildType) + } + } + } + } + } + components { + SQLMySQL(NativeLibrarySpec) { + sources { + cpp { + source { + srcDir 'src' + include '**/*.cpp' + } + exportedHeaders { + srcDir 'include' + } + lib library: 'mysql' + lib project: ':SQL', library: 'SQL' + lib project: ':Foundation', library: 'Foundation' + } + } + } + } + binaries { + all { + cppCompiler.define "THREADSAFE" + cppCompiler.define "__LCC__" + cppCompiler.define "WINVER=0x0600" + } + withType(SharedLibraryBinarySpec) { + if (toolChain in VisualCpp) { + cppCompiler.define "MySQL_EXPORTS" + } + } + withType(StaticLibraryBinarySpec) { + } + } +} +task poco { dependsOn "assemble" } + + diff --git a/SQL/MySQL/testsuite/build.gradle b/SQL/MySQL/testsuite/build.gradle new file mode 100644 index 000000000..f149b4222 --- /dev/null +++ b/SQL/MySQL/testsuite/build.gradle @@ -0,0 +1,73 @@ +import org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteSpec + +model { + components { + withType(NativeComponentSpec) { + binaries.withType(NativeBinarySpec) { + if (buildType == buildTypes.debug) { + if (it instanceof NativeExecutableBinarySpec) { + executable.file = toLocalBin(appendDebugSuffix(executable.file), targetPlatform) + } + } else + if (buildType == buildTypes.release) { + if (it instanceof NativeExecutableBinarySpec) { + executable.file = toLocalBin(executable.file, targetPlatform) + } + } + } + } + TestSuite(NativeLibrarySpec) { + sources { + cpp { + source { + srcDir 'src' + include '**/*.cpp' + exclude '*Driver.cpp' + } + exportedHeaders { + srcDir 'src' + } + lib project: ':CppUnit', library: 'CppUnit', linkage: 'shared' + lib project: ':SQL:MySQL', library: 'mysql', linkage: 'shared' + lib project: ':SQL:MySQL', library: 'SQLMySQL', linkage: 'shared' + lib project: ':SQL', library: 'SQL', linkage: 'shared' + lib project: ':Util', library: 'Util' + lib project: ':JSON', library: 'JSON' + lib project: ':XML', library: 'XML' + lib project: ':Foundation', library: 'Foundation', linkage: 'shared' + } + } + } + } + testSuites { + MySQLTestSuite(org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteSpec) { + testing $.components.TestSuite + } + } + binaries { + all { + cppCompiler.define "THREADSAFE" + cppCompiler.define "__LCC__" + cppCompiler.define "WINVER=0x0600" + } + withType(org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteBinarySpec) { + lib project: ':CppUnit', library: 'CppUnit', linkage: 'shared' + if (toolChain in VisualCpp) { + if (buildType == buildTypes.debug) { + cCompiler.args "/MDd" + cppCompiler.args "/MDd" + } else + if (buildType == buildTypes.release) { + cCompiler.args "/MD" + cppCompiler.args "/MD" + } else { + throw new GradleException("Unknown buildType" + buildType) + } + } + if (toolChain in Gcc) { + } + } + } +} +task testsuite { dependsOn "assemble" } + diff --git a/SQL/ODBC/build.gradle b/SQL/ODBC/build.gradle new file mode 100644 index 000000000..b2f34d96f --- /dev/null +++ b/SQL/ODBC/build.gradle @@ -0,0 +1,46 @@ +model { + components { + SQLODBC(NativeLibrarySpec) { + sources { + rc { + source { + srcDir '../..' + include 'DLLVersion.rc' + } + } + cpp { + source { + srcDir 'src' + include '**/*.cpp' + exclude 'Unicode_WIN32.cpp' + exclude 'Unicode_UNIXODBC.cpp' + } + exportedHeaders { + srcDir 'include' + } + lib project: ':SQL', library: 'SQL' + lib project: ':Foundation', library: 'Foundation' + } + } + } + } + binaries { + all { + if (toolChain in VisualCpp) { + cppCompiler.define "THREADSAFE=1" + } + } + withType(SharedLibraryBinarySpec) { + if (toolChain in VisualCpp) { + cppCompiler.define "ODBC_EXPORTS" + linker.args 'odbc32.lib' + linker.args 'odbccp32.lib' + } + } + withType(StaticLibraryBinarySpec) { + } + } +} +task poco { dependsOn "assemble" } + + diff --git a/SQL/ODBC/testsuite/build.gradle b/SQL/ODBC/testsuite/build.gradle new file mode 100644 index 000000000..04ff1bea8 --- /dev/null +++ b/SQL/ODBC/testsuite/build.gradle @@ -0,0 +1,69 @@ +import org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteSpec + +model { + components { + withType(NativeComponentSpec) { + binaries.withType(NativeBinarySpec) { + if (buildType == buildTypes.debug) { + if (it instanceof NativeExecutableBinarySpec) { + executable.file = toLocalBin(appendDebugSuffix(executable.file), targetPlatform) + } + } else + if (buildType == buildTypes.release) { + if (it instanceof NativeExecutableBinarySpec) { + executable.file = toLocalBin(executable.file, targetPlatform) + } + } + } + } + TestSuite(NativeLibrarySpec) { + sources { + cpp { + source { + srcDir 'src' + include '**/*.cpp' + exclude '*Driver.cpp' + } + exportedHeaders { + srcDir 'src' + } + lib project: ':CppUnit', library: 'CppUnit', linkage: 'shared' + lib project: ':SQL:ODBC', library: 'SQLODBC', linkage: 'shared' + lib project: ':SQL', library: 'SQL', linkage: 'shared' + lib project: ':Foundation', library: 'Foundation', linkage: 'shared' + } + } + } + } + testSuites { + ODBCTestSuite(org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteSpec) { + testing $.components.TestSuite + } + } + binaries { + all { + if (toolChain in VisualCpp) { + linker.args 'odbc32.lib' + linker.args 'odbccp32.lib' + } + } + withType(org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteBinarySpec) { + lib project: ':CppUnit', library: 'CppUnit', linkage: 'shared' + if (toolChain in VisualCpp) { + if (buildType == buildTypes.debug) { + cCompiler.args "/MDd" + cppCompiler.args "/MDd" + } else + if (buildType == buildTypes.release) { + cCompiler.args "/MD" + cppCompiler.args "/MD" + } else { + throw new GradleException("Unknown buildType" + buildType) + } + } + if (toolChain in Gcc) { + } + } + } +} +task testsuite { dependsOn "assemble" } diff --git a/SQL/PostgreSQL/build.gradle b/SQL/PostgreSQL/build.gradle new file mode 100644 index 000000000..fc01764b0 --- /dev/null +++ b/SQL/PostgreSQL/build.gradle @@ -0,0 +1,233 @@ +model { + repositories { + libs(PrebuiltLibraries) { + intl { + binaries.withType(StaticLibraryBinary) { + def libName = "foobar" + if (buildType == buildTypes.debug) { + libName = 'libintl.lib' + if (targetPlatform.name == 'win32') { + headers.srcDir "$postgres32Home/include" + staticLibraryFile = file("$postgres32Home/lib/$libName") + } else + if (targetPlatform.name == 'win64') { + headers.srcDir "$postgres64Home/include" + staticLibraryFile = file("$postgres64Home/lib/$libName") + } + } else + if (buildType == buildTypes.release) { + libName = 'libintl.lib' + if (targetPlatform.name == 'win32') { + headers.srcDir "$postgres32Home/include" + staticLibraryFile = file("$postgres32Home/lib/$libName") + } else + if (targetPlatform.name == 'win64') { + headers.srcDir "$postgres64Home/include" + staticLibraryFile = file("$postgres64Home/lib/$libName") + } + } else { + throw new GradleException("Unknown buildType" + buildType) + } + } + binaries.withType(SharedLibraryBinary) { + def dllName + def linkName + if (buildType == buildTypes.debug) { + dllName = 'libintl-8.dll' + linkName = 'libintl.lib' + if (targetPlatform.name == 'win32') { + headers.srcDir "$postgres32Home/include" + sharedLibraryFile = file("$postgres32Home/bin/$dllName") + sharedLibraryLinkFile = file("$postgres32Home/lib/$linkName") + } else + if (targetPlatform.name == 'win64') { + headers.srcDir "$postgres64Home/include" + sharedLibraryFile = file("$postgres64Home/bin/$dllName") + sharedLibraryLinkFile = file("$postgres64Home/lib/$linkName") + } + } else + if (buildType == buildTypes.release) { + dllName = 'libintl-8.dll' + linkName = 'libintl.lib' + if (targetPlatform.name == 'win32') { + headers.srcDir "$postgres32Home/include" + sharedLibraryFile = file("$postgres32Home/bin/$dllName") + sharedLibraryLinkFile = file("$postgres32Home/lib/$linkName") + } else + if (targetPlatform.name == 'win64') { + headers.srcDir "$postgres64Home/include" + sharedLibraryFile = file("$postgres64Home/bin/$dllName") + sharedLibraryLinkFile = file("$postgres64Home/lib/$linkName") + } + } else { + throw new GradleException("Unknown buildType" + buildType) + } + } + } + iconv { + binaries.withType(StaticLibraryBinary) { + def libName = "foobar" + if (buildType == buildTypes.debug) { + libName = 'iconv.lib' + if (targetPlatform.name == 'win32') { + headers.srcDir "$postgres32Home/include" + staticLibraryFile = file("$postgres32Home/lib/$libName") + } else + if (targetPlatform.name == 'win64') { + headers.srcDir "$postgres64Home/include" + staticLibraryFile = file("$postgres64Home/lib/$libName") + } + } else + if (buildType == buildTypes.release) { + libName = 'iconv.lib' + if (targetPlatform.name == 'win32') { + headers.srcDir "$postgres32Home/include" + staticLibraryFile = file("$postgres32Home/lib/$libName") + } else + if (targetPlatform.name == 'win64') { + headers.srcDir "$postgres64Home/include" + staticLibraryFile = file("$postgres64Home/lib/$libName") + } + } else { + throw new GradleException("Unknown buildType" + buildType) + } + } + binaries.withType(SharedLibraryBinary) { + def dllName + def linkName + if (buildType == buildTypes.debug) { + dllName = 'libiconv-2.dll' + linkName = 'iconv.lib' + if (targetPlatform.name == 'win32') { + headers.srcDir "$postgres32Home/include" + sharedLibraryFile = file("$postgres32Home/bin/$dllName") + sharedLibraryLinkFile = file("$postgres32Home/lib/$linkName") + } else + if (targetPlatform.name == 'win64') { + headers.srcDir "$postgres64Home/include" + sharedLibraryFile = file("$postgres64Home/bin/$dllName") + sharedLibraryLinkFile = file("$postgres64Home/lib/$linkName") + } + } else + if (buildType == buildTypes.release) { + dllName = 'libiconv-2.dll' + linkName = 'iconv.lib' + if (targetPlatform.name == 'win32') { + headers.srcDir "$postgres32Home/include" + sharedLibraryFile = file("$postgres32Home/bin/$dllName") + sharedLibraryLinkFile = file("$postgres32Home/lib/$linkName") + } else + if (targetPlatform.name == 'win64') { + headers.srcDir "$postgres64Home/include" + sharedLibraryFile = file("$postgres64Home/bin/$dllName") + sharedLibraryLinkFile = file("$postgres64Home/lib/$linkName") + } + } else { + throw new GradleException("Unknown buildType" + buildType) + } + } + } + postgres { + binaries.withType(StaticLibraryBinary) { + def libName = "foobar" + if (buildType == buildTypes.debug) { + libName = 'libpq.lib' + if (targetPlatform.name == 'win32') { + headers.srcDir "$postgres32Home/include" + staticLibraryFile = file("$postgres32Home/lib/$libName") + } else + if (targetPlatform.name == 'win64') { + headers.srcDir "$postgres64Home/include" + staticLibraryFile = file("$postgres64Home/lib/$libName") + } + } else + if (buildType == buildTypes.release) { + libName = 'libpq.lib' + if (targetPlatform.name == 'win32') { + headers.srcDir "$postgres32Home/include" + staticLibraryFile = file("$postgres32Home/lib/$libName") + } else + if (targetPlatform.name == 'win64') { + headers.srcDir "$postgres64Home/include" + staticLibraryFile = file("$postgres64Home/lib/$libName") + } + } else { + throw new GradleException("Unknown buildType" + buildType) + } + } + binaries.withType(SharedLibraryBinary) { + def dllName + def linkName + if (buildType == buildTypes.debug) { + dllName = 'libpq.dll' + linkName = 'libpq.lib' + if (targetPlatform.name == 'win32') { + headers.srcDir "$postgres32Home/include" + sharedLibraryFile = file("$postgres32Home/lib/$dllName") + sharedLibraryLinkFile = file("$postgres32Home/lib/$linkName") + } else + if (targetPlatform.name == 'win64') { + headers.srcDir "$postgres64Home/include" + sharedLibraryFile = file("$postgres64Home/lib/$dllName") + sharedLibraryLinkFile = file("$postgres64Home/lib/$linkName") + } + } else + if (buildType == buildTypes.release) { + dllName = 'libpq.dll' + linkName = 'libpq.lib' + if (targetPlatform.name == 'win32') { + headers.srcDir "$postgres32Home/include" + sharedLibraryFile = file("$postgres32Home/lib/$dllName") + sharedLibraryLinkFile = file("$postgres32Home/lib/$linkName") + } else + if (targetPlatform.name == 'win64') { + headers.srcDir "$postgres64Home/include" + sharedLibraryFile = file("$postgres64Home/lib/$dllName") + sharedLibraryLinkFile = file("$postgres64Home/lib/$linkName") + } + } else { + throw new GradleException("Unknown buildType" + buildType) + } + } + } + } + } + components { + SQLPostgreSQL(NativeLibrarySpec) { + sources { + rc { + source { + srcDir '../..' + include 'DLLVersion.rc' + } + } + cpp { + source { + srcDir 'src' + include '**/*.cpp' + } + exportedHeaders { + srcDir 'include' + } + lib library: 'postgres' + lib project: ':SQL', library: 'SQL' + lib project: ':Foundation', library: 'Foundation' + } + } + } + } + binaries { + all { + } + withType(SharedLibraryBinarySpec) { + if (toolChain in VisualCpp) { + cppCompiler.define "PostgreSQL_EXPORTS" + } + } + withType(StaticLibraryBinarySpec) { + } + } +} +task poco { dependsOn "assemble" } + + diff --git a/SQL/PostgreSQL/testsuite/build.gradle b/SQL/PostgreSQL/testsuite/build.gradle new file mode 100644 index 000000000..d5f1415f9 --- /dev/null +++ b/SQL/PostgreSQL/testsuite/build.gradle @@ -0,0 +1,66 @@ +import org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteSpec + +model { + components { + withType(NativeComponentSpec) { + binaries.withType(NativeBinarySpec) { + if (buildType == buildTypes.debug) { + if (it instanceof NativeExecutableBinarySpec) { + executable.file = toLocalBin(appendDebugSuffix(executable.file), targetPlatform) + } + } else + if (buildType == buildTypes.release) { + if (it instanceof NativeExecutableBinarySpec) { + executable.file = toLocalBin(executable.file, targetPlatform) + } + } + } + } + TestSuite(NativeLibrarySpec) { + sources { + cpp { + source { + srcDir 'src' + include '**/*.cpp' + exclude '*Driver.cpp' + } + exportedHeaders { + srcDir 'src' + } + lib project: ':CppUnit', library: 'CppUnit' + lib project: ':SQL:PostgreSQL', library: 'SQLPostgreSQL' + lib project: ':SQL:PostgreSQL', library: 'postgres' + lib project: ':SQL:PostgreSQL', library: 'intl' + lib project: ':SQL:PostgreSQL', library: 'iconv' + lib project: ':SQL', library: 'SQL' + lib project: ':Foundation', library: 'Foundation' + } + } + } + } + testSuites { + PostgreSQLTestSuite(org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteSpec) { + testing $.components.TestSuite + } + } + binaries { + withType(org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteBinarySpec) { + lib project: ':CppUnit', library: 'CppUnit', linkage: 'shared' + if (toolChain in VisualCpp) { + if (buildType == buildTypes.debug) { + cCompiler.args "/MDd" + cppCompiler.args "/MDd" + } else + if (buildType == buildTypes.release) { + cCompiler.args "/MD" + cppCompiler.args "/MD" + } else { + throw new GradleException("Unknown buildType" + buildType) + } + } + if (toolChain in Gcc) { + } + } + } +} +task testsuite { dependsOn "assemble" } diff --git a/SQL/SQLite/build.gradle b/SQL/SQLite/build.gradle new file mode 100644 index 000000000..58560768a --- /dev/null +++ b/SQL/SQLite/build.gradle @@ -0,0 +1,69 @@ +model { + components { + SQLSQLite(NativeLibrarySpec) { + sources { + rc { + source { + srcDir '../..' + include 'DLLVersion.rc' + } + } + c { + source { + srcDir 'src' + include '**/*.c' + } + exportedHeaders { + srcDir 'include' + } + lib project: ':SQL', library: 'SQL' + lib project: ':Foundation', library: 'Foundation' + } + cpp { + source { + srcDir 'src' + include '**/*.cpp' + } + exportedHeaders { + srcDir 'include' + } + lib project: ':SQL', library: 'SQL' + lib project: ':Foundation', library: 'Foundation' + } + } + } + } + binaries { + all { + if (toolChain in VisualCpp) { + cCompiler.define "SQLITE_THREADSAFE=1" + cCompiler.define "SQLITE_ENABLE_FTS3" + cCompiler.define "SQLITE_ENABLE_FTS3_PARENTHESIS" + cCompiler.define "SQLITE_OMIT_UTF16" + cCompiler.define "SQLITE_OMIT_PROGRESS_CALLBACK" + cCompiler.define "SQLITE_OMIT_COMPLETE" + cCompiler.define "SQLITE_OMIT_TCL_VARIABLE" + cCompiler.define "SQLITE_OMIT_DEPRECATED" + + cppCompiler.define "SQLITE_THREADSAFE=1" + cppCompiler.define "SQLITE_ENABLE_FTS3" + cppCompiler.define "SQLITE_ENABLE_FTS3_PARENTHESIS" + cppCompiler.define "SQLITE_OMIT_UTF16" + cppCompiler.define "SQLITE_OMIT_PROGRESS_CALLBACK" + cppCompiler.define "SQLITE_OMIT_COMPLETE" + cppCompiler.define "SQLITE_OMIT_TCL_VARIABLE" + cppCompiler.define "SQLITE_OMIT_DEPRECATED" + } + } + withType(SharedLibraryBinarySpec) { + if (toolChain in VisualCpp) { + cppCompiler.define "SQLite_EXPORTS" + } + } + withType(StaticLibraryBinarySpec) { + } + } +} +task poco { dependsOn "assemble" } + + diff --git a/SQL/SQLite/testsuite/build.gradle b/SQL/SQLite/testsuite/build.gradle new file mode 100644 index 000000000..922a5fbe9 --- /dev/null +++ b/SQL/SQLite/testsuite/build.gradle @@ -0,0 +1,64 @@ +import org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteSpec + +model { + components { + withType(NativeComponentSpec) { + binaries.withType(NativeBinarySpec) { + if (buildType == buildTypes.debug) { + if (it instanceof NativeExecutableBinarySpec) { + executable.file = toLocalBin(appendDebugSuffix(executable.file), targetPlatform) + } + } else + if (buildType == buildTypes.release) { + if (it instanceof NativeExecutableBinarySpec) { + executable.file = toLocalBin(executable.file, targetPlatform) + } + } + } + } + TestSuite(NativeLibrarySpec) { + sources { + cpp { + source { + srcDir 'src' + include '**/*.cpp' + exclude '*Driver.cpp' + } + exportedHeaders { + srcDir 'src' + } + lib project: ':CppUnit', library: 'CppUnit', linkage: 'shared' + lib project: ':SQL:SQLite', library: 'SQLSQLite', linkage: 'shared' + lib project: ':SQL', library: 'SQL', linkage: 'shared' + lib project: ':Foundation', library: 'Foundation', linkage: 'shared' + } + } + } + } + testSuites { + SQLiteTestSuite(org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteSpec) { + testing $.components.TestSuite + } + } + binaries { + withType(org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteBinarySpec) { + lib project: ':CppUnit', library: 'CppUnit', linkage: 'shared' + if (toolChain in VisualCpp) { + if (buildType == buildTypes.debug) { + cCompiler.args "/MDd" + cppCompiler.args "/MDd" + } else + if (buildType == buildTypes.release) { + cCompiler.args "/MD" + cppCompiler.args "/MD" + } else { + throw new GradleException("Unknown buildType" + buildType) + } + } + if (toolChain in Gcc) { + } + } + } +} +task testsuite { dependsOn "assemble" } + diff --git a/SQL/build.gradle b/SQL/build.gradle new file mode 100644 index 000000000..fc88d77b9 --- /dev/null +++ b/SQL/build.gradle @@ -0,0 +1,35 @@ +model { + components { + SQL(NativeLibrarySpec) { + sources { + rc { + source { + srcDir '..' + include 'DLLVersion.rc' + } + } + cpp { + source { + srcDir 'src' + include '**/*.cpp' + } + exportedHeaders { + srcDir 'include' + } + lib project: ':Foundation', library: 'Foundation' + } + } + } + } + binaries { + all { + } + withType(SharedLibraryBinarySpec) { + if (toolChain in VisualCpp) { + cppCompiler.define "SQL_EXPORTS" + } + } + } +} +task poco { dependsOn "assemble" } + diff --git a/SQL/samples/build.gradle b/SQL/samples/build.gradle new file mode 100644 index 000000000..493777cf9 --- /dev/null +++ b/SQL/samples/build.gradle @@ -0,0 +1,69 @@ +model { + components { + Binding(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'Binding/src' include '**/*.cpp' } + cpp.lib project: ':SQL', library: 'SQL' + cpp.lib project: ':SQL:SQLite', library: 'SQLSQLite' + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + RecordSet(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'RecordSet/src' include '**/*.cpp' } + cpp.lib project: ':SQL', library: 'SQL' + cpp.lib project: ':SQL:SQLite', library: 'SQLSQLite' + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + RowFormatter(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'RowFormatter/src' include '**/*.cpp' } + cpp.lib project: ':SQL', library: 'SQL' + cpp.lib project: ':SQL:SQLite', library: 'SQLSQLite' + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + Tuple(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'Tuple/src' include '**/*.cpp' } + cpp.lib project: ':SQL', library: 'SQL' + cpp.lib project: ':SQL:SQLite', library: 'SQLSQLite' + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + TypeHandler(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'TypeHandler/src' include '**/*.cpp' } + cpp.lib project: ':SQL', library: 'SQL' + cpp.lib project: ':SQL:SQLite', library: 'SQLSQLite' + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + WebNotifier(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'WebNotifier/src' include '**/*.cpp' } + cpp.lib project: ':SQL', library: 'SQL' + cpp.lib project: ':SQL:SQLite', library: 'SQLSQLite' + cpp.lib project: ':Net', library: 'Net' + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + } + binaries { + all { + } + withType(SharedLibraryBinarySpec) { + lib project: ':Foundation', library: 'Foundation', linkage: 'shared' + } + withType(StaticLibraryBinarySpec) { + lib project: ':Foundation', library: 'Foundation', linkage: 'static' + } + withType(NativeExecutableSpec) { + lib project: ':Foundation', library: 'Foundation', linkage: 'static' + } + } +} +task samples { dependsOn "assemble" } + + diff --git a/SQL/testsuite/build.gradle b/SQL/testsuite/build.gradle new file mode 100644 index 000000000..f7fc5cc25 --- /dev/null +++ b/SQL/testsuite/build.gradle @@ -0,0 +1,65 @@ +import org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteSpec + +model { + components { + withType(NativeComponentSpec) { + binaries.withType(NativeBinarySpec) { + if (buildType == buildTypes.debug) { + if (it instanceof NativeExecutableBinarySpec) { + executable.file = toLocalBin(appendDebugSuffix(executable.file), targetPlatform) + } + } else + if (buildType == buildTypes.release) { + if (it instanceof NativeExecutableBinarySpec) { + executable.file = toLocalBin(executable.file, targetPlatform) + } + } + } + } + TestSuite(NativeLibrarySpec) { + sources { + cpp { + source { + srcDir 'src' + include '**/*.cpp' + exclude '*Driver.cpp' + exclude 'StatementImpl.cpp' + } + exportedHeaders { + srcDir 'src' + } + lib project: ':CppUnit', library: 'CppUnit', linkage: 'shared' + lib project: ':SQL', library: 'SQL', linkage: 'shared' + lib project: ':Foundation', library: 'Foundation', linkage: 'shared' + } + } + } + } + testSuites { + SQLTestSuite(org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteSpec) { + testing $.components.TestSuite + } + } + binaries { + withType(org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteBinarySpec) { + lib project: ':CppUnit', library: 'CppUnit', linkage: 'shared' + if (toolChain in VisualCpp) { + if (buildType == buildTypes.debug) { + cCompiler.args "/MDd" + cppCompiler.args "/MDd" + } else + if (buildType == buildTypes.release) { + cCompiler.args "/MD" + cppCompiler.args "/MD" + } else { + throw new GradleException("Unknown buildType" + buildType) + } + } + if (toolChain in Gcc) { + } + } + } +} +task testsuite { dependsOn "assemble" } + + diff --git a/SevenZip/samples/build.gradle b/SevenZip/samples/build.gradle new file mode 100644 index 000000000..39456f4f1 --- /dev/null +++ b/SevenZip/samples/build.gradle @@ -0,0 +1,26 @@ +model { + components { + un7zip(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'dict/src' include '**/*.cpp' } + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + } + binaries { + all { + } + withType(SharedLibraryBinarySpec) { + lib project: ':Foundation', library: 'Foundation', linkage: 'shared' + } + withType(StaticLibraryBinarySpec) { + lib project: ':Foundation', library: 'Foundation', linkage: 'static' + } + withType(NativeExecutableSpec) { + lib project: ':Foundation', library: 'Foundation', linkage: 'static' + } + } +} +task samples { dependsOn "assemble" } + + diff --git a/Util/build.gradle b/Util/build.gradle new file mode 100644 index 000000000..f067486b2 --- /dev/null +++ b/Util/build.gradle @@ -0,0 +1,60 @@ +model { + components { + Util(NativeLibrarySpec) { m -> + sources { + rc { + source { + srcDir '..' + include 'DLLVersion.rc' + } + } + c { + source { + srcDir 'src' + include '**/*.c' + } + exportedHeaders { + srcDir 'include' + } + } + cpp { + source { + srcDir 'src' + include '**/*.cpp' + exclude '**/Win*.cpp' + } + exportedHeaders { + srcDir 'include' + } + lib project: ':Foundation', library: 'Foundation' + lib project: ':XML', library: 'XML' + lib project: ':JSON', library: 'JSON' + } + } + binaries.all { + if (targetPlatform.operatingSystem.windows) { + sources { + platformWindows(CppSourceSet) { + lib m.sources.cpp + source { + srcDir 'src' + include '**/Win*.cpp' + } + lib project: ':Foundation', library: 'Foundation' + lib project: ':XML', library: 'XML' + lib project: ':JSON', library: 'JSON' + } + } + } + } + } + } + binaries { + withType(SharedLibraryBinarySpec) { + if (toolChain in VisualCpp) { + cppCompiler.define "Util_EXPORTS" + } + } + } +} +task poco { dependsOn "assemble" } diff --git a/Util/samples/build.gradle b/Util/samples/build.gradle new file mode 100644 index 000000000..58fc2edf0 --- /dev/null +++ b/Util/samples/build.gradle @@ -0,0 +1,48 @@ +model { + components { + pkill(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'pkill/src' include '**/*.cpp' } + cpp.lib project: ':Util', library: 'Util' + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + SampleApp(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'SampleApp/src' include '**/*.cpp' } + cpp.lib project: ':Util', library: 'Util' + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + SampleServer(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'SampleServer/src' include '**/*.cpp' } + cpp.lib project: ':Util', library: 'Util' + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + Units(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'Units/src' include '**/*.cpp' } + cpp.lib project: ':Util', library: 'Util' + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + } + binaries { + all { + } + withType(SharedLibraryBinarySpec) { + lib project: ':Foundation', library: 'Foundation', linkage: 'shared' + } + withType(StaticLibraryBinarySpec) { + lib project: ':Foundation', library: 'Foundation', linkage: 'static' + } + withType(NativeExecutableSpec) { + lib project: ':Foundation', library: 'Foundation', linkage: 'static' + } + } +} +task samples { dependsOn "assemble" } + + diff --git a/Util/testsuite/build.gradle b/Util/testsuite/build.gradle new file mode 100644 index 000000000..21034ab48 --- /dev/null +++ b/Util/testsuite/build.gradle @@ -0,0 +1,86 @@ +import org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteSpec + +model { + components { + withType(NativeComponentSpec) { + binaries.withType(NativeBinarySpec) { + if (buildType == buildTypes.debug) { + if (it instanceof NativeExecutableBinarySpec) { + executable.file = toLocalBin(appendDebugSuffix(executable.file), targetPlatform) + } + } else + if (buildType == buildTypes.release) { + if (it instanceof NativeExecutableBinarySpec) { + executable.file = toLocalBin(executable.file, targetPlatform) + } + } + } + } + TestSuite(NativeLibrarySpec) { m -> + sources { + cpp { + source { + srcDir 'src' + include '**/*.cpp' + exclude 'Win*.cpp' + exclude 'Driver.cpp' + } + exportedHeaders { + srcDir 'src' + } + lib project: ':CppUnit', library: 'CppUnit', linkage: 'shared' + lib project: ':JSON', library: 'JSON', linkage: 'shared' + lib project: ':XML', library: 'XML', linkage: 'shared' + lib project: ':Util', library: 'Util', linkage: 'shared' + lib project: ':Foundation', library: 'Foundation', linkage: 'shared' + } + } + binaries.all { + if (targetPlatform.operatingSystem.windows) { + sources { + platformWindows(CppSourceSet) { + lib m.sources.cpp + source { + srcDir 'src' + include 'Win*.cpp' + exclude '*Driver.cpp' + } + exportedHeaders { + srcDir 'src' + } + lib project: ':CppUnit', library: 'CppUnit', linkage: 'shared' + lib project: ':Util', library: 'Util', linkage: 'shared' + lib project: ':Foundation', library: 'Foundation', linkage: 'shared' + } + } + } + } + } + } + testSuites { + UtilTestSuite(org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteSpec) { + testing $.components.TestSuite + } + } + binaries { + withType(org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteBinarySpec) { + lib project: ':CppUnit', library: 'CppUnit', linkage: 'shared' + if (toolChain in VisualCpp) { + if (buildType == buildTypes.debug) { + cCompiler.args "/MDd" + cppCompiler.args "/MDd" + } else + if (buildType == buildTypes.release) { + cCompiler.args "/MD" + cppCompiler.args "/MD" + } else { + throw new GradleException("Unknown buildType" + buildType) + } + } + if (toolChain in Gcc) { + } + } + } +} +task testsuite { dependsOn "assemble" } + diff --git a/XML/build.gradle b/XML/build.gradle new file mode 100644 index 000000000..48f2bf119 --- /dev/null +++ b/XML/build.gradle @@ -0,0 +1,57 @@ +model { + components { + XML(NativeLibrarySpec) { + sources { + rc { + source { + srcDir '..' + include 'DLLVersion.rc' + } + } + c { + source { + srcDir 'src' + include '**/*.c' + } + exportedHeaders { + srcDir 'include' + } + lib project: ':Foundation', library: 'Foundation' + } + cpp { + source { + srcDir 'src' + include '**/*.cpp' + } + exportedHeaders { + srcDir 'include' + } + lib project: ':Foundation', library: 'Foundation' + } + } + } + } + binaries { + all { + cCompiler.define "XML_STATIC" + cCompiler.define "XML_NS" + cCompiler.define "XML_DTD" + cCompiler.define "HAVE_EXPAT_CONFIG_H" + + cppCompiler.define "XML_STATIC" + cppCompiler.define "XML_NS" + cppCompiler.define "XML_DTD" + cppCompiler.define "HAVE_EXPAT_CONFIG_H" + } + withType(SharedLibraryBinarySpec) { + if (toolChain in VisualCpp) { + cCompiler.define "XML_EXPORTS" + cppCompiler.define "XML_EXPORTS" + } + } + withType(StaticLibraryBinarySpec) { + } + } +} +task poco { dependsOn "assemble" } + diff --git a/XML/samples/build.gradle b/XML/samples/build.gradle new file mode 100644 index 000000000..9bf73e13a --- /dev/null +++ b/XML/samples/build.gradle @@ -0,0 +1,49 @@ +model { + components { + data(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'data/src' include '**/*.cpp' } + cpp.lib project: ':XML', library: 'XML', linkage: 'shared' + cpp.lib project: ':Foundation', library: 'Foundation', linkage: 'shared' + } + } + DOMParser(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'DOMParser/src' include '**/*.cpp' } + cpp.lib project: ':XML', library: 'XML', linkage: 'shared' + cpp.lib project: ':Foundation', library: 'Foundation', linkage: 'shared' + } + } + DOMWriter(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'DOMWriter/src' include '**/*.cpp' } + cpp.lib project: ':XML', library: 'XML', linkage: 'shared' + cpp.lib project: ':Foundation', library: 'Foundation', linkage: 'shared' + } + } + PrettyPrint(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'PrettyPrint/src' include '**/*.cpp' } + cpp.lib project: ':XML', library: 'XML', linkage: 'shared' + cpp.lib project: ':Foundation', library: 'Foundation', linkage: 'shared' + } + } +// RoundTrip(NativeExecutableSpec) { +// sources { +// cpp.source { srcDir 'RoundTrip/src' include '**/*.cpp' } +// cpp.lib project: ':XML', library: 'XML', linkage: 'shared' +// cpp.lib project: ':Foundation', library: 'Foundation', linkage: 'shared' +// } +// } + SAXParser(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'SAXParser/src' include '**/*.cpp' } + cpp.lib project: ':XML', library: 'XML', linkage: 'shared' + cpp.lib project: ':Foundation', library: 'Foundation', linkage: 'shared' + } + } + } +} +task samples { dependsOn "assemble" } + + diff --git a/XML/testsuite/build.gradle b/XML/testsuite/build.gradle new file mode 100644 index 000000000..583e58f3f --- /dev/null +++ b/XML/testsuite/build.gradle @@ -0,0 +1,62 @@ +import org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteSpec + +model { + components { + withType(NativeComponentSpec) { + binaries.withType(NativeBinarySpec) { + if (buildType == buildTypes.debug) { + if (it instanceof NativeExecutableBinarySpec) { + executable.file = toLocalBin(appendDebugSuffix(executable.file), targetPlatform) + } + } else + if (buildType == buildTypes.release) { + if (it instanceof NativeExecutableBinarySpec) { + executable.file = toLocalBin(executable.file, targetPlatform) + } + } + } + } + TestSuite(NativeLibrarySpec) { + sources { + cpp { + source { + srcDir 'src' + include '**/*.cpp' + exclude '*Driver.cpp' + } + exportedHeaders { + srcDir 'src' + } + lib project: ':CppUnit', library: 'CppUnit', linkage: 'shared' + lib project: ':XML', library: 'XML', linkage: 'shared' + lib project: ':Foundation', library: 'Foundation', linkage: 'shared' + } + } + } + } + testSuites { + XMLTestSuite(org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteSpec) { + testing $.components.TestSuite + } + } + binaries { + withType(org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteBinarySpec) { + lib project: ':CppUnit', library: 'CppUnit', linkage: 'shared' + if (toolChain in VisualCpp) { + if (buildType == buildTypes.debug) { + cCompiler.args "/MDd" + cppCompiler.args "/MDd" + } else + if (buildType == buildTypes.release) { + cCompiler.args "/MD" + cppCompiler.args "/MD" + } else { + throw new GradleException("Unknown buildType" + buildType) + } + } + if (toolChain in Gcc) { + } + } + } +} +task testsuite { dependsOn "assemble" } diff --git a/Zip/build.gradle b/Zip/build.gradle new file mode 100644 index 000000000..e36e92c8c --- /dev/null +++ b/Zip/build.gradle @@ -0,0 +1,38 @@ +model { + components { + Zip(NativeLibrarySpec) { + sources { + rc { + source { + srcDir '..' + include 'DLLVersion.rc' + } + } + cpp { + source { + srcDir 'src' + include '**/*.cpp' + } + exportedHeaders { + srcDir 'include' + } + lib project: ':Foundation', library: 'Foundation' + } + } + } + } + binaries { + all { + } + withType(SharedLibraryBinarySpec) { + if (toolChain in VisualCpp) { + cppCompiler.define "Zip_EXPORTS" + } + } + withType(StaticLibraryBinarySpec) { + } + } +} +task poco { dependsOn "assemble" } + + diff --git a/Zip/samples/build.gradle b/Zip/samples/build.gradle new file mode 100644 index 000000000..52f01e3e5 --- /dev/null +++ b/Zip/samples/build.gradle @@ -0,0 +1,36 @@ +model { + components { + zip(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'zip/src' include '**/*.cpp' } + cpp.lib project: ':Zip', library: 'Zip' + cpp.lib project: ':Util', library: 'Util' + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + unzip(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'unzip/src' include '**/*.cpp' } + cpp.lib project: ':Zip', library: 'Zip' + cpp.lib project: ':Util', library: 'Util' + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + } + binaries { + all { + } + withType(SharedLibraryBinarySpec) { + lib project: ':Foundation', library: 'Foundation', linkage: 'shared' + } + withType(StaticLibraryBinarySpec) { + lib project: ':Foundation', library: 'Foundation', linkage: 'static' + } + withType(NativeExecutableSpec) { + lib project: ':Foundation', library: 'Foundation', linkage: 'static' + } + } +} +task samples { dependsOn "assemble" } + + diff --git a/Zip/testsuite/build.gradle b/Zip/testsuite/build.gradle new file mode 100644 index 000000000..f783bfca2 --- /dev/null +++ b/Zip/testsuite/build.gradle @@ -0,0 +1,62 @@ +import org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteSpec + +model { + components { + withType(NativeComponentSpec) { + binaries.withType(NativeBinarySpec) { + if (buildType == buildTypes.debug) { + if (it instanceof NativeExecutableBinarySpec) { + executable.file = toLocalBin(appendDebugSuffix(executable.file), targetPlatform) + } + } else + if (buildType == buildTypes.release) { + if (it instanceof NativeExecutableBinarySpec) { + executable.file = toLocalBin(executable.file, targetPlatform) + } + } + } + } + TestSuite(NativeLibrarySpec) { + sources { + cpp { + source { + srcDir 'src' + include '**/*.cpp' + exclude '*Driver.cpp' + } + exportedHeaders { + srcDir 'src' + } + lib project: ':CppUnit', library: 'CppUnit', linkage: 'shared' + lib project: ':Zip', library: 'Zip', linkage: 'shared' + lib project: ':Foundation', library: 'Foundation', linkage: 'shared' + } + } + } + } + testSuites { + ZipTestSuite(org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteSpec) { + testing $.components.TestSuite + } + } + binaries { + withType(org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteBinarySpec) { + lib project: ':CppUnit', library: 'CppUnit', linkage: 'shared' + if (toolChain in VisualCpp) { + if (buildType == buildTypes.debug) { + cCompiler.args "/MDd" + cppCompiler.args "/MDd" + } else + if (buildType == buildTypes.release) { + cCompiler.args "/MD" + cppCompiler.args "/MD" + } else { + throw new GradleException("Unknown buildType" + buildType) + } + } + if (toolChain in Gcc) { + } + } + } +} +task testsuite { dependsOn "assemble" } diff --git a/appveyor.yml b/appveyor.yml index 04cad7086..cf141e401 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -488,7 +488,7 @@ test_script: { if ($env:builder -eq "cygwin") { - $LastExitCode=0; + $global:LastExitCode=0; if ($env:platform -eq "Win32") { $cmd = 'C:\cygwin\usr\sbin\cygserver.exe "&"';iex "& $cmd" diff --git a/build.gradle b/build.gradle new file mode 100644 index 000000000..8803c8321 --- /dev/null +++ b/build.gradle @@ -0,0 +1,1053 @@ +buildscript { +} + +/* +dependencies { + testCompile group: 'org.jvnet.hudson.plugins', name: 'cppunit', version: '1.10' +} +*/ +/* +dependencies { + classpath group: 'org.pocoproject', name: 'cppunit-test-suite', version:'1.0.0' + classpath group: 'org.pocoproject', name: 'windows-message-compiler', version:'1.0.0' +} +*/ +plugins { + id 'net.saliman.cobertura' version '2.5.1' +// id 'com.jfrog.artifactory' version '4.1' +} +apply plugin: 'base' + +def os = org.gradle.internal.os.OperatingSystem.current() +def String version = file("VERSION").text.replaceAll("[\n\r]", "") + +File appendDebugSuffix(File binaryFile) { + String name = binaryFile.getName() + File parent = binaryFile.getParentFile() + int extensionSeparatorIndex = name.lastIndexOf('.') + if (extensionSeparatorIndex == -1) { + return new File(parent, name + "d") + } + return new File(parent, name.substring(0, extensionSeparatorIndex) + "d" + name.substring(extensionSeparatorIndex)) +} + +File appendStaticSuffix(File binaryFile) { + def os = org.gradle.internal.os.OperatingSystem.current() + if (!os.windows) { + return binaryFile + } + String name = binaryFile.getName() + File parent = binaryFile.getParentFile() + int extensionSeparatorIndex = name.lastIndexOf('.') + if (extensionSeparatorIndex == -1) { + return new File(parent, name + "MT") + } + return new File(parent, name.substring(0, extensionSeparatorIndex) + "MT" + name.substring(extensionSeparatorIndex)) +} +File appendSemiStaticSuffix(File binaryFile) { + String name = binaryFile.getName() + File parent = binaryFile.getParentFile() + int extensionSeparatorIndex = name.lastIndexOf('.') + if (extensionSeparatorIndex == -1) { + return new File(parent, name + "MD") + } + return new File(parent, name.substring(0, extensionSeparatorIndex) + "MD" + name.substring(extensionSeparatorIndex)) +} +File prefixByPoco(File binaryFile) { + String name = binaryFile.getName() + String prefix = '' + if (name.startsWith('lib')) { + prefix = 'lib' + name = name.substring(3) + } + File parent = binaryFile.getParentFile() + return new File(parent, prefix + "Poco" + name); +} +File suffixByArch(File binaryFile, Platform platform) { + if (!platform.operatingSystem.windows) { + return binaryFile + } + String name = binaryFile.getName() + String suffix = '' + if (platform.architecture.name == 'x86') { + suffix = '' + } else + if (platform.architecture.name == 'x86-64') { + suffix = '64' + } else { + throw new GradleException("Unknown architecture: " + platform.architecture.name) + } + int extensionSeparatorIndex = name.lastIndexOf('.') + if (extensionSeparatorIndex == -1) { + return new File(parent, name + suffix) + } + File parent = binaryFile.getParentFile() + return new File(parent, name.substring(0, extensionSeparatorIndex) + suffix + name.substring(extensionSeparatorIndex)); +} +File toLocalBin(File binaryFile, Platform platform) { + String name = binaryFile.getName() + String target + if (platform.architecture.name == 'x86') { + target = 'bin' + } else + if (platform.architecture.name == 'x86-64') { + target = 'bin64' + } else { + throw new GradleException("Unknown architecture: " + platform.architecture.name) + } + File parent = new File(target) + return new File(parent, name); +} +File toBin(File sharedFile, Platform platform) { + File parent = sharedFile.parentFile + if (parent.canonicalPath.contains("testsuite")) + return sharedFile; + if (parent.canonicalPath.contains("sample")) + return sharedFile; + + if (platform.operatingSystem.linux) { + return toLib(sharedFile, platform) + } + + String name = sharedFile.getName() + String target + if (platform.architecture.name == 'x86') { + target = 'bin' + } else + if (platform.architecture.name == 'x86-64') { + target = 'bin64' + } else { + throw new GradleException("Unknown architecture: " + platform.architecture.name) + } + File newParent = new File(rootDir, target) + return new File(newParent, name); +} +File toLib(File linkFile, Platform platform) { + File parent = linkFile.parentFile + if (parent.canonicalPath.contains("testsuite")) + return linkFile; + if (parent.canonicalPath.contains("sample")) + return linkFile; + + // On macOS, it creates a dylib file which is the shared and import library + if (platform.operatingSystem.macOsX) { + return toBin(linkFile, platform) + } + + String name = linkFile.getName() + String target + if (platform.architecture.name == 'x86') { + target = 'lib' + } else + if (platform.architecture.name == 'x86-64') { + target = 'lib64' + } else { + throw new GradleException("Unknown architecture: " + platform.architecture.name) + } + File newParent = new File(rootDir, target ) + return new File(newParent, name); +} +File toStatic(File staticFile, Platform platform) { + String name = staticFile.getName() + String target + if (platform.architecture.name == 'x86') { + target = 'lib' + } else + if (platform.architecture.name == 'x86-64') { + target = 'lib64' + } else { + throw new GradleException("Unknown architecture: " + platform.architecture.name) + } + File parent = new File(rootDir, target) + return new File(parent, name); +} +File toPDB(File binaryFile) { + String name = binaryFile.getName() + File parent = binaryFile.getParentFile() + int extensionSeparatorIndex = name.lastIndexOf('.') + return new File(parent, name.substring(0, extensionSeparatorIndex) + ".pdb") +} +File makePreBuildLibrary(String name, Platform platform) { + File pbl + if (platform.architecture.name == 'x86') { + pbl = new File(WDKHome + "/Lib/" + WDKVers + "/um/x86/" + name + ".lib") + + } else + if (platform.architecture.name == 'x86-64') { + pbl = new File(WDKHome + "/Lib/" + WDKVers + "/um/x64/" + name + ".lib") + } else + if (platform.architecture.name == 'arm-v7') { + pbl = new File(WDKHome + "/Lib/" + WDKVers + "/um/arm-v7/" + name + ".lib") + } else + if (platform.architecture.name == 'ia-64') { + pbl = new File(WDKHome + "/Lib/" + WDKVers + "/um/ia-64/" + name + ".lib") + } else { + throw new GradleException("Unknown architecture: " + platform.architecture.name) + } + return pbl +} +class SliceTasksPlugin extends RuleSource { + @Mutate + void createBuildSliceTask(ModelMap tasks, BinaryContainer binaries, BuildTypeContainer buildTypes) { + tasks.create("slice") { + dependsOn binaries.withType(NativeBinarySpec).findAll { + it.buildable && + it.buildType == buildTypes.debug && + it.targetPlatform.architecture.name == 'x86' && + it instanceof SharedLibraryBinarySpec + } + } + } +} + +allprojects { + buildDir = new File('root') // DO NOT REMOVE OR CHANGE to 'build' since 'build' is a Poco directory + file('bin').mkdirs() + file('bin64').mkdirs() + file('lib').mkdirs() + file('lib64').mkdirs() +/* + clean.doFirst { + file(projectDir, 'bin').delete() + file(projectDir, 'bin64').delete() + file(projectDir, 'lib').delete() + file(projectDir, 'lib64').delete() + } +*/ +} +subprojects { + apply plugin: 'c' + apply plugin: 'cpp' + apply plugin: 'cppunit-test-suite' + apply plugin: 'windows-resources' + apply plugin: 'windows-messages' + apply plugin: SliceTasksPlugin + + buildDir = new File("gradle") + + + model { + buildTypes { + release + debug + } + +/* + toolChains { + visualCpp(VisualCpp) { + // Specify the installDir if Visual Studio cannot be located +// installDir "C:/Program Files (x86)/Microsoft Visual Studio/2017/Community" +// installDir "C:/Program Files (x86)/Microsoft Visual Studio 14.0" + } + + gcc(Gcc) { + // Uncomment to use a GCC install that is not in the PATH + // path "/usr/bin/gcc" + } + clang(Clang) + } +*/ + platforms { + win32 { + operatingSystem "windows" + architecture 'x86' + } + win64 { + operatingSystem "windows" + architecture 'x64' + } + linux32 { + operatingSystem "linux" + architecture 'x86' + } + linux64 { + operatingSystem "linux" + architecture 'x64' + } + macos { + operatingSystem "macosx" + architecture 'x64' + } + } + + flavors { + bundled +// unbundled + } + repositories { + libs(PrebuiltLibraries) { + WS2_32 { + headers.srcDir WDKHome + "/Include/" + WDKVers + "/um/x86" + binaries.withType(StaticLibraryBinary) { + if (targetPlatform.operatingSystem.windows) { + staticLibraryFile = makePreBuildLibrary("WS2_32", targetPlatform) + println "staticLibraryFile=" + staticLibraryFile + } + } + } + def opensslHome = new File(rootDir, "openssl/VS_120") + def opensslBrewHome = new File('/usr/local/opt/openssl') + def opensslLinuxHome = new File('/usr/lib/x86_64-linux-gnu') + crypto { + headers.srcDir "$opensslHome/include" + + binaries.withType(StaticLibraryBinary) { + def libName = "foobar" + if (buildType == buildTypes.debug) { + if (targetPlatform.name == 'win32') { + libName = 'libcrypto.lib' + staticLibraryFile = file("$opensslHome/win32/lib/debug/$libName") + } else if (targetPlatform.name == 'win64') { + libName = 'libcrypto.lib' + staticLibraryFile = file("$opensslHome/win64/lib/debug/$libName") + } else if (targetPlatform.operatingSystem.macOsX) { + libName = 'libcrypto.a' + staticLibraryFile = file("$opensslBrewHome/lib/$libName") + } else if (targetPlatform.operatingSystem.linux) { + libName = 'libcrypto.a' + staticLibraryFile = file("$opensslLinuxHome/$libName") + } + } else + if (buildType == buildTypes.release) { + if (targetPlatform.name == 'win32') { + libName = 'libcrypto.lib' + staticLibraryFile = file("$opensslHome/win32/lib/release/$libName") + } else if (targetPlatform.name == 'win64') { + libName = 'libcrypto.lib' + staticLibraryFile = file("$opensslHome/win64/lib/release/$libName") + } else if (targetPlatform.operatingSystem.macOsX) { + libName = 'libcrypto.a' + staticLibraryFile = file("$opensslBrewHome/lib/$libName") + } else if (targetPlatform.operatingSystem.linux) { + libName = 'libcrypto.a' + staticLibraryFile = file("$opensslLinuxHome/$libName") + } + } else { + throw new GradleException("Unknown buildType" + buildType) + } + } + binaries.withType(SharedLibraryBinary) { + def dllName + def linkName + if (buildType == buildTypes.debug) { + if (targetPlatform.name == 'win32') { + dllName = 'libcrypto.dll' + linkName = 'libcrypto.lib' + sharedLibraryFile = file("$opensslHome/win32/bin/debug/$dllName") + sharedLibraryLinkFile = file("$opensslHome/win32/bin/debug/$linkName") + } else if (targetPlatform.name == 'win64') { + dllName = 'libcrypto.dll' + linkName = 'libcrypto.lib' + sharedLibraryFile = file("$opensslHome/win64/bin/debug/$dllName") + sharedLibraryLinkFile = file("$opensslHome/win64/bin/debug/$linkName") + } else if (targetPlatform.operatingSystem.macOsX) { + dllName = 'libcrypto.dylib' + linkName = 'libcrypto.dylib' + sharedLibraryFile = file("$opensslBrewHome/lib/$dllName") + sharedLibraryLinkFile = file("$opensslBrewHome/lib/$linkName") + } else if (targetPlatform.operatingSystem.linux) { + dllName = 'libcrypto.so' + linkName = 'libcrypto.so' + sharedLibraryFile = file("$opensslLinuxHome/$dllName") + sharedLibraryLinkFile = file("$opensslLinuxHome/$linkName") + } + } else + if (buildType == buildTypes.release) { + if (targetPlatform.name == 'win32') { + dllName = 'libcrypto.dll' + linkName = 'libcrypto.lib' + sharedLibraryFile = file("$opensslHome/win32/bin/release/$dllName") + sharedLibraryLinkFile = file("$opensslHome/win32/bin/release/$linkName") + } else if (targetPlatform.name == 'win64') { + dllName = 'libcrypto.dll' + linkName = 'libcrypto.lib' + sharedLibraryFile = file("$opensslHome/win64/bin/release/$dllName") + sharedLibraryLinkFile = file("$opensslHome/win64/bin/release/$linkName") + } else if (targetPlatform.operatingSystem.macOsX) { + dllName = 'libcrypto.dylib' + linkName = 'libcrypto.dylib' + sharedLibraryFile = file("$opensslBrewHome/lib/$dllName") + sharedLibraryLinkFile = file("$opensslBrewHome/lib/$linkName") + } else if (targetPlatform.operatingSystem.linux) { + dllName = 'libcrypto.so' + linkName = 'libcrypto.so' + sharedLibraryFile = file("$opensslLinuxHome/$dllName") + sharedLibraryLinkFile = file("$opensslLinuxHome/$linkName") + } + } else { + throw new GradleException("Unknown buildType" + buildType) + } + } + } + ssl { + headers.srcDir "$opensslHome/include" + + binaries.withType(StaticLibraryBinary) { + def libName + if (buildType == buildTypes.debug) { + if (targetPlatform.name == 'win32') { + libName = 'libssl.lib' + staticLibraryFile = file("$opensslHome/win32/lib/debug/$libName") + } else if (targetPlatform.name == 'win64') { + libName = 'libssl.lib' + staticLibraryFile = file("$opensslHome/win64/lib/debug/$libName") + } else if (targetPlatform.operatingSystem.macOsX) { + libName = 'libssl.a' + staticLibraryFile = file("$opensslBrewHome/lib/$libName") + } else if (targetPlatform.operatingSystem.linux) { + libName = 'libssl.a' + staticLibraryFile = file("$opensslLinuxHome/$libName") + } + } else + if (buildType == buildTypes.release) { + if (targetPlatform.name == 'win32') { + libName = 'libssl.lib' + staticLibraryFile = file("$opensslHome/win32/lib/release/$libName") + } else if (targetPlatform.name == 'win64') { + libName = 'libssl.lib' + staticLibraryFile = file("$opensslHome/win64/lib/release/$libName") + } else if (targetPlatform.operatingSystem.macOsX) { + libName = 'libssl.a' + staticLibraryFile = file("$opensslBrewHome/lib/$libName") + } else if (targetPlatform.operatingSystem.linux) { + libName = 'libssl.a' + staticLibraryFile = file("$opensslLinuxHome/$libName") + } + } else { + throw new GradleException("Unknown buildType" + buildType) + } + } + binaries.withType(SharedLibraryBinary) { + def dllName + def linkName + if (buildType == buildTypes.debug) { + if (targetPlatform.name == 'win32') { + dllName = 'libssl.dll' + linkName = 'libssl.lib' + sharedLibraryFile = file("$opensslHome/win32/bin/debug/$dllName") + sharedLibraryLinkFile = file("$opensslHome/win32/bin/debug/$linkName") + } else if (targetPlatform.name == 'win64') { + dllName = 'libssl.dll' + linkName = 'libssl.lib' + sharedLibraryFile = file("$opensslHome/win64/bin/debug/$dllName") + sharedLibraryLinkFile = file("$opensslHome/win64/bin/debug/$linkName") + } else if (targetPlatform.operatingSystem.macOsX) { + dllName = 'libssl.dylib' + linkName = 'libssl.dylib' + sharedLibraryFile = file("$opensslBrewHome/lib/$dllName") + sharedLibraryLinkFile = file("$opensslBrewHome/lib/$linkName") + } else if (targetPlatform.operatingSystem.linux) { + dllName = 'libssl.so' + linkName = 'libssl.so' + sharedLibraryFile = file("$opensslLinuxHome/$dllName") + sharedLibraryLinkFile = file("$opensslLinuxHome/$linkName") + } + } else if (buildType == buildTypes.release) { + if (targetPlatform.name == 'win32') { + dllName = 'libssl.dll' + linkName = 'libssl.lib' + sharedLibraryFile = file("$opensslHome/win32/bin/release/$dllName") + sharedLibraryLinkFile = file("$opensslHome/win32/bin/release/$linkName") + } else if (targetPlatform.name == 'win64') { + dllName = 'libssl.dll' + linkName = 'libssl.lib' + sharedLibraryFile = file("$opensslHome/win64/bin/release/$dllName") + sharedLibraryLinkFile = file("$opensslHome/win64/bin/release/$linkName") + } else if (targetPlatform.operatingSystem.macOsX) { + dllName = 'libssl.dylib' + linkName = 'libssl.dylib' + sharedLibraryFile = file("$opensslBrewHome/lib/$dllName") + sharedLibraryLinkFile = file("$opensslBrewHome/lib/$linkName") + } else if (targetPlatform.operatingSystem.linux) { + dllName = 'libssl.so' + linkName = 'libssl.so' + sharedLibraryFile = file("$opensslLinuxHome/$dllName") + sharedLibraryLinkFile = file("$opensslLinuxHome/$linkName") + } + } else { + throw new GradleException("Unknown buildType" + buildType) + } + } + } + } + } + components { + withType(NativeComponentSpec) { + targetPlatform "win32" + targetPlatform "win64" + targetPlatform "linux32" + targetPlatform "linux64" + targetPlatform "macos" + + binaries.withType(NativeTestSuiteBinarySpec) { + if (buildType == buildTypes.debug) { + if (it instanceof NativeExecutableBinarySpec) { + executable.file = toLocalBin(appendDebugSuffix(executable.file), targetPlatform) + } + } else + if (buildType == buildTypes.release) { + if (it instanceof NativeExecutableBinarySpec) { + executable.file = toLocalBin(executable.file, targetPlatform) + } + } + } + binaries.withType(NativeBinarySpec) { + + if (toolChain in Clang) { + cppCompiler.args "-std=c++11" + } + if (buildType == buildTypes.debug) { + if (it instanceof SharedLibraryBinarySpec) { + sharedLibraryFile = toBin(prefixByPoco(appendDebugSuffix(suffixByArch(sharedLibraryFile, targetPlatform))), targetPlatform) + sharedLibraryLinkFile = toLib(prefixByPoco(appendDebugSuffix(sharedLibraryLinkFile)), targetPlatform) + + if (targetPlatform.operatingSystem.windows) { + // WINDOWS ONLY + linker.args "/implib:${sharedLibraryLinkFile}" // For MSVC only + // use the following for MinGW + // linker.args "-Wl,--out-implib,${sharedLibraryLinkFile}" + // This next part is simply to ensure the directory is created as the compiler (tested on MSVC only) won't create it + def binary = it // Simply to expose the binary in the `doFirst` + tasks.withType(LinkSharedLibrary) { + doFirst { + binary.sharedLibraryLinkFile.parentFile.mkdirs() + } + } + } + } else + if (it instanceof StaticLibraryBinarySpec) { + staticLibraryFile = toStatic(prefixByPoco(appendDebugSuffix(appendStaticSuffix(staticLibraryFile))), targetPlatform) + def binary = it + tasks.withType(CreateStaticLibrary) { + doFirst { + binary.staticLibraryFile.parentFile.mkdirs() + } + } + } else + if (it instanceof SemiStaticLibraryBinarySpec) { + semiStaticLibraryFile = toStatic(prefixByPoco(appendDebugSuffix(appendSemiStaticSuffix(semiStaticLibraryFile))), targetPlatform) + } else + if (it instanceof NativeExecutableBinarySpec) { + executable.file = toBin(appendDebugSuffix(executable.file), targetPlatform) + } else { + throw new GradleException("Unknown native library binary") + } + } else + if (buildType == buildTypes.release) { + if (it instanceof SharedLibraryBinarySpec) { + sharedLibraryFile = toBin(prefixByPoco(suffixByArch(sharedLibraryFile, targetPlatform)), targetPlatform) + sharedLibraryLinkFile = toLib(prefixByPoco(sharedLibraryLinkFile), targetPlatform) + + if (targetPlatform.operatingSystem.windows) { + // WINDOWS ONLY + linker.args "/implib:${sharedLibraryLinkFile}" // For MSVC only + // use the following for MinGW + // linker.args "-Wl,--out-implib,${sharedLibraryLinkFile}" + // This next part is simply to ensure the directory is created as the compiler (tested on MSVC only) won't create it + def binary = it // Simply to expose the binary in the `doFirst` + tasks.withType(LinkSharedLibrary) { + doFirst { + binary.sharedLibraryLinkFile.parentFile.mkdirs() + } + } + } + } else + if (it instanceof StaticLibraryBinarySpec) { + staticLibraryFile = toStatic(prefixByPoco(appendStaticSuffix(staticLibraryFile)), targetPlatform) + def binary = it + tasks.withType(CreateStaticLibrary) { + doFirst { + binary.staticLibraryFile.parentFile.mkdirs() + } + } + } else + if (it instanceof SemiStaticLibraryBinarySpec) { + semiStaticLibraryFile = toStatic(prefixByPoco(appendSemiStaticSuffix(semiStaticLibraryFile)), targetPlatform) + def binary = it + tasks.withType(CreateSemiStaticLibrary) { + doFirst { + binary.semiStaticLibraryFile.parentFile.mkdirs() + } + } + } else + if (it instanceof NativeExecutableBinarySpec) { + executable.file = toBin(executable.file, targetPlatform) + } else { + throw new GradleException("Unknown native library binary") + } + } else { + throw new GradleException("Unknown buildType" + buildType) + } + } + } + } + + + binaries { + all { + if (flavor != flavors.bundled) { + cCompiler.define 'POCO_UNBUNDLED' + cppCompiler.define 'POCO_UNBUNDLED' + } + if (buildType == buildTypes.debug) { + cCompiler.define '_DEBUG' + cppCompiler.define '_DEBUG' + } else + if (buildType == buildTypes.release) { + cCompiler.define 'NDEBUG' + cppCompiler.define 'NDEBUG' + } + + if (toolChain in Gcc) { + cppCompiler.define "_XOPEN_SOURCE=600" + cppCompiler.define "_REENTRANT" + cppCompiler.define "_THREAD_SAFE" + cppCompiler.define "_FILE_OFFSET_BITS=64" + cppCompiler.define "_LARGEFILE64_SOURCE" + cppCompiler.define "POCO_HAVE_FD_EPOLL" + cppCompiler.define "POCO_HAVE_ADDRINFO" + cppCompiler.define "POCO_HAVE_LIBRESOLV" + cppCompiler.args "-std=c++11" + cppCompiler.args "-fPIC" + + linker.args "-lrt" + linker.args "-ldl" + linker.args "-lpthread" + } + if (toolChain in VisualCpp) { + if (targetPlatform == platforms.win64) { + linker.args '/MACHINE:X64' + } else { + linker.args '/MACHINE:X86' + } + if (buildType == buildTypes.debug) { + cCompiler.args '/Zi' + cppCompiler.args '/Zi' + linker.args '/DEBUG' + } + cCompiler.args '/RTC1' + cCompiler.args '/FS' + cCompiler.args '/Zc:wchar_t' + cCompiler.args '/Zc:inline' + cCompiler.args '/Zc:forScope' + cCompiler.args '/GR' + cCompiler.args '/GF' + cCompiler.args '/EHsc' + cCompiler.args '/bigobj' + cCompiler.define 'WIN32' + cCompiler.define '_WIN32' + cCompiler.define '_WINDOWS' + cCompiler.define '_MBCS' + + cppCompiler.args '/RTC1' + cppCompiler.args '/FS' + cppCompiler.args '/Zc:wchar_t' + cppCompiler.args '/Zc:inline' + cppCompiler.args '/Zc:forScope' + cppCompiler.args '/GR' + cppCompiler.args '/GF' + cppCompiler.args '/EHsc' + cppCompiler.args '/bigobj' + cppCompiler.define 'WIN32' + cppCompiler.define '_WIN32' + cppCompiler.define '_WINDOWS' + cppCompiler.define '_MBCS' + + linker.args 'kernel32.lib' + linker.args 'user32.lib' + linker.args 'gdi32.lib' + linker.args 'winspool.lib' + linker.args 'comdlg32.lib' + linker.args 'advapi32.lib' + linker.args 'shell32.lib' + linker.args 'ole32.lib' + linker.args 'oleaut32.lib' + linker.args 'uuid.lib' + + linker.args '/NXCOMPAT' + linker.args '/OPT:REF' + linker.args '/INCREMENTAL:NO' +// linker.args '/MANIFEST' +// linker.args '/MANIFESTUAC:"level='asInvoker' uiAccess='false'"' + linker.args '/OPT:ICF' + linker.args '/NOLOGO' + linker.args '/SUBSYSTEM:CONSOLE' + } + } + withType(SharedLibraryBinarySpec) { + if (toolChain in VisualCpp) { + cCompiler.define '_USRDLL' + cCompiler.define '_WINDLL' + cppCompiler.define '_USRDLL' + cppCompiler.define '_WINDLL' + if (buildType == buildTypes.debug) { + cCompiler.args "/MDd" + cppCompiler.args "/MDd" + } else + if (buildType == buildTypes.release) { + cCompiler.args "/MD" + cppCompiler.args "/MD" + } + } + if (toolChain in Gcc) { + linker.args "-Wl,-rpath,$rootDir/lib64" //FIXME + } + } + withType(StaticLibraryBinarySpec) { + if (toolChain in VisualCpp) { + cCompiler.define '_LIB' + cCompiler.define 'POCO_STATIC' + cppCompiler.define '_LIB' + cppCompiler.define 'POCO_STATIC' + if (buildType == buildTypes.debug) { + cCompiler.args "/MTd" + cCompiler.args "/Fd" + toStatic(toPDB(staticLibraryFile), targetPlatform) + cppCompiler.args "/MTd" + cppCompiler.args "/Fd" + toStatic(toPDB(staticLibraryFile), targetPlatform) + } else + if (buildType == buildTypes.release) { + cCompiler.args "/MT" + cppCompiler.args "/MT" + } else { + throw new GradleException("Unknown buildType" + buildType) + } + } + if (toolChain in Gcc) { + } + } + withType(SemiStaticLibraryBinarySpec) { + if (toolChain in VisualCpp) { + cCompiler.define '_LIB' + cCompiler.define 'POCO_STATIC' + cppCompiler.define '_LIB' + cppCompiler.define 'POCO_STATIC' + if (buildType == buildTypes.debug) { + cCompiler.args "/MDd" + cCompiler.args "/Fd" + toStatic(toPDB(semiStaticLibraryFile), targetPlatform) + cppCompiler.args "/MDd" + cppCompiler.args "/Fd" + toStatic(toPDB(semiStaticLibraryFile), targetPlatform) + } else + if (buildType == buildTypes.release) { + cCompiler.args "/MD" + cppCompiler.args "/MD" + } else { + throw new GradleException("Unknown buildType" + buildType) + } + } + if (toolChain in Gcc) { + } + } + withType(NativeExecutableBinarySpec) { + if (toolChain in VisualCpp) { + if (buildType == buildTypes.debug) { + cCompiler.args "/MDd" + cppCompiler.args "/MDd" + } else + if (buildType == buildTypes.release) { + cCompiler.args "/MD" + cppCompiler.args "/MD" + } else { + throw new GradleException("Unknown buildType" + buildType) + } + } + if (toolChain in Gcc) { + } + } + } + } + tasks.withType(RunTestExecutable) { + args test + } +} +tasks.withType(CppCompile) { + maxParallelForks = 2 +} +task PocoDocIni { + def file = new File("$rootDir/PocoDoc/PocoDoc.ini") + file.createNewFile() + file.text = """ +PocoBuild=$rootDir +PocoBase=$rootDir +PocoDoc.output=releases/poco-${version}-all-doc +PocoDoc.version=${version}-all +""" + if (os.windows) { + def String javaVCH = VCHome.replace('\\','/') + def String javaCLP = CLPath.replace('\\','/') + def String javaWDK = WDKHome + "/Include/" + WDKVers + javaWDK = javaWDK.replace('\\','/') + + file.text += """ +Includes=-I${postgres32Home}/include,-I${mysql32Home}/include,-ICppParser/include,-ICppUnit/include,-ICrypto/include,-IData/include,-ISQL/include,-ISQL/MySQL/include,-ISQL/ODBC/include,-ISQL/PostgreSQL/include,-ISQL/SQLite/include, -ISQL/SQLite/src,-IFoundation/include,-IJSON/include,-IMongoDB/include,-INet/include,-INetSSL_OpenSSL/include,-INetSSL_Win/include,-IRedis/include,-IUtil/include,-IXML/include,-IZip/include,-ISevenZip/include,-IPDF/include +VCH=${javaVCH} +WDK=${javaWDK} +CLP=${javaCLP} +""" + } else { + } +} +task pocoDoc(type: Exec) { + dependsOn ':PocoDoc::assemble' + dependsOn PocoDocIni + if (os.windows) { + environment "Path", "$rootDir\\bin;$Path" + println environment.Path + + executable "PocoDoc/bin/PocoDoc.exe" + args "/config=$rootDir/PocoDoc/cfg/mkdoc-gradle.xml" + args "/config=$rootDir/PocoDoc/PocoDoc.ini" + } + if (os.linux) { + environment "LD_LIBRARY_PATH", "$rootDir/lib64:$LD_LIBRARY_PATH" + executable "PocoDoc/bin64/PocoDoc" + args "-config=$rootDir/PocoDoc/cfg/mkdoc-gradle.xml" + args "-config=$rootDir/PocoDoc/PocoDoc.ini" + } + if (os.macOsX) { + //FIXME environment "LD_LIBRARY_PATH", "$rootDir/bin:$LD_LIBRARY_PATH" + args "-config=$rootDir/PocoDoc/cfg/mkdoc-gradle.xml" + args "-config=$rootDir/PocoDoc/PocoDoc.ini" + } +// inputs.files(tasks.getByPath(':production').outputs.files) + inputs.files(executable) + inputs.files(fileTree("doc").filter { it.isFile() }) + inputs.files(new File("$rootDir/PocoDoc/cfg/mkdoc-gradle.xml")) + outputs.files(new File("releases/poco-${version}-all-doc/index.html")) +} +task zipDoc(type: Zip) { + from "releases/poco-${version}-all-doc/" + include '*' + include '*/*' + archiveName "poco-${version}-all-doc.zip" + destinationDir(file('releases')) + inputs.files(new File("releases/$version-all-doc/index.html")) + outputs.files(new File("releases/poco-${version}-all-doc.zip")) + dependsOn pocoDoc +} + +def candle(VSYEAR, VERSION, target, os) { + return tasks.create("Candle-${VSYEAR}-${VERSION}-${target}", Exec) { + def Set pocos = project.getTasksByName('poco', true) + setDependsOn(pocos) + dependsOn ':pocoDoc' + workingDir "packaging/Windows/WiX" + + executable "${WiXHome}/bin/Candle.exe" + args "-arch", "${target}" + args "-dVSYEAR=${VSYEAR}" + args "-dVERSION=${VERSION}" + args "-dPOCO=${rootDir}" + args "-dPlatform=${target}" + args "-ext", "${WiXHome}/bin/WixUIExtension.dll" + args "-out", "${VSYEAR}/${VSYEAR}-Poco-$VERSION-${target}.wixobj" + args "Poco.wxs" + + def File index = new File("$rootDir/releases/poco-$VERSION-all-doc/index.html") + inputs.files(index) + + inputs.files(pocos.inputs.files) + inputs.files(new File(workingDir, "Poco.wxs")) + inputs.files(project.getTasksByName('poco', true).outputs.files) + + def File output = new File(workingDir,"${VSYEAR}/${VSYEAR}-Poco-$VERSION-${target}.wixobj") + outputs.files(output) + + onlyIf(new Spec() { + boolean isSatisfiedBy(Exec task) { + return os.windows; + } + }); + } +} +def light(VSYEAR, VERSION, target, os) { + return tasks.create("Light-${VSYEAR}-${VERSION}-${target}", Exec) { + dependsOn candle(VSYEAR, VERSION, target, os) + workingDir "packaging/Windows/WiX" + + executable "${WiXHome}/bin/Light.exe" + args "-cultures:null" + args "-ext", "${WiXHome}/bin/WixUIExtension.dll" + args "-out" + args "${VSYEAR}/${VSYEAR}-Poco-$VERSION-${target}.msi" + args "${VSYEAR}/${VSYEAR}-Poco-$VERSION-${target}.wixobj" + + def File input = new File(workingDir, "${VSYEAR}/${VSYEAR}-Poco-$VERSION-${target}.wixobj") + inputs.files(input) + def File output = new File(workingDir, "${VSYEAR}/${VSYEAR}-Poco-$VERSION-${target}.msi") + outputs.files(output) + + onlyIf(new Spec() { + boolean isSatisfiedBy(Exec task) { + return os.windows; + } + }); + } +} +task wix() { + dependsOn light('VS2017', version, 'x86', os) + dependsOn light('VS2017', version, 'x64', os) + onlyIf(new Spec() { + boolean isSatisfiedBy(Task task) { + return os.windows; + } + }); +} +task nuget(type: Exec) { + String nugetVersion = version.replace('p', '-') + def Set pocos = project.getTasksByName('poco', true) + + setDependsOn(pocos) + workingDir "packaging/Windows/NuGet" + + executable "${NuGetHome}/NuGet.exe" + args "pack" + args "-BasePath", "$rootDir" + args "-Version", nugetVersion + args "-Symbols" + args "-NonInteractive" + args "Pocoproject.Poco.vs140.nuspec" + + inputs.files(pocos.inputs.files) + inputs.files(new File(workingDir, "Pocoproject.Poco.vs150.nuspec")) + outputs.files(new File(workingDir,"Pocoproject.Poco.vs150.${version}.nupkg")) + + onlyIf(new Spec() { + boolean isSatisfiedBy(Exec task) { + return os.windows; + } + }); +} + +task packaging() { + if (os.windows) { + dependsOn nuget + dependsOn wix + } +} +// +// gradle\bin\gradle Zip:testsuite:check -Ptest=-all +// +def cover(os, Directory, Module) { + return tasks.create("cover-${Module}", Exec) { + String PATH = System.getenv("PATH") + PATH = "$rootDir\\bin;$rootDir\\openssl\\VS_120\\win32\\bin\\release;$PATH" + PATH = "$mysql32Home".replace('/','\\') + "\\lib;$PATH" + PATH = "$postgres32Home".replace('/','\\') + "\\lib;$PATH" + environment "Path", "$PATH" +// println environment.Path + + environment "POCO_BASE", "$rootDir" +// println "POCO_BASE=" + environment.POCO_BASE + + String CPPUNIT_IGNORE; + CPPUNIT_IGNORE = 'class CppUnit::TestCaller.testTimeSync'; + CPPUNIT_IGNORE+=', class CppUnit::TestCaller.testEchoIPv4'; + CPPUNIT_IGNORE+=', class CppUnit::TestCaller.testSendToReceiveFromIPv4'; + CPPUNIT_IGNORE+=', class CppUnit::TestCaller.testPing'; + CPPUNIT_IGNORE+=', class CppUnit::TestCaller.testBigPing'; + CPPUNIT_IGNORE+=', class CppUnit::TestCaller.testProxy'; + CPPUNIT_IGNORE+=', class CppUnit::TestCaller.testProxy'; + CPPUNIT_IGNORE+=', class CppUnit::TestCaller.testReuseSocket'; + + //FIXME Those test below should work + CPPUNIT_IGNORE+=', class CppUnit::TestCaller.testLaunch'; + CPPUNIT_IGNORE+=', class CppUnit::TestCaller.testLaunchRedirectIn'; + CPPUNIT_IGNORE+=', class CppUnit::TestCaller.testLaunchRedirectOut'; + CPPUNIT_IGNORE+=', class CppUnit::TestCaller.testLaunchEnv'; + CPPUNIT_IGNORE+=', class CppUnit::TestCaller.testLaunchArgs'; + CPPUNIT_IGNORE+=', class CppUnit::TestCaller.testIsRunning'; + CPPUNIT_IGNORE+=', class CppUnit::TestCaller.testIsRunningAllowsForTermination'; + + //FIXME won't work until SharedLibraries be properly generated + CPPUNIT_IGNORE+=', class CppUnit::TestCaller.testSharedLibrary1'; + CPPUNIT_IGNORE+=', class CppUnit::TestCaller.testSharedLibrary2'; + CPPUNIT_IGNORE+=', class CppUnit::TestCaller.testSharedLibrary3'; + CPPUNIT_IGNORE+=', class CppUnit::TestCaller.testClassLoader2'; + CPPUNIT_IGNORE+=', class CppUnit::TestCaller.testClassLoader3'; + + environment "CPPUNIT_IGNORE", "\"$CPPUNIT_IGNORE\"" +// println "CPPUNIT_IGNORE=" + environment.CPPUNIT_IGNORE + + + def Set tests = project.getTasksByName("testsuite:${Module}", true) + setDependsOn(tests) + + workingDir "coverage/${Directory}" + file(workingDir).mkdirs() + + executable "${OpenCppCoverageHome}/OpenCppCoverage.exe" + args "-q" + args "$rootDir/${Directory}/testsuite/gradle/exe/${Module}TestSuite/win32/debug/${Module}TestSuite.exe" + args "--modules", "Poco*d.dll" + args "--export_type", "cobertura" + args "--continue_after_cpp_exception" + args "--" + args "-all" + + outputs.files(new File(workingDir,"${Module}TestSuite.xml")) + + onlyIf(new Spec() { + boolean isSatisfiedBy(Exec task) { + return os.windows; + } + }); + } +} +def report(os, Directory, Module) { + return tasks.create("report-${Module}", Exec) { + dependsOn cover(os, Directory, Module) + + executable "${ReportGeneratorHome}/ReportGenerator.exe" + args "-verbosity:Verbose" + args "-reports:coverage/${Module}/${Module}TestSuiteCoverage.xml" + args "-targetdir:coverage/${Module}" +// args "-sourcedirs:XML/src;XML/include;CppUnit/src;CppUnit/include;Foundation/src;Foundation/include" + + File targetDir = new File("coverage/${Module}") + inputs.files(new File(targetDir,"${Module}TestSuite.xml")) + + onlyIf(new Spec() { + boolean isSatisfiedBy(Exec task) { + return os.windows; + } + }); + } +} +task coverage() { + if (os.windows) { + def Set tasksSet = project.getTasksByName('testsuite', true) + println "task coverage: covered modules" + println "--------------------------------------" + tasksSet.each { task -> println task.project.parent.path.replace(':','/').substring(1) } + println "--------------------------------------" + tasksSet.each { task -> dependsOn report(os, task.project.parent.path.replace(':','/').substring(1), task.project.parent.name) } + } +} + +/* +task all() { + FileCollection incs = task.includes; + incs.each { dir -> fileTree(dir).files.each { file -> inputs.files(file) }}; + inputs.files.each { file -> println file.path } +} +*/ +/* + tasks { t -> + $.components.main.binaries.each { binary -> + def stripTask = binary.tasks.taskName("strip") + t.create(stripTask) { + dependsOn binary.tasks.link + doFirst { + if (binary.toolChain in Gcc) { + ["strip", binary.tasks.link.outputFile].execute().waitForOrKill(1000) + } + } + } + binary.tasks.build.dependsOn stripTask + } + } +*/ + + + + diff --git a/doc/00100-GuidedTour.page b/doc/00100-GuidedTour.page index ffa4eab5b..9acff2530 100644 --- a/doc/00100-GuidedTour.page +++ b/doc/00100-GuidedTour.page @@ -22,7 +22,7 @@ challenges. POCO consists of four core libraries, and a number of add-on libraries. The core libraries are Foundation, XML, Util and Net. Two of the add-on libraries are NetSSL, providing SSL support for the network classes in -the Net library, and Data, a library for uniformly accessing different +the Net library, and SQL, a library for uniformly accessing different SQL databases. POCO aims to be for network-centric, cross-platform C++ software development what Apple's Cocoa is for Mac development, or Ruby on Rails is for Web development -- diff --git a/gradle b/gradle new file mode 160000 index 000000000..05a8d4d93 --- /dev/null +++ b/gradle @@ -0,0 +1 @@ +Subproject commit 05a8d4d93581b2e780bad84f8f9178b8a4267eda diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 000000000..2071e8590 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,45 @@ +# https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.19-win32.zip +mysql32Home=C:/mysql-5.6.37-win32 + +# https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.19-winx64.zip +mysql64Home=C:/mysql-5.6.37-winx64 + +# https://get.enterprisedb.com/postgresql/postgresql-9.6.3-2-windows-binaries.zip +postgres32Home=C:/postgresql-9.6.3-2-win32/pgsql + +# https://get.enterprisedb.com/postgresql/postgresql-9.6.3-2-windows-x64-binaries.zip +postgres64Home=C:/postgresql-9.6.3-2-win64/pgsql + +# Windows Development Kit +WDKHome=C:/Program Files (x86)/Windows Kits/10 +WDKVers=10.0.16299.0 + +#C:\Program Files (x86)\Windows Kits\10\Include\10.0.16299.0\ucrt + +# C:\Program Files (x86)\Windows Kits\10\Lib\10.0.16299.0\um\x86 +# VisualStudio 2015 +#VCHome=C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC + +# VisualStudio 2017 +# c:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.11.25503 +VCHome=C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.11.25503 + +# C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.11.25503\bin\HostX86\x86\cl.exe +CLPath=C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.11.25503/bin/HostX86/x86 + +# https://github.com/wixtoolset/wix3/releases/download/wix311rtm/wix311.exe +WiXHome=C:/Program Files (x86)/WiX Toolset v3.11 + +# https://dist.nuget.org/win-x86-commandline/v4.3.0/nuget.exe +NuGetHome=C:/Program Files (x86)/NuGet + +#https://github.com/OpenCppCoverage/OpenCppCoverage/releases +OpenCppCoverageHome=C:/Program Files/OpenCppCoverage + +#https://github.com/danielpalme/ReportGenerator/releases +#ReportGeneratorHome=C:/ProgramFiles/ReportGenerator +ReportGeneratorHome=C:/ProgramFiles/ReportGenerator + +test=-print +LD_LIBRARY_PATH= +cpus= diff --git a/packaging/Boost License.rtf b/packaging/Boost License.rtf new file mode 100644 index 000000000..c3bd8caf1 --- /dev/null +++ b/packaging/Boost License.rtf @@ -0,0 +1,34 @@ +{\rtf1\ansi\deff0{\fonttbl{\f0\fnil\fcharset0 Courier New;}} +{\*\generator Msftedit 5.41.21.2510;}\viewkind4\uc1\pard\lang1036\f0\fs22 Boost Software License - Version 1.0 - August 17th, 2003\par +\par +Permission is hereby granted, free of charge, to any person or organization\par +obtaining a copy of the software and accompanying documentation covered by\par +this license (the "Software") to use, reproduce, display, distribute,\par +execute, and transmit the Software, and to prepare derivative works of the\par +Software, and to permit third-parties to whom the Software is furnished to\par +do so, all subject to the following:\par +\par +The copyright notices in the Software and this entire statement, including\par +the above license grant, this restriction and the following disclaimer,\par +must be included in all copies of the Software, in whole or in part, and\par +all derivative works of the Software, unless such copies or derivative\par +works are solely in the form of machine-executable object code generated by\par +a source language processor.\par +\par +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\par +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\par +FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT\par +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE\par +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,\par +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\par +DEALINGS IN THE SOFTWARE.\par +\par +---------------------------------------------------------------------------\par +Note:\par +Individual files contain the following tag instead of the full license text.\par +\par + SPDX-License-Identifier: BSL-1.0\par +\par +This enables machine processing of license information based on the SPDX\par +License Identifiers that are here available: http://spdx.org/licenses/\par +} \ No newline at end of file diff --git a/packaging/Linux/Fedora/.gitignore b/packaging/Linux/Fedora/.gitignore new file mode 100644 index 000000000..e69de29bb diff --git a/packaging/Linux/Ubuntu/debian/.gitignore b/packaging/Linux/Ubuntu/debian/.gitignore new file mode 100644 index 000000000..e69de29bb diff --git a/packaging/Other/.gitignore b/packaging/Other/.gitignore new file mode 100644 index 000000000..e69de29bb diff --git a/packaging/Other/VMS/.gitignore b/packaging/Other/VMS/.gitignore new file mode 100644 index 000000000..e69de29bb diff --git a/packaging/README.md b/packaging/README.md new file mode 100644 index 000000000..4b3613357 --- /dev/null +++ b/packaging/README.md @@ -0,0 +1,111 @@ +POCO C++ Distribution +===================== + +This repository contains packaged Poco releases for various platforms and +successive versions of Poco starting from release Poco-1.6.1. + +CHANGELOG contains all changes for the following releases + +- Release 1.7.8p4 (2017-08-11) +- Release 1.7.8p3 (2017-06-22) +- Release 1.7.8p2 (2017-04-18) +- Release 1.7.7 (2016-12-31) +- Release 1.7.6 (2016-10-18) +- Release 1.7.5 (2016-08-29) +- Release 1.7.4 (2016-07-20) +- Release 1.7.3 (2016-05-02) +- Release 1.7.2 (2016-03-21) +- Release 1.7.1 (2016-03-14) +- Release 1.7.0 (2016-03-07) +- Release 1.6.1 (2015-08-03) +- Release 1.6.0 (2014-12-22) +- Release 1.5.4 (2014-10-14) +- Release 1.5.3 (2014-06-30) +- Release 1.5.2 (2013-09-16) +- Release 1.5.1 (2013-01-11) +- Release 1.5.0 (2012-10-14) +- Release 1.4.7p1 (2014-11-25) +- Release 1.4.7 (2014-10-06) +- Release 1.4.6p4 (2014-04-18) +- Release 1.4.6p3 (2014-04-02) +- Release 1.4.6p2 (2013-09-16) +- Release 1.4.6p1 (2013-03-06) +- Release 1.4.6 (2013-01-10) +- Release 1.4.5 (2012-11-19) +- Release 1.4.4 (2012-09-03) +- Release 1.4.3p1 (2012-01-23) +- Release 1.4.3 (2012-01-16) +- Release 1.4.2p1 (2011-09-24) +- Release 1.4.2 (2011-08-28) +- Release 1.4.1p1 (2011-02-08) +- Release 1.4.1 (2011-01-29) +- Release 1.4.0 (2010-12-14) +- Release 1.3.6p2 (2010-01-15) +- Release 1.3.6p1 (2009-12-21) +- Release 1.3.6 (2009-11-24) +- Release 1.3.5 (2009-05-11) +- Release 1.3.4 (2009-04-21) +- Release 1.3.3p1 (2008-10-09) +- Release 1.3.3 (2008-10-07) +- Release 1.3.2 (2008-02-04) +- Release 1.3.1 (2007-08-08) +- Release 1.3.0 (2007-05-07) +- Release 1.2.9 (2007-02-26) +- Release 1.2.8 (2007-01-04) +- Release 1.2.7 (2006-12-07) +- Release 1.2.6 (2006-11-19) +- Release 1.2.5 (2006-10-23) +- Release 1.2.4 (2006-10-02) +- Release 1.2.3 (2006-09-14) +- Release 1.2.2 (2006-09-01) +- Release 1.2.1 (2006-08-29) +- Release 1.2.0 (2006-08-29) +- Release 1.1.2 (2006-07-07) +- Release 1.1.1 (2006-04-03) +- Release 1.1.0 (2006-03-23) +- Release 1.1b2 (2006-03-04) +- Release 1.1b1 (2006-03-03) +- Release 1.0.0 (2006-01-19) +- Release 1.0b2 (2006-01-16) +- Release 1.0b1 (2006-01-09) +- Release 1.0a1 (2006-01-03) [internal] +- Release 0.96.1 (2005-12-28) +- Release 0.95.4 (2005-11-07) +- Release 0.95.3 (2005-10-28) [internal] +- Release 0.95.2 (2005-10-22) [internal] +- Release 0.94.1 (2005-09-30) [internal] +- Release 0.93.1 (2005-08-01) +- Release 0.92.1 (2005-05-09) +- Release 0.91.4 (2005-04-11) +- Release 0.91.3 (2005-03-19) +- Release 0.91.2 (2005-02-27) +- Release 0.91.1 (2005-02-21) + + + POCO C++ Libraries +================== + +POrtable COmponents C++ Libraries are: +-------------------------------------- +- A collection of C++ class libraries, conceptually similar to the Java Class Library, the .NET Framework or Apple’s Cocoa. +- Focused on solutions to frequently-encountered practical problems. +- Focused on ‘internet-age’ network-centric applications. +- Written in efficient, modern, 100% ANSI/ISO Standard C++. +- Based on and complementing the C++ Standard Library/STL. +- Highly portable and available on many different platforms. +- Open Source, licensed under the [Boost Software License](https://spdx.org/licenses/BSL-1.0). + +---- +To start using POCO, see the [Guided Tour](http://pocoproject.org/docs-1.5.3/00100-GuidedTour.html) and [Getting Started](http://pocoproject.org/docs-1.5.3/00200-GettingStarted.html) documents. + +---- +POCO has an active user and contributing community, please visit our [web site](http://pocoproject.org), [forum](http://pocoproject.org/forum) and [blog](http://pocoproject.org/blog). +Answers to POCO-related questions can also be found on [Stack Overflow](http://stackoverflow.com/questions/tagged/poco-libraries). + +---- +In regards to Boost, in spite of some functional overlapping, +POCO is best thought of as a Boost complement (rather than replacement). +Side-by-side use of Boost and POCO is a very common occurrence. + + + diff --git a/packaging/README.txt b/packaging/README.txt new file mode 100644 index 000000000..6c061835e --- /dev/null +++ b/packaging/README.txt @@ -0,0 +1,24 @@ + POCO C++ Libraries +================== + +POrtable COmponents C++ Libraries are: +-------------------------------------- +- A collection of C++ class libraries, conceptually similar to the Java Class Library, the .NET Framework or Apple’s Cocoa. +- Focused on solutions to frequently-encountered practical problems. +- Focused on ‘internet-age’ network-centric applications. +- Written in efficient, modern, 100% ANSI/ISO Standard C++. +- Based on and complementing the C++ Standard Library/STL. +- Highly portable and available on many different platforms. +- Open Source, licensed under the [Boost Software License](https://spdx.org/licenses/BSL-1.0). + +---- +To start using POCO, see the [Guided Tour](http://pocoproject.org/docs-1.5.3/00100-GuidedTour.html) and [Getting Started](http://pocoproject.org/docs-1.5.3/00200-GettingStarted.html) documents. + +---- +POCO has an active user and contributing community, please visit our [web site](http://pocoproject.org), [forum](http://pocoproject.org/forum) and [blog](http://pocoproject.org/blog). +Answers to POCO-related questions can also be found on [Stack Overflow](http://stackoverflow.com/questions/tagged/poco-libraries). + +---- +In regards to Boost, in spite of some functional overlapping, +POCO is best thought of as a Boost complement (rather than replacement). +Side-by-side use of Boost and POCO is a very common occurrence. diff --git a/packaging/Unix/.gitignore b/packaging/Unix/.gitignore new file mode 100644 index 000000000..e69de29bb diff --git a/packaging/Unix/HP/.gitignore b/packaging/Unix/HP/.gitignore new file mode 100644 index 000000000..e69de29bb diff --git a/packaging/Unix/Sun/.gitignore b/packaging/Unix/Sun/.gitignore new file mode 100644 index 000000000..e69de29bb diff --git a/packaging/Windows/NuGet/Pocoproject.Poco.vs140.nuspec b/packaging/Windows/NuGet/Pocoproject.Poco.vs140.nuspec new file mode 100644 index 000000000..97fa8b0cd --- /dev/null +++ b/packaging/Windows/NuGet/Pocoproject.Poco.vs140.nuspec @@ -0,0 +1,52 @@ + + +]> + + + Pocoproject.Poco.vs140 + $version$ + Poco $version$ + Applied Informatics & Contributors + Günter Obiltschnig & Aleksandar Fabijanic + https://pocoproject.org/license.html + https://pocoproject.org/ + https://avatars1.githubusercontent.com/u/201918?v=4&s=200 + false + Modern, powerful open source C++ class libraries for building network- and internet-based applications that run on desktop, server, mobile and embedded systems. + + + + Copyright 2017 + string filesystem thread date log event regex uri uuid cache native nativepackage sockets mime http ftp mail pop3 smtp html sax sax2 dom xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packaging/Windows/NuGet/Pocoproject.Poco.vs140.symbols.nuspec b/packaging/Windows/NuGet/Pocoproject.Poco.vs140.symbols.nuspec new file mode 100644 index 000000000..b70bfc6c6 --- /dev/null +++ b/packaging/Windows/NuGet/Pocoproject.Poco.vs140.symbols.nuspec @@ -0,0 +1,31 @@ + + +]> + + + Pocoproject.Poco.vs140 + $version$ + Poco $version$ + Applied Informatics & Contributors + Günter Obiltschnig & Aleksandar Fabijanic + https://pocoproject.org/license.html + https://pocoproject.org/ + https://avatars1.githubusercontent.com/u/201918?v=4&s=200 + false + Modern, powerful open source C++ class libraries for building network- and internet-based applications that run on desktop, server, mobile and embedded systems. + + + + Copyright 2017 + string filesystem thread date log event regex uri uuid cache native nativepackage sockets mime http ftp mail pop3 smtp html sax sax2 dom xml + + + + + + + + \ No newline at end of file diff --git a/packaging/Windows/NuGet/Pocoproject.Poco.vs140.targets b/packaging/Windows/NuGet/Pocoproject.Poco.vs140.targets new file mode 100644 index 000000000..13b3e5ebe --- /dev/null +++ b/packaging/Windows/NuGet/Pocoproject.Poco.vs140.targets @@ -0,0 +1,13 @@ + + + + $(MSBuildThisFileDirectory)inc;%(AdditionalIncludeDirectories) + + + $(MSBuildThisFileDirectory)lib;%(AdditionalLibraryDirectories) + + + $(MSBuildThisFileDirectory)lib64;%(AdditionalLibraryDirectories) + + + \ No newline at end of file diff --git a/packaging/Windows/NuGet/api.key b/packaging/Windows/NuGet/api.key new file mode 100644 index 000000000..3a263b7b3 --- /dev/null +++ b/packaging/Windows/NuGet/api.key @@ -0,0 +1 @@ +e5709aaf-9638-45e8-a8b9-0de8a7cec41e \ No newline at end of file diff --git a/packaging/Windows/WiX/Poco 128x410.bmp b/packaging/Windows/WiX/Poco 128x410.bmp new file mode 100644 index 0000000000000000000000000000000000000000..d77e39dc7d66bab9267a37f52950d7176c27b3a7 GIT binary patch literal 157494 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 WB)i-B_@{ntc*<8NIc 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 literal 0 HcmV?d00001 diff --git a/packaging/Windows/WiX/Poco 312x312.jpg b/packaging/Windows/WiX/Poco 312x312.jpg new file mode 100644 index 0000000000000000000000000000000000000000..70f784bdc6a7912de50bf8ad8a1bd0d6d204eaaf GIT binary patch literal 20438 zcmb4qWq4dW&)|fanW153Y8WQW%*@P84Kp*eVP;MmW@cti(I|wkqe*+je02&4s5(*9i1SS9jf&Wh^ z000IK4FL%S^LGP)2m*kkLZE`)?e-Pjc|AAy-&E`F)Hu1As4cS;f5S{?psFZeX330A zwaJt>r34gL1Zj<{!c~xF4~H%pb1G)V2;sF+>()s8b57s2$*nz-FqT`L7`DN}Lf#R2xK{ zXoZietF1859uW)q3aB&TyepcfASRNEgm(Hpvit@3bO$lC7(`ggtA*-(sepXqX=Tp~ zn9Oa*CIFWHECW!3;aA(8?>U^pfO|X=1;~-HWS8aew8BsC&U)do!uA%s*fV0xdjPY% zkAOz7--Ls~k)d>5B_#zArkx{nBf(UoHr@Dq$3<@avL=3tBnAP3&=605$^q0$ke}2zyA+haw zMs1)J2uLa%3;=`0l;1|-cHD8FKUr3%Bsw2fhiJR`OdRS>-Q>!8LbhOMvscBbSutG; zKqja5KXJd21RpvK4za`PM!zND6tQ1sdTPNU$TY*I{^@)TV;J?@3Q`Vcg?(}>e@6e< z0~W9>OKB*3ncBx0<=d#9CXilY=rIs+R?kRLW|5yceRtmR>bZ;)L94dZKzb0(%8@qM#lVklb1fK!naa_m<>;kX9n)7 z>vL+q()sF!6+K=zmu}K*Rv`>8u^1U|nb~3Cs&!(4GVmok=f8Y(j{~~b52gxlR_DJD zWOSAMNXYaV6(ZJ3;PU@8dEG0UTq%QH;h{9b8gfOh;tikPmI?hq_T~uVdGw@^UyV0HZ zn~{(uxK-!DRtl39-9LJ>eaegz7*IF`P^MYSBvYZumpSFADrNFzPVc(83w#hskd^+-Jc*QE z+@#4om{t0v%kSOPDaN=_}3!! zD)~(=fA-Vf^M3RCW|Y6}CsDr4sRFA`sc7QmA@E$bwf8)J@F)H4bQ@YR?nqRH!Y$5md|87?eDOnR8z-9kCSq=1(Z%^HE71w13t?~iS&Ex+mp zmC!u9C^Zin9jWu44ZLbMNLx-OH5X)0b0dRniYr2wrO1FFK~jZKdvCw-L6Ep5Tpqhb z4F-q&XJR3=KkG3fx2OqojtujQ zO)+Y5sG((qt-B4kK*YZ16P*%hO#+8RhAgOj+kwtpr+eiFWXh|8U!1m{n}7n(*?awkl_ z6(zhF-2?E_iqHYiE+TbRwJFP#jyHz5f?jZVFx-DgHD@+jtNSdITtVl5&);#QY1$bZ z1o(%Jux=Nt)O=%KY%&$@Oe;f|Whri+wLgEI3kHEnc~C!*E4jaB-t~IQiPgd&mX+$cGz@3aa zCAB6r^h6mkn}9td3WKSTSX4G~Jg;+bkdRxRUKvYZA_t9HXl8Js2G#E7il3}**~&f_ zLL3~{y(w5qq@c>HeF5=nMfnOFfP9&)tXU^VAl6Kb&@3Ky9103V(@L9S%%(r_axySl z_z6hyJg{BM$<@)?DOn5O&m902cD8%*34CP#BB`{Ik_cVqRIHD^PtY`8G`7{SQai>{ zQ5({UrKMS6TEw%b9||g5vh($4lL0O7)k*2rC%0D{T}reBe2-#*`50;gACs>(ko-Yz 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 Dq3>4C literal 0 HcmV?d00001 diff --git a/packaging/Windows/WiX/Poco 64x64.ico b/packaging/Windows/WiX/Poco 64x64.ico new file mode 100644 index 0000000000000000000000000000000000000000..7a678fa98fff2a7e3a971191e9c399d8ba286101 GIT binary patch literal 99678 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%0ATSQrUcD%Icd%oXzaWH0T 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

2xyW%UJ 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%0A@VbhX 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 literal 0 HcmV?d00001 diff --git a/packaging/Windows/WiX/Poco Layers.png b/packaging/Windows/WiX/Poco Layers.png new file mode 100644 index 0000000000000000000000000000000000000000..db3844cfc0d22d05bd1bc2d8400965e1b590d0e9 GIT binary patch literal 8091 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + APPLICATIONFOLDER="" + + + + + + + + + + + + + NOT UPGRADINGPRODUCTCODE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packaging/Windows/WiX/VS2013/.gitignore b/packaging/Windows/WiX/VS2013/.gitignore new file mode 100644 index 000000000..e69de29bb diff --git a/packaging/Windows/WiX/VS2015/.gitignore b/packaging/Windows/WiX/VS2015/.gitignore new file mode 100644 index 000000000..e69de29bb diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 000000000..99176d13c --- /dev/null +++ b/settings.gradle @@ -0,0 +1,71 @@ +def os = org.gradle.internal.os.OperatingSystem.current() +rootProject.name = 'Poco' + +include ':CppUnit' +include ':Foundation' +include ':XML' +include ':JSON' +include ':Util' +include ':Net' +include ':Crypto' +include ':NetSSL_OpenSSL' +if (os.windows) { + include ':NetSSL_Win' +} +include ':SQL' +if (os.windows) { + include ':SQL:ODBC' + include ':SQL:SQLite' + include ':SQL:MySQL' + include ':SQL:PostgreSQL' +} +include ':Zip' +include ':PageCompiler' +include ':PageCompiler:File2Page' +include ':PDF' +include ':CppParser' +include ':MongoDB' +include ':Redis' +include ':PocoDoc' +include ':ProGen' + +include ':Foundation:testsuite' +include ':XML:testsuite' +include ':JSON:testsuite' +include ':Util:testsuite' +include ':Net:testsuite' +//include ':Crypto:testsuite' +include ':NetSSL_OpenSSL:testsuite' +if (os.windows) { + include ':NetSSL_Win:testsuite' +} +include ':SQL:testsuite' +if (os.windows) { + include ':SQL:ODBC:testsuite' + include ':SQL:SQLite:testsuite' + include ':SQL:MySQL:testsuite' + include ':SQL:PostgreSQL:testsuite' +} +//include ':MongoDB:testsuite' +include ':Redis:testsuite' +include ':CppParser:testsuite' +include ':Zip:testsuite' + +include ':Foundation:samples' +if (os.windows) { + include ':SQL:samples' +} +include ':NetSSL_OpenSSL:samples' +if (os.windows) { + include ':NetSSL_Win:samples' +} +include ':JSON:samples' +//include ':MongoDB:samples' +include ':Net:samples' +include ':PageCompiler:samples' +include ':PDF:samples' +include ':Util:samples' +include ':XML:samples' +include ':SevenZip:samples' +include ':Zip:samples' +