diff --git a/Seasocks/conanfile.py b/Seasocks/conanfile.py index aecf557..11df7d0 100644 --- a/Seasocks/conanfile.py +++ b/Seasocks/conanfile.py @@ -1,38 +1,77 @@ -from conans import ConanFile, CMake, tools +from conans import CMake, ConanFile, tools +from conans.errors import ConanException, ConanInvalidConfiguration +import os +import re +import shutil +import textwrap class SeasocksConan(ConanFile): name = "Seasocks" - version = "1.3.2" - license = "BSD 2-clause \"Simplified\" License" - url = "https://github.com/Minres/conan-recipes/blob/master/Seasocks" + version = "1.4.4" + topics = ("seasocks", "embeddable", "webserver", "websockets") + homepage = "https://github.com/mattgodbolt/seasocks" + url = "https://github.com/mattgodbolt/seasocks" description = "Simple, small, C++ embeddable webserver with WebSockets support" - settings = "os", "compiler", "build_type", "arch" - options = {"shared": [True, False]} - default_options = "shared=True" - generators = "cmake" - exports_sources = "src/main/c/*" - #requires = "zlib/1.2.11@conan/stable" + license = "BSD-2-Clause" + settings = "os", "arch", "compiler", "build_type" + options = { + "shared": [True, False], + "fPIC": [True, False], + "with_zlib": [True, False], + } + default_options = { + "shared": True, + "fPIC": True, + "with_zlib": True, + } + no_copy_source = True + generators = "cmake", "cmake_find_package" + exports_sources = "src/main/c/*" + + def configure(self): + if self.options.shared: + del self.options.fPIC + + def requirements(self): + if self.options.with_zlib: + self.requires("zlib/1.2.11") def source(self): - self.run("git clone https://github.com/mattgodbolt/seasocks.git") - self.run("cd seasocks && git checkout tags/v1.3.2") - # This small hack might be useful to guarantee proper /MT /MD linkage in MSVC - # if the packaged project doesn't have variables to set it properly - tools.replace_in_file("seasocks/CMakeLists.txt", "project(Seasocks VERSION 1.3.2)", '''project(Seasocks VERSION 1.3.2) -include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) -conan_basic_setup()''') - tools.replace_in_file("seasocks/src/CMakeLists.txt", 'add_subdirectory("app/c")', '#add_subdirectory("app/c")') + self.run("git clone https://github.com/mattgodbolt/seasocks.git .") + self.run("git checkout tags/v1.4.4") def build(self): - cmake = CMake(self, parallel=True) - cmake.configure(source_folder="seasocks", args=["-DCMAKE_INSTALL_LIBDIR=lib"]) + if self.source_folder == self.build_folder: + raise ConanException("Cannot build in same folder as sources") + tools.save(os.path.join(self.build_folder, "CMakeLists.txt"), textwrap.dedent("""\ + cmake_minimum_required(VERSION 3.0) + project(cmake_wrapper) + + include("{install_folder}/conanbuildinfo.cmake") + conan_basic_setup(TARGETS) + + add_subdirectory("{source_folder}" seasocks) + """).format( + source_folder=self.source_folder.replace("\\", "/"), + install_folder=self.install_folder.replace("\\", "/"))) + cmake = CMake(self) + cmake.definitions["DEFLATE_SUPPORT"] = self.options.with_zlib + cmake.configure(source_folder=self.build_folder) cmake.build() + + def package(self): + cmake = CMake(self) cmake.install() - #def package(self): - # nothing to do here now - def package_info(self): - self.cpp_info.libs = ["seasocks"] + # Set the name of the generated `FindSeasocks.cmake` and `SeasocksConfig.cmake` cmake scripts + self.cpp_info.names["cmake_find_package"] = "Seasocks" + self.cpp_info.names["cmake_find_package_multi"] = "Seasocks" + self.cpp_info.components["libseasocks"].libs = ["seasocks"] + # Set the name of the generated seasocks target: `Seasocks::seasocks` + self.cpp_info.components["libseasocks"].names["cmake_find_package"] = "seasocks" + self.cpp_info.components["libseasocks"].names["cmake_find_package_multi"] = "seasocks" + if self.options.with_zlib: + self.cpp_info.components["libseasocks"].requires = ["zlib::zlib"] diff --git a/Seasocks/test_package/CMakeLists.txt b/Seasocks/test_package/CMakeLists.txt index d7aee5e..0e7869d 100644 --- a/Seasocks/test_package/CMakeLists.txt +++ b/Seasocks/test_package/CMakeLists.txt @@ -1,16 +1,10 @@ +cmake_minimum_required(VERSION 3.3) project(PackageTest CXX) -cmake_minimum_required(VERSION 2.8.12) include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) conan_basic_setup() find_package(Threads) -add_executable(ServerTests ServerTests.cpp) -target_link_libraries(ServerTests ${CONAN_LIBS} ${CMAKE_THREAD_LIBS_INIT}) - -# CTest is a testing tool that can be used to test your project. -# enable_testing() -# add_test(NAME example -# WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/bin -# COMMAND example) +add_executable(seasocks_test seasocks_test.cpp) +target_link_libraries(seasocks_test ${CONAN_LIBS} ${CMAKE_THREAD_LIBS_INIT}) diff --git a/Seasocks/test_package/README.md b/Seasocks/test_package/README.md new file mode 100644 index 0000000..20c57d6 --- /dev/null +++ b/Seasocks/test_package/README.md @@ -0,0 +1,3 @@ +This directory contains a conan test package to ensure the packaging works. + +It's not meant as an example of how best to use Seasocks. \ No newline at end of file diff --git a/Seasocks/test_package/ServerTests.cpp b/Seasocks/test_package/ServerTests.cpp deleted file mode 100644 index 29f2045..0000000 --- a/Seasocks/test_package/ServerTests.cpp +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright (c) 2013-2017, Matt Godbolt -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -// POSSIBILITY OF SUCH DAMAGE. - -#include "seasocks/Server.h" -#include "seasocks/Connection.h" -#include "seasocks/IgnoringLogger.h" - -#define CATCH_CONFIG_MAIN -#include "catch.hpp" - -#include -#include - -using namespace seasocks; - - -TEST_CASE("Server tests", "[ServerTests]") { - auto logger = std::make_shared(); - Server server(logger); - REQUIRE(server.startListening(0)); - std::thread seasocksThread([&]{ - REQUIRE(server.loop()); - }); - - std::atomic test(0); - SECTION("execute should work") { - server.execute([&]{ - CHECK(test == 0); - test++; - }); - for (int i = 0; i < 1000 * 1000 * 1000; ++i) { - if (test) break; - } - CHECK(test == 1); - } - - SECTION("many executes") { - std::atomic latch(false); - for (auto i = 0; i < 100; ++i) { - for (auto j = 0; j < 100; ++j) { - server.execute([&] { test++; }); - } - usleep(10); - } - server.execute([&] { latch = true; }); - for (int i = 0; i < 1000; ++i) { - usleep(1000); - if (latch) break; - } - CHECK(latch == 1); - CHECK(test == 10000); - } - - server.terminate(); - seasocksThread.join(); -} diff --git a/Seasocks/test_package/conanfile.py b/Seasocks/test_package/conanfile.py index f8ab5f4..74f9376 100644 --- a/Seasocks/test_package/conanfile.py +++ b/Seasocks/test_package/conanfile.py @@ -1,26 +1,17 @@ -from conans import ConanFile, CMake +from conans import ConanFile, CMake, tools import os -class SeasocksTestConan(ConanFile): - settings = "os", "compiler", "build_type", "arch" - options = {"shared": [True, False]} - default_options = "shared=True" - generators = "cmake" - build_requires = "Catch/1.9.6@uilianries/stable" - def configure(self): - self.options["Seasocks"].shared = self.options.shared - +class TestPackageConan(ConanFile): + settings = "os", "compiler", "build_type", "arch" + generators = "cmake" + def build(self): cmake = CMake(self) cmake.configure() cmake.build() - def imports(self): - self.copy("*.dll", dst="bin", src="bin") - self.copy("*.dylib*", dst="bin", src="lib") - self.copy('*.so*', dst='bin', src='lib') - def test(self): - os.chdir("bin") - self.run(".%sServerTests" % os.sep) + if not tools.cross_building(self.settings): + bin_path = os.path.join("bin", "seasocks_test") + self.run(bin_path, run_environment=True) diff --git a/Seasocks/test_package/seasocks_test.cpp b/Seasocks/test_package/seasocks_test.cpp new file mode 100644 index 0000000..eb27bfa --- /dev/null +++ b/Seasocks/test_package/seasocks_test.cpp @@ -0,0 +1,24 @@ +#include "seasocks/Server.h" +#include "seasocks/Connection.h" +#include "seasocks/PrintfLogger.h" + +#include +#include + +using namespace seasocks; + +// This is a conan test program to ensure the packaging works. +// It's not meant as an example of how best to use Seasocks. +int main(int argc, const char* argv[]) { + auto logger = std::make_shared(); + Server server(logger); + server.startListening(0); + std::thread seasocksThread([&] { + server.loop(); + }); + + sleep(1); + + server.terminate(); + seasocksThread.join(); +}