From 0ad14c796e676f1ae89c5f8aa425e1742c944c47 Mon Sep 17 00:00:00 2001 From: Vitaly Takmazov Date: Thu, 13 Oct 2011 10:42:57 +0400 Subject: [PATCH] fixed compilation of transport and spectrum2 targets --- CMakeLists.txt | 20 +- spectrum/src/main.cpp | 649 +++++++++++++++++++++--------------------- src/CMakeLists.txt | 78 ++--- src/config.cpp | 6 + 4 files changed, 393 insertions(+), 360 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c473bfaf..c20f571b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,8 +27,15 @@ find_package(event) set(Swiften_DIR "${CMAKE_SOURCE_DIR}/cmake_modules") find_package(Swiften REQUIRED) +find_package(openssl REQUIRED) + set(Boost_DIR "${CMAKE_SOURCE_DIR}/cmake_modules") -find_package(Boost COMPONENTS date_time system filesystem regex thread signals REQUIRED) +if (WIN32) +set(Boost_USE_STATIC_LIBS ON) +set(Boost_USE_MULTITHREADED ON) +set(Boost_USE_STATIC_RUNTIME OFF) +endif() +find_package(Boost COMPONENTS program_options date_time system filesystem regex thread signals REQUIRED) message( STATUS "Found Boost: ${Boost_LIBRARIES}, ${Boost_INCLUDE_DIR}") set(Protobuf_DIR "${CMAKE_SOURCE_DIR}/cmake_modules") @@ -118,10 +125,15 @@ else() message(FATAL_ERROR "Logging : no (install log4cxx-devel)") endif() +if (WIN32) +ADD_DEFINITIONS(-D_WIN32_WINNT=0x501) +ADD_DEFINITIONS(-DWIN32_LEAN_AND_MEAN) +endif() + if(CMAKE_BUILD_TYPE MATCHES Debug) +if (CMAKE_COMPILER_IS_GNUCXX) ADD_DEFINITIONS(-O3) ADD_DEFINITIONS(-ggdb) - ADD_DEFINITIONS(-DDEBUG) ADD_DEFINITIONS(-Wall) ADD_DEFINITIONS(-W) ADD_DEFINITIONS(-Wcast-align) @@ -133,6 +145,8 @@ if(CMAKE_BUILD_TYPE MATCHES Debug) ADD_DEFINITIONS(-Woverloaded-virtual) ADD_DEFINITIONS(-Wsign-promo) ADD_DEFINITIONS(-Wundef -Wunused) +endif() + ADD_DEFINITIONS(-DDEBUG) message("Debug : yes") else(CMAKE_BUILD_TYPE MATCHES Debug) message("Debug : no (run \"cmake . -DCMAKE_BUILD_TYPE=Debug\")") @@ -147,7 +161,7 @@ include_directories(include) include_directories(${EVENT_INCLUDE_DIRS}) include_directories(${SWIFTEN_INCLUDE_DIR}) include_directories(${Boost_INCLUDE_DIRS}) - +include_directories(${OPENSSL_INCLUDE_DIR}) ADD_SUBDIRECTORY(src) ADD_SUBDIRECTORY(include) diff --git a/spectrum/src/main.cpp b/spectrum/src/main.cpp index 409a4f18..563569e0 100644 --- a/spectrum/src/main.cpp +++ b/spectrum/src/main.cpp @@ -1,323 +1,326 @@ -#include "transport/config.h" -#include "transport/transport.h" -#include "transport/filetransfermanager.h" -#include "transport/usermanager.h" -#include "transport/logger.h" -#include "transport/sqlite3backend.h" -#include "transport/mysqlbackend.h" -#include "transport/userregistration.h" -#include "transport/networkpluginserver.h" -#include "transport/admininterface.h" -#include "transport/util.h" -#include "Swiften/EventLoop/SimpleEventLoop.h" -#include -#ifndef WIN32 -#include "sys/signal.h" -#include -#include -#include -#else -#include -#include -#endif -#include "log4cxx/logger.h" -#include "log4cxx/consoleappender.h" -#include "log4cxx/patternlayout.h" -#include "log4cxx/propertyconfigurator.h" -#include "log4cxx/helpers/properties.h" -#include "log4cxx/helpers/fileinputstream.h" -#include "libgen.h" -#include - -using namespace log4cxx; - -using namespace Transport; - -static LoggerPtr logger = log4cxx::Logger::getLogger("Spectrum"); - -Swift::SimpleEventLoop *eventLoop_ = NULL; -Component *component_ = NULL; -UserManager *userManager_ = NULL; - -static void stop_spectrum() { - userManager_->removeAllUsers(); - component_->stop(); - eventLoop_->stop(); -} - -static void spectrum_sigint_handler(int sig) { - eventLoop_->postEvent(&stop_spectrum); -} - -static void spectrum_sigterm_handler(int sig) { - eventLoop_->postEvent(&stop_spectrum); -} - -static void removeOldIcons(std::string iconDir) { - std::vector dirs; - dirs.push_back(iconDir); - - boost::thread thread(boost::bind(Util::removeEverythingOlderThan, dirs, time(NULL) - 3600*24*14)); -} - -#ifndef WIN32 -static void daemonize(const char *cwd, const char *lock_file) { - pid_t pid, sid; - FILE* lock_file_f; - char process_pid[20]; - - /* already a daemon */ - if ( getppid() == 1 ) return; - - /* Fork off the parent process */ - pid = fork(); - if (pid < 0) { - exit(1); - } - /* If we got a good PID, then we can exit the parent process. */ - if (pid > 0) { - exit(0); - } - - /* At this point we are executing as the child process */ - - /* Change the file mode mask */ - umask(0); - - /* Create a new SID for the child process */ - sid = setsid(); - if (sid < 0) { - exit(1); - } - - /* Change the current working directory. This prevents the current - directory from being locked; hence not being able to remove it. */ - if ((chdir(cwd)) < 0) { - exit(1); - } - - if (lock_file) { - /* write our pid into it & close the file. */ - lock_file_f = fopen(lock_file, "w+"); - if (lock_file_f == NULL) { - std::cout << "EE cannot create lock file " << lock_file << ". Exiting\n"; - exit(1); - } - sprintf(process_pid,"%d\n",getpid()); - if (fwrite(process_pid,1,strlen(process_pid),lock_file_f) < strlen(process_pid)) { - std::cout << "EE cannot write to lock file " << lock_file << ". Exiting\n"; - exit(1); - } - fclose(lock_file_f); - } - - if (freopen( "/dev/null", "r", stdin) == NULL) { - std::cout << "EE cannot open /dev/null. Exiting\n"; - exit(1); - } -} - -#endif - -int main(int argc, char **argv) -{ - Config config; - - boost::program_options::variables_map vm; - bool no_daemon = false; - std::string config_file; - - -#ifndef WIN32 - if (signal(SIGINT, spectrum_sigint_handler) == SIG_ERR) { - std::cout << "SIGINT handler can't be set\n"; - return -1; - } - - if (signal(SIGTERM, spectrum_sigterm_handler) == SIG_ERR) { - std::cout << "SIGTERM handler can't be set\n"; - return -1; - } -#endif - boost::program_options::options_description desc("Usage: spectrum [OPTIONS] \nAllowed options"); - desc.add_options() - ("help,h", "help") - ("no-daemonize,n", "Do not run spectrum as daemon") - ("config", boost::program_options::value(&config_file)->default_value(""), "Config file") - ; - try - { - boost::program_options::positional_options_description p; - p.add("config", -1); - boost::program_options::store(boost::program_options::command_line_parser(argc, argv). - options(desc).positional(p).run(), vm); - boost::program_options::notify(vm); - - - - if(vm.count("help")) - { - std::cout << desc << "\n"; - return 1; - } - - if(vm.count("config") == 0) { - std::cout << desc << "\n"; - return 1; - } - - if(vm.count("no-daemonize")) { - no_daemon = true; - } - } - catch (std::runtime_error& e) - { - std::cout << desc << "\n"; - return 1; - } - catch (...) - { - std::cout << desc << "\n"; - return 1; - } - - if (!config.load(vm["config"].as())) { - std::cerr << "Can't load configuration file.\n"; - return 1; - } - -#ifndef WIN32 - if (!no_daemon) { - // create directories - try { - boost::filesystem::create_directories(CONFIG_STRING(&config, "service.working_dir")); - } - catch (...) { - std::cerr << "Can't create service.working_dir directory " << CONFIG_STRING(&config, "service.working_dir") << ".\n"; - return 1; - } - try { - boost::filesystem::create_directories( - boost::filesystem::path(CONFIG_STRING(&config, "service.pidfile")).parent_path().string() - ); - } - catch (...) { - std::cerr << "Can't create service.pidfile directory " << boost::filesystem::path(CONFIG_STRING(&config, "service.pidfile")).parent_path().string() << ".\n"; - return 1; - } - - // daemonize - daemonize(CONFIG_STRING(&config, "service.working_dir").c_str(), CONFIG_STRING(&config, "service.pidfile").c_str()); -// removeOldIcons(CONFIG_STRING(&config, "service.working_dir") + "/icons"); - } -#endif - - if (CONFIG_STRING(&config, "logging.config").empty()) { - LoggerPtr root = log4cxx::Logger::getRootLogger(); -#ifdef WIN32 - root->addAppender(new ConsoleAppender(new PatternLayout(L"%d %-5p %c: %m%n"))); -#else - root->addAppender(new ConsoleAppender(new PatternLayout("%d %-5p %c: %m%n"))); -#endif - } - else { - log4cxx::helpers::Properties p; - log4cxx::helpers::FileInputStream *istream = new log4cxx::helpers::FileInputStream(CONFIG_STRING(&config, "logging.config")); - - p.load(istream); - p.setProperty("pid", boost::lexical_cast(getpid())); - p.setProperty("jid", CONFIG_STRING(&config, "service.jid")); - log4cxx::PropertyConfigurator::configure(p); - } - -#ifndef WIN32 - if (!CONFIG_STRING(&config, "service.group").empty() ||!CONFIG_STRING(&config, "service.user").empty() ) { - struct rlimit limit; - getrlimit(RLIMIT_CORE, &limit); - - if (!CONFIG_STRING(&config, "service.group").empty()) { - struct group *gr; - if ((gr = getgrnam(CONFIG_STRING(&config, "service.group").c_str())) == NULL) { - LOG4CXX_ERROR(logger, "Invalid service.group name " << CONFIG_STRING(&config, "service.group")); - return 1; - } - - if (((setgid(gr->gr_gid)) != 0) || (initgroups(CONFIG_STRING(&config, "service.user").c_str(), gr->gr_gid) != 0)) { - LOG4CXX_ERROR(logger, "Failed to set service.group name " << CONFIG_STRING(&config, "service.group") << " - " << gr->gr_gid << ":" << strerror(errno)); - return 1; - } - } - - if (!CONFIG_STRING(&config, "service.user").empty()) { - struct passwd *pw; - if ((pw = getpwnam(CONFIG_STRING(&config, "service.user").c_str())) == NULL) { - LOG4CXX_ERROR(logger, "Invalid service.user name " << CONFIG_STRING(&config, "service.user")); - return 1; - } - - if ((setuid(pw->pw_uid)) != 0) { - LOG4CXX_ERROR(logger, "Failed to set service.user name " << CONFIG_STRING(&config, "service.user") << " - " << pw->pw_uid << ":" << strerror(errno)); - return 1; - } - } - setrlimit(RLIMIT_CORE, &limit); - } -#endif - - Swift::SimpleEventLoop eventLoop; - - Swift::BoostNetworkFactories *factories = new Swift::BoostNetworkFactories(&eventLoop); - UserRegistry userRegistry(&config, factories); - - Component transport(&eventLoop, factories, &config, NULL, &userRegistry); - component_ = &transport; -// Logger logger(&transport); - - StorageBackend *storageBackend = NULL; - -#ifdef WITH_SQLITE - if (CONFIG_STRING(&config, "database.type") == "sqlite3") { - storageBackend = new SQLite3Backend(&config); - if (!storageBackend->connect()) { - std::cerr << "Can't connect to database.\n"; - return -1; - } - } -#endif -#ifdef WITH_MYSQL - if (CONFIG_STRING(&config, "database.type") == "mysql") { - storageBackend = new MySQLBackend(&config); - if (!storageBackend->connect()) { - std::cerr << "Can't connect to database.\n"; - return -1; - } - } -#endif - - UserManager userManager(&transport, &userRegistry, storageBackend); - userManager_ = &userManager; - UserRegistration *userRegistration = NULL; - if (storageBackend) { - userRegistration = new UserRegistration(&transport, &userManager, storageBackend); - userRegistration->start(); -// logger.setUserRegistration(&userRegistration); - } -// logger.setUserManager(&userManager); - - FileTransferManager ftManager(&transport, &userManager); - - NetworkPluginServer plugin(&transport, &config, &userManager, &ftManager); - - AdminInterface adminInterface(&transport, &userManager, &plugin, storageBackend); - - eventLoop_ = &eventLoop; - - eventLoop.run(); - - if (userRegistration) { - userRegistration->stop(); - delete userRegistration; - } - delete storageBackend; - delete factories; -} +#include "transport/config.h" +#include "transport/transport.h" +#include "transport/filetransfermanager.h" +#include "transport/usermanager.h" +#include "transport/logger.h" +#include "transport/sqlite3backend.h" +#include "transport/mysqlbackend.h" +#include "transport/userregistration.h" +#include "transport/networkpluginserver.h" +#include "transport/admininterface.h" +#include "transport/util.h" +#include "Swiften/EventLoop/SimpleEventLoop.h" +#include +#ifndef WIN32 +#include "sys/signal.h" +#include +#include +#include +#include "libgen.h" +#else +#include +#endif +#include "log4cxx/logger.h" +#include "log4cxx/consoleappender.h" +#include "log4cxx/patternlayout.h" +#include "log4cxx/propertyconfigurator.h" +#include "log4cxx/helpers/properties.h" +#include "log4cxx/helpers/transcoder.h" +#include "log4cxx/helpers/fileinputstream.h" +#include + +using namespace log4cxx; + +using namespace Transport; + +static LoggerPtr logger = log4cxx::Logger::getLogger("Spectrum"); + +Swift::SimpleEventLoop *eventLoop_ = NULL; +Component *component_ = NULL; +UserManager *userManager_ = NULL; + +static void stop_spectrum() { + userManager_->removeAllUsers(); + component_->stop(); + eventLoop_->stop(); +} + +static void spectrum_sigint_handler(int sig) { + eventLoop_->postEvent(&stop_spectrum); +} + +static void spectrum_sigterm_handler(int sig) { + eventLoop_->postEvent(&stop_spectrum); +} + +static void removeOldIcons(std::string iconDir) { + std::vector dirs; + dirs.push_back(iconDir); + + boost::thread thread(boost::bind(Util::removeEverythingOlderThan, dirs, time(NULL) - 3600*24*14)); +} + +#ifndef WIN32 +static void daemonize(const char *cwd, const char *lock_file) { + pid_t pid, sid; + FILE* lock_file_f; + char process_pid[20]; + + /* already a daemon */ + if ( getppid() == 1 ) return; + + /* Fork off the parent process */ + pid = fork(); + if (pid < 0) { + exit(1); + } + /* If we got a good PID, then we can exit the parent process. */ + if (pid > 0) { + exit(0); + } + + /* At this point we are executing as the child process */ + + /* Change the file mode mask */ + umask(0); + + /* Create a new SID for the child process */ + sid = setsid(); + if (sid < 0) { + exit(1); + } + + /* Change the current working directory. This prevents the current + directory from being locked; hence not being able to remove it. */ + if ((chdir(cwd)) < 0) { + exit(1); + } + + if (lock_file) { + /* write our pid into it & close the file. */ + lock_file_f = fopen(lock_file, "w+"); + if (lock_file_f == NULL) { + std::cout << "EE cannot create lock file " << lock_file << ". Exiting\n"; + exit(1); + } + sprintf(process_pid,"%d\n",getpid()); + if (fwrite(process_pid,1,strlen(process_pid),lock_file_f) < strlen(process_pid)) { + std::cout << "EE cannot write to lock file " << lock_file << ". Exiting\n"; + exit(1); + } + fclose(lock_file_f); + } + + if (freopen( "/dev/null", "r", stdin) == NULL) { + std::cout << "EE cannot open /dev/null. Exiting\n"; + exit(1); + } +} + +#endif + +int main(int argc, char **argv) +{ + Config config; + + boost::program_options::variables_map vm; + bool no_daemon = false; + std::string config_file; + + +#ifndef WIN32 + if (signal(SIGINT, spectrum_sigint_handler) == SIG_ERR) { + std::cout << "SIGINT handler can't be set\n"; + return -1; + } + + if (signal(SIGTERM, spectrum_sigterm_handler) == SIG_ERR) { + std::cout << "SIGTERM handler can't be set\n"; + return -1; + } +#endif + boost::program_options::options_description desc("Usage: spectrum [OPTIONS] \nAllowed options"); + desc.add_options() + ("help,h", "help") + ("no-daemonize,n", "Do not run spectrum as daemon") + ("config", boost::program_options::value(&config_file)->default_value(""), "Config file") + ; + try + { + boost::program_options::positional_options_description p; + p.add("config", -1); + boost::program_options::store(boost::program_options::command_line_parser(argc, argv). + options(desc).positional(p).run(), vm); + boost::program_options::notify(vm); + + + + if(vm.count("help")) + { + std::cout << desc << "\n"; + return 1; + } + + if(vm.count("config") == 0) { + std::cout << desc << "\n"; + return 1; + } + + if(vm.count("no-daemonize")) { + no_daemon = true; + } + } + catch (std::runtime_error& e) + { + std::cout << desc << "\n"; + return 1; + } + catch (...) + { + std::cout << desc << "\n"; + return 1; + } + + if (!config.load(vm["config"].as())) { + std::cerr << "Can't load configuration file.\n"; + return 1; + } + +#ifndef WIN32 + if (!no_daemon) { + // create directories + try { + boost::filesystem::create_directories(CONFIG_STRING(&config, "service.working_dir")); + } + catch (...) { + std::cerr << "Can't create service.working_dir directory " << CONFIG_STRING(&config, "service.working_dir") << ".\n"; + return 1; + } + try { + boost::filesystem::create_directories( + boost::filesystem::path(CONFIG_STRING(&config, "service.pidfile")).parent_path().string() + ); + } + catch (...) { + std::cerr << "Can't create service.pidfile directory " << boost::filesystem::path(CONFIG_STRING(&config, "service.pidfile")).parent_path().string() << ".\n"; + return 1; + } + + // daemonize + daemonize(CONFIG_STRING(&config, "service.working_dir").c_str(), CONFIG_STRING(&config, "service.pidfile").c_str()); +// removeOldIcons(CONFIG_STRING(&config, "service.working_dir") + "/icons"); + } +#endif + + if (CONFIG_STRING(&config, "logging.config").empty()) { + LoggerPtr root = log4cxx::Logger::getRootLogger(); +#ifdef WIN32 + root->addAppender(new ConsoleAppender(new PatternLayout(L"%d %-5p %c: %m%n"))); +#else + root->addAppender(new ConsoleAppender(new PatternLayout("%d %-5p %c: %m%n"))); +#endif + } + else { + log4cxx::helpers::Properties p; + log4cxx::helpers::FileInputStream *istream = new log4cxx::helpers::FileInputStream(CONFIG_STRING(&config, "logging.config")); + + p.load(istream); + LogString pid, jid; + log4cxx::helpers::Transcoder::decode(boost::lexical_cast(getpid()), pid); + log4cxx::helpers::Transcoder::decode(CONFIG_STRING(&config, "service.jid"), jid); + p.setProperty(L"pid", pid); + p.setProperty(L"jid", jid); + log4cxx::PropertyConfigurator::configure(p); + } + +#ifndef WIN32 + if (!CONFIG_STRING(&config, "service.group").empty() ||!CONFIG_STRING(&config, "service.user").empty() ) { + struct rlimit limit; + getrlimit(RLIMIT_CORE, &limit); + + if (!CONFIG_STRING(&config, "service.group").empty()) { + struct group *gr; + if ((gr = getgrnam(CONFIG_STRING(&config, "service.group").c_str())) == NULL) { + LOG4CXX_ERROR(logger, "Invalid service.group name " << CONFIG_STRING(&config, "service.group")); + return 1; + } + + if (((setgid(gr->gr_gid)) != 0) || (initgroups(CONFIG_STRING(&config, "service.user").c_str(), gr->gr_gid) != 0)) { + LOG4CXX_ERROR(logger, "Failed to set service.group name " << CONFIG_STRING(&config, "service.group") << " - " << gr->gr_gid << ":" << strerror(errno)); + return 1; + } + } + + if (!CONFIG_STRING(&config, "service.user").empty()) { + struct passwd *pw; + if ((pw = getpwnam(CONFIG_STRING(&config, "service.user").c_str())) == NULL) { + LOG4CXX_ERROR(logger, "Invalid service.user name " << CONFIG_STRING(&config, "service.user")); + return 1; + } + + if ((setuid(pw->pw_uid)) != 0) { + LOG4CXX_ERROR(logger, "Failed to set service.user name " << CONFIG_STRING(&config, "service.user") << " - " << pw->pw_uid << ":" << strerror(errno)); + return 1; + } + } + setrlimit(RLIMIT_CORE, &limit); + } +#endif + + Swift::SimpleEventLoop eventLoop; + + Swift::BoostNetworkFactories *factories = new Swift::BoostNetworkFactories(&eventLoop); + UserRegistry userRegistry(&config, factories); + + Component transport(&eventLoop, factories, &config, NULL, &userRegistry); + component_ = &transport; +// Logger logger(&transport); + + StorageBackend *storageBackend = NULL; + +#ifdef WITH_SQLITE + if (CONFIG_STRING(&config, "database.type") == "sqlite3") { + storageBackend = new SQLite3Backend(&config); + if (!storageBackend->connect()) { + std::cerr << "Can't connect to database.\n"; + return -1; + } + } +#endif +#ifdef WITH_MYSQL + if (CONFIG_STRING(&config, "database.type") == "mysql") { + storageBackend = new MySQLBackend(&config); + if (!storageBackend->connect()) { + std::cerr << "Can't connect to database.\n"; + return -1; + } + } +#endif + + UserManager userManager(&transport, &userRegistry, storageBackend); + userManager_ = &userManager; + UserRegistration *userRegistration = NULL; + if (storageBackend) { + userRegistration = new UserRegistration(&transport, &userManager, storageBackend); + userRegistration->start(); +// logger.setUserRegistration(&userRegistration); + } +// logger.setUserManager(&userManager); + + FileTransferManager ftManager(&transport, &userManager); + + NetworkPluginServer plugin(&transport, &config, &userManager, &ftManager); + + AdminInterface adminInterface(&transport, &userManager, &plugin, storageBackend); + + eventLoop_ = &eventLoop; + + eventLoop.run(); + + if (userRegistration) { + userRegistration->stop(); + delete userRegistration; + } + delete storageBackend; + delete factories; +} diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5c9d61a7..bf3d27f4 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,34 +1,44 @@ -cmake_minimum_required(VERSION 2.6) -FILE(GLOB SRC *.cpp *.h) -FILE(GLOB_RECURSE SWIFTEN_SRC ../include/Swiften/*.cpp) -FILE(GLOB HEADERS ../include/transport/*.h) - -if (PROTOBUF_FOUND) - PROTOBUF_GENERATE_CPP(PROTOBUF_SRC PROTOBUF_HDRS "pbnetwork.proto") -endif() - -if (CPPUNIT_FOUND) - FILE(GLOB SRC_TEST tests/*.cpp) - - ADD_EXECUTABLE(libtransport_test ${SRC_TEST}) - - target_link_libraries(libtransport_test transport ${CPPUNIT_LIBRARIES} ${Boost_LIBRARIES}) -endif() - -include_directories(${POPT_INCLUDE_DIR}) - -# SOURCE_GROUP(headers FILES ${HEADERS}) - -ADD_LIBRARY(transport SHARED ${HEADERS} ${SRC} ${SWIFTEN_SRC} ${PROTOBUF_SRC} ${PROTOBUF_HDRS}) -ADD_DEFINITIONS(-fPIC) - -TARGET_LINK_LIBRARIES(transport ${Boost_LIBRARIES} ${SQLITE3_LIBRARIES} ${MYSQL_LIBRARIES} ${SWIFTEN_LIBRARY} ${PROTOBUF_LIBRARIES} ${LOG4CXX_LIBRARIES} ${POPT_LIBRARY}) - -SET_TARGET_PROPERTIES(transport PROPERTIES - VERSION ${TRANSPORT_VERSION} SOVERSION ${TRANSPORT_VERSION} -) - -INSTALL(TARGETS transport LIBRARY DESTINATION lib ARCHIVE DESTINATION lib COMPONENT libraries) - -#CONFIGURE_FILE(transport.pc.in "${CMAKE_CURRENT_BINARY_DIR}/transport.pc") -#INSTALL(FILES "${CMAKE_CURRENT_BINARY_DIR}/transport.pc" DESTINATION lib/pkgconfig) +cmake_minimum_required(VERSION 2.6) +FILE(GLOB SRC *.cpp *.h) +FILE(GLOB_RECURSE SWIFTEN_SRC ../include/Swiften/*.cpp) +FILE(GLOB HEADERS ../include/transport/*.h) + +if (PROTOBUF_FOUND) + PROTOBUF_GENERATE_CPP(PROTOBUF_SRC PROTOBUF_HDRS "pbnetwork.proto") +endif() + +if (CPPUNIT_FOUND) + FILE(GLOB SRC_TEST tests/*.cpp) + + ADD_EXECUTABLE(libtransport_test ${SRC_TEST}) + + target_link_libraries(libtransport_test transport ${CPPUNIT_LIBRARIES} ${Boost_LIBRARIES}) +endif() + +if (NOT WIN32) +include_directories(${POPT_INCLUDE_DIR}) +endif() + +# SOURCE_GROUP(headers FILES ${HEADERS}) + +if (CMAKE_COMPILER_IS_GNUCXX) +ADD_LIBRARY(transport SHARED ${HEADERS} ${SRC} ${SWIFTEN_SRC} ${PROTOBUF_SRC} ${PROTOBUF_HDRS}) +ADD_DEFINITIONS(-fPIC) +else() +ADD_LIBRARY(transport STATIC ${HEADERS} ${SRC} ${SWIFTEN_SRC} ${PROTOBUF_SRC} ${PROTOBUF_HDRS}) +endif() + +if (WIN32) +TARGET_LINK_LIBRARIES(transport ${Boost_LIBRARIES} ${SQLITE3_LIBRARIES} ${MYSQL_LIBRARIES} ${SWIFTEN_LIBRARY} ${PROTOBUF_LIBRARIES} ${LOG4CXX_LIBRARIES}) +else () +TARGET_LINK_LIBRARIES(transport ${Boost_LIBRARIES} ${SQLITE3_LIBRARIES} ${MYSQL_LIBRARIES} ${SWIFTEN_LIBRARY} ${PROTOBUF_LIBRARIES} ${LOG4CXX_LIBRARIES} ${POPT_LIBRARY}) +endif() + +SET_TARGET_PROPERTIES(transport PROPERTIES + VERSION ${TRANSPORT_VERSION} SOVERSION ${TRANSPORT_VERSION} +) + +INSTALL(TARGETS transport LIBRARY DESTINATION lib ARCHIVE DESTINATION lib COMPONENT libraries) + +#CONFIGURE_FILE(transport.pc.in "${CMAKE_CURRENT_BINARY_DIR}/transport.pc") +#INSTALL(FILES "${CMAKE_CURRENT_BINARY_DIR}/transport.pc" DESTINATION lib/pkgconfig) diff --git a/src/config.cpp b/src/config.cpp index eece6790..9b3e55e7 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -20,6 +20,12 @@ #include "transport/config.h" #include +#ifdef _MSC_VER +#include +#define getcwd _getcwd +#include +#define PATH_MAX MAX_PATH +#endif using namespace boost::program_options;