Yet another attempt to use CMake

This commit is contained in:
Alexey Sokolov
2015-12-14 00:16:44 +00:00
parent 04ad80b86e
commit 561a18054c
51 changed files with 2204 additions and 77 deletions
+22 -4
View File
@@ -9,23 +9,41 @@ cache:
environment:
matrix:
- cygwin_url: https://cygwin.com/setup-x86_64.exe
build_with: cmake
- cygwin_url: https://cygwin.com/setup-x86.exe
build_with: cmake
- cygwin_url: https://cygwin.com/setup-x86_64.exe
build_with: autoconf
- cygwin_url: https://cygwin.com/setup-x86.exe
build_with: autoconf
install:
- ps: Invoke-WebRequest $env:cygwin_url -OutFile c:\cygwin-setup.exe
# libcrypt-devel is needed only on x86_64 and only for modperl... probably some dependency problem.
- c:\cygwin-setup.exe --quiet-mode --no-shortcuts --no-startmenu --no-desktop --upgrade-also --only-site --site http://cygwin.mirror.constant.com/ --root c:\cygwin-root --local-package-dir c:\cygwin-setup-cache --packages automake,gcc-g++,make,pkg-config,wget,openssl-devel,libicu-devel,zlib-devel,libcrypt-devel,perl,python3,swig,libsasl2-devel,libQt5Core-devel
- c:\cygwin-setup.exe --quiet-mode --no-shortcuts --no-startmenu --no-desktop --upgrade-also --only-site --site http://cygwin.mirror.constant.com/ --root c:\cygwin-root --local-package-dir c:\cygwin-setup-cache --packages automake,gcc-g++,make,pkg-config,wget,openssl-devel,libicu-devel,zlib-devel,libcrypt-devel,perl,python3,swig,libsasl2-devel,libQt5Core-devel,cmake
- c:\cygwin-root\bin\sh -lc "echo Hi"
- c:\cygwin-root\bin\sh -lc "uname -a"
- c:\cygwin-root\bin\sh -lc "cat /proc/cpuinfo"
- c:\cygwin-root\bin\sh -lc "cat /proc/meminfo"
- c:\cygwin-root\bin\sh -lc "cygcheck -s -v > $APPVEYOR_BUILD_FOLDER/cygcheck.log 2>&1"
- ps: Push-AppveyorArtifact cygcheck.log
- ps: |
if ($env:build_with -eq "cmake") {
$env:cfg_suffix = ".py"
$env:unittest = "unittest"
$env:inttest = "inttest"
} else {
$env:cfg_suffix = ""
$env:unittest = "test"
$env:inttest = "test2"
}
# stdin is broken at AppVeyor, so we open it explicitly as /dev/null
build_script:
- git submodule update --init
- c:\cygwin-root\bin\sh -lc "cd $APPVEYOR_BUILD_FOLDER; ./autogen.sh < /dev/null"
- mkdir build
- c:\cygwin-root\bin\sh -lc "cd $APPVEYOR_BUILD_FOLDER/build; ../configure --enable-charset --enable-zlib --enable-openssl --enable-perl --enable-python --enable-cyrus < /dev/null; appveyor PushArtifact config.log"
- c:\cygwin-root\bin\sh -lc "cd $APPVEYOR_BUILD_FOLDER/build; ../configure$cfg_suffix --enable-charset --enable-zlib --enable-openssl --enable-perl --enable-python --enable-cyrus < /dev/null"
- c:\cygwin-root\bin\sh -lc "cd $APPVEYOR_BUILD_FOLDER/build; if [[ $build_with == cmake ]]; then cmake --system-information > config.log; fi"
- c:\cygwin-root\bin\sh -lc "cd $APPVEYOR_BUILD_FOLDER/build; appveyor PushArtifact config.log"
- c:\cygwin-root\bin\sh -lc "cd $APPVEYOR_BUILD_FOLDER/build; make VERBOSE=1 -j2 < /dev/null"
- c:\cygwin-root\bin\sh -lc "cd $APPVEYOR_BUILD_FOLDER/build; make install < /dev/null"
- c:\cygwin-root\bin\sh -lc "znc --version"
@@ -33,5 +51,5 @@ build_script:
- c:\cygwin-root\bin\sh -lc "find /usr/local/lib/znc -iname '*.dll' -o -iname '*.so' | tee /tmp/files-to-rebase"
- c:\cygwin-root\bin\sh -lc "rebaseall -v -T /tmp/files-to-rebase"
test_script:
- c:\cygwin-root\bin\sh -lc "cd $APPVEYOR_BUILD_FOLDER/build; make VERBOSE=1 test < /dev/null"
- c:\cygwin-root\bin\sh -lc "cd $APPVEYOR_BUILD_FOLDER/build; make VERBOSE=1 test2 < /dev/null"
- c:\cygwin-root\bin\sh -lc "cd $APPVEYOR_BUILD_FOLDER/build; make VERBOSE=1 $unittest < /dev/null"
- c:\cygwin-root\bin\sh -lc "cd $APPVEYOR_BUILD_FOLDER/build; make VERBOSE=1 $inttest < /dev/null"
+25 -11
View File
@@ -8,22 +8,31 @@ matrix:
include:
- os: linux
compiler: gcc
env: BUILD_TYPE=normal
env: BUILD_TYPE=normal BUILD_WITH=cmake
- os: linux
compiler: gcc
env: BUILD_TYPE=coverage
env: BUILD_TYPE=normal BUILD_WITH=autoconf
- os: linux
compiler: gcc
env: BUILD_TYPE=coverage BUILD_WITH=autoconf
- os: linux
compiler: clang
env: BUILD_TYPE=asan
env: BUILD_TYPE=asan BUILD_WITH=cmake
- os: linux
compiler: clang
env: BUILD_TYPE=tsan
env: BUILD_TYPE=tsan BUILD_WITH=cmake
- os: osx
compiler: clang
env: BUILD_TYPE=normal
env: BUILD_TYPE=normal BUILD_WITH=cmake
- os: osx
compiler: clang
env: BUILD_TYPE=normal BUILD_WITH=autoconf
- os: linux
compiler: gcc
env: BUILD_TYPE=tarball
env: BUILD_TYPE=tarball BUILD_WITH=cmake
- os: linux
compiler: gcc
env: BUILD_TYPE=tarball BUILD_WITH=autoconf
before_install:
- "echo os: [$TRAVIS_OS_NAME] build: [$BUILD_TYPE]"
- if [[ "$BUILD_TYPE" == "normal" ]]; then export CFGFLAGS= MYCXXFLAGS= MYLDFLAGS=; fi
@@ -31,6 +40,7 @@ before_install:
- if [[ "$BUILD_TYPE" == "asan" ]]; then export CFGFLAGS=--enable-debug MYCXXFLAGS="-fsanitize=address -O1 -fno-omit-frame-pointer -fno-optimize-sibling-calls -fPIE" MYLDFLAGS="-fsanitize=address -pie"; fi
- if [[ "$BUILD_TYPE" == "tsan" ]]; then export CFGFLAGS=--enable-debug MYCXXFLAGS="-fsanitize=thread -O1 -fPIE" MYLDFLAGS="-fsanitize=thread -pie"; fi
- if [[ "$BUILD_TYPE" == "coverage" ]]; then export CFGFLAGS="--enable-debug --disable-perl --disable-python" MYCXXFLAGS=--coverage MYLDFLAGS=--coverage DISABLED_ZNC_PERL_PYTHON_TEST=1; fi
- if [[ "$BUILD_WITH" == "cmake" ]]; then export CFGSUFFIX=.py UNITTEST=unittest INTTEST=inttest; else export CFGSUFFIX= UNITTEST=test INTTEST=test2; fi
# UBSan randomly crashes clang, and very often :(
# CFGFLAGS=--enable-debug MYCXXFLAGS="-fsanitize=undefined -O1 -fPIE -fno-sanitize-recover" MYLDFLAGS="-fsanitize=undefined -pie -fno-sanitize-recover"
- if [[ "$TRAVIS_REPO_SLUG" == "znc/znc" && "$TRAVIS_PULL_REQUEST" == "false" && "$TRAVIS_BRANCH" == "master" ]]; then openssl aes-256-cbc -d -in .travis-github.enc -out ~/znc-github-key -k ${SECRET_KEY}; fi
@@ -41,10 +51,12 @@ install:
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo add-apt-repository -y ppa:teward/swig3.0; fi
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo add-apt-repository -y ppa:beineri/opt-qt551-trusty; fi # default qt5.2 from trusty doesn't support QByteArray::toStdString()
- if [[ "$TRAVIS_OS_NAME" == "linux" && "$BUILD_TYPE" == "tarball" ]]; then sudo add-apt-repository -y ppa:ostogvin/tjo-develop; fi # gtest+gmock
- if [[ "$TRAVIS_OS_NAME" == "linux" && "$BUILD_WITH" == "cmake" ]]; then sudo add-apt-repository -y ppa:george-edison55/cmake-3.x; fi
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo apt-get update; fi
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo apt-get install -y libperl-dev python3-dev tcl-dev libsasl2-dev libicu-dev swig3.0 doxygen graphviz qt55base python3-yaml; fi
- if [[ "$TRAVIS_OS_NAME" == "linux" && "$BUILD_TYPE" == "tarball" ]]; then sudo apt-get install -y google-mock libgtest-dev; fi
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then source /opt/qt55/bin/qt55-env.sh; fi
- if [[ "$TRAVIS_OS_NAME" == "linux" && "$BUILD_WITH" == "cmake" ]]; then sudo apt-get install -y cmake; fi
- |
if [[ "$TRAVIS_OS_NAME" == "linux" && "$BUILD_TYPE" == "coverage" ]]; then
sudo apt-get install -y lcov
@@ -58,6 +70,7 @@ install:
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew list --versions; fi
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update; fi
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install swig python3 icu4c jq openssl qt5; fi
- if [[ "$TRAVIS_OS_NAME" == "osx" && "$BUILD_WITH" == "cmake" ]]; then brew upgrade cmake; fi # preinstalled cmake on travis is too old
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew info --json=v1 --installed | jq .; fi
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then export PKG_CONFIG_PATH="$(brew --prefix qt5)/lib/pkgconfig:$PKG_CONFIG_PATH"; fi
- "echo pkg-config path: [$PKG_CONFIG_PATH]"
@@ -65,16 +78,17 @@ script:
- if [[ "$BUILD_TYPE" == "tarball" ]]; then ./make-tarball.sh --nightly znc-git-2015-01-16 /tmp/znc-tarball.tar.gz; fi
- if [[ "$BUILD_TYPE" == "tarball" ]]; then cd /tmp; tar xvf znc-tarball.tar.gz; fi
- if [[ "$BUILD_TYPE" == "tarball" ]]; then cd /tmp/znc-git-2015-01-16; fi
- if [[ "$BUILD_TYPE" != "tarball" ]]; then ./bootstrap.sh; fi
- if [[ "$BUILD_TYPE" != "tarball" && "$BUILD_WITH" != "cmake" ]]; then ./bootstrap.sh; fi
- mkdir build
- cd build
- ../configure --enable-perl --enable-python --enable-tcl --enable-cyrus --enable-charset $CFGFLAGS CXXFLAGS="$CXXFLAGS $MYCXXFLAGS" LDFLAGS="$LDFLAGS $MYLDFLAGS"
- cat config.log
- ../configure$CFGSUFFIX --enable-perl --enable-python --enable-tcl --enable-cyrus --enable-charset $CFGFLAGS CXXFLAGS="$CXXFLAGS $MYCXXFLAGS" LDFLAGS="$LDFLAGS $MYLDFLAGS"
- if [[ "$BUILD_WITH" == "cmake" ]]; then cmake --system-information; else cat config.log; fi
- make VERBOSE=1
- make VERBOSE=1 test
- make VERBOSE=1 $UNITTEST
- sudo make install
- make VERBOSE=1 test2
- make VERBOSE=1 $INTTEST
- cd ..
- /usr/local/bin/znc --version
after_success:
- test -r .travis_after_all.py && python .travis_after_all.py || echo No .travis_after_all.py found
- test -r .to_export_back && echo $(cat .to_export_back) || echo No .to_export_back found
+333
View File
@@ -0,0 +1,333 @@
#
# Copyright (C) 2004-2016 ZNC, see the NOTICE file for details.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
cmake_minimum_required(VERSION 3.0)
project(ZNC VERSION 1.7.0)
set(ZNC_VERSION 1.7.x)
set(append_git_version true)
set(alpha_version "") # e.g. "-rc1"
set(PROJECT_VERSION "${ZNC_VERSION}")
# https://cmake.org/pipermail/cmake/2010-September/039388.html
set(_all_targets "" CACHE INTERNAL "")
function(znc_add_library name)
add_library("${name}" ${ARGN})
set(_all_targets "${_all_targets};${name}" CACHE INTERNAL "")
endfunction()
function(znc_add_executable name)
add_executable("${name}" ${ARGN})
set(_all_targets "${_all_targets};${name}" CACHE INTERNAL "")
endfunction()
list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
include(TestCXX11)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED true)
if(NOT CYGWIN)
# We don't want to use -std=gnu++11 instead of -std=c++11, but among other
# things, -std=c++11 on cygwin defines __STRICT_ANSI__ which makes cygwin
# not to compile: undefined references to strerror_r, to fdopen, to
# strcasecmp, etc (their declarations in system headers are between ifdef)
set(CMAKE_CXX_EXTENSIONS false)
endif()
include(CMakeFindFrameworks_fixed)
include(use_homebrew)
include(GNUInstallDirs)
include(CheckCXXSymbolExists)
include(copy_csocket)
set(CMAKE_THREAD_PREFER_PTHREAD true)
set(THREADS_PREFER_PTHREAD_FLAG true)
find_package(Threads REQUIRED)
if(NOT CMAKE_USE_PTHREADS_INIT)
message(FATAL_ERROR "This compiler/OS doesn't seem to support pthreads.")
endif()
include(TestLargeFiles)
test_large_files(HAVE_LARGE_FILES_UNUSED_VAR)
find_package(PkgConfig)
macro(tristate_option opt help)
set(WANT_${opt} AUTO CACHE STRING ${help})
set_property(CACHE WANT_${opt} PROPERTY STRINGS AUTO YES NO)
if(WANT_${opt} STREQUAL "AUTO")
set(TRISTATE_${opt}_REQUIRED)
else()
set(TRISTATE_${opt}_REQUIRED REQUIRED)
endif()
endmacro()
tristate_option(OPENSSL "Support SSL")
if(WANT_OPENSSL)
find_package(OpenSSL ${TRISTATE_OPENSSL_REQUIRED})
endif()
set(HAVE_LIBSSL "${OPENSSL_FOUND}")
set(WANT_IPV6 true CACHE BOOL "Support IPv6")
set(HAVE_IPV6 "${WANT_IPV6}")
tristate_option(ZLIB "Compress HTTP traffic with Zlib")
if(WANT_ZLIB)
find_package(ZLIB ${TRISTATE_ZLIB_REQUIRED})
endif()
set(HAVE_ZLIB "${ZLIB_FOUND}")
tristate_option(CYRUS "Support authentication with Cyrus")
if(WANT_CYRUS)
pkg_check_modules(CYRUS libsasl2)
if(NOT CYRUS_FOUND)
# libsasl2.pc is missing on 2.1.25 which is on ubuntu 14.04
# next ubuntu version has 2.1.26 which has libsasl2.pc
#
# osx (as of El Capitan) doesn't have it either...
set(_old_cmake_required_libraries "${CMAKE_REQUIRED_LIBRARIES}")
set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} -lsasl2)
check_cxx_symbol_exists(sasl_server_init "sasl/sasl.h" CYRUS_HARDCODED)
set(CMAKE_REQUIRED_LIBRARIES "${_old_cmake_required_libraries}")
if(CYRUS_HARDCODED)
set(CYRUS_LDFLAGS -lsasl2)
set(CYRUS_FOUND true)
endif()
endif()
if(TRISTATE_CYRUS_REQUIRED AND NOT CYRUS_FOUND)
message(FATAL_ERROR "Can't find Cyrus SASL 2")
endif()
endif()
tristate_option(ICU "Support character encodings")
if(WANT_ICU)
pkg_check_modules(ICU ${TRISTATE_ICU_REQUIRED} icu-uc)
endif()
set(HAVE_ICU "${ICU_FOUND}")
set(WANT_PERL false CACHE BOOL "Support Perl modules")
set(WANT_PYTHON false CACHE BOOL "Support Python modules")
set(WANT_PYTHON_VERSION "" CACHE STRING "Python version to use, or empty")
tristate_option(SWIG "Use SWIG to generate modperl and modpython")
set(search_swig false)
if(WANT_SWIG AND TRISTATE_SWIG_REQUIRED)
set(search_swig true)
endif()
if(WANT_PERL AND NOT EXISTS
"${PROJECT_SOURCE_DIR}/modules/modperl/generated.tar.gz")
if(WANT_SWIG)
set(search_swig true)
else()
message(FATAL_ERROR "Pregenerated modperl files are not available. "
"SWIG is required. Alternatively, build ZNC from tarball.")
endif()
endif()
if(WANT_PYTHON AND NOT EXISTS
"${PROJECT_SOURCE_DIR}/modules/modpython/generated.tar.gz")
if(WANT_SWIG)
set(search_swig true)
else()
message(FATAL_ERROR "Pregenerated modpython files are not available. "
"SWIG is required. Alternatively, build ZNC from tarball.")
endif()
endif()
if(search_swig)
find_package(SWIG 3.0.0)
if(NOT SWIG_FOUND)
message(FATAL_ERROR
"Can't find SWIG, therefore Perl and Python aren't supported. "
"Alternatively, build ZNC from tarball.")
endif()
endif()
if(WANT_PERL)
find_package(PerlLibs 5.10 REQUIRED)
endif()
if (WANT_PYTHON)
find_package(Perl 5.10 REQUIRED)
if(WANT_PYTHON_VERSION)
find_package(PythonLibs "${WANT_PYTHON_VERSION}" EXACT REQUIRED)
else()
find_package(PythonLibs 3 REQUIRED)
endif()
endif()
set(WANT_TCL false CACHE BOOL "Support Tcl modules")
if(WANT_TCL)
find_package(TCL QUIET)
if(NOT TCL_FOUND)
message(FATAL_ERROR "Can't find Tcl")
endif()
endif()
# poll() is broken on Mac OS, it fails with POLLNVAL for pipe()s.
if(APPLE)
set(CSOCK_USE_POLL false)
else()
set(CSOCK_USE_POLL true)
endif()
check_cxx_symbol_exists(getopt_long "getopt.h" HAVE_GETOPT_LONG)
check_cxx_symbol_exists(lstat "sys/types.h;sys/stat.h;unistd.h" HAVE_LSTAT)
check_cxx_symbol_exists(getpassphrase "stdlib.h" HAVE_GETPASSPHRASE)
check_cxx_symbol_exists(tcsetattr "termios.h;unistd.h" HAVE_TCSETATTR)
check_cxx_symbol_exists(clock_gettime "time.h" HAVE_CLOCK_GETTIME)
# Note that old broken systems, such as OpenBSD, NetBSD, which don't support
# AI_ADDRCONFIG, also have thread-unsafe getaddrinfo(). Gladly, they fixed
# thread-safety before support of AI_ADDRCONFIG, so this can be abused to
# detect the thread-safe getaddrinfo().
#
# TODO: drop support of blocking DNS at some point. OpenBSD supports
# AI_ADDRCONFIG since Nov 2014, and their getaddrinfo() is thread-safe since
# Nov 2013. NetBSD's one is thread-safe since ages ago.
check_cxx_symbol_exists(AI_ADDRCONFIG "sys/types.h;sys/socket.h;netdb.h"
HAVE_THREADED_DNS)
if(CMAKE_BUILD_TYPE STREQUAL "Debug" AND NOT CYGWIN)
# These enable some debug options in g++'s STL, e.g. invalid use of
# iterators, but they cause crashes on cygwin while loading modules
set(_GLIBCXX_DEBUG true)
set(_GLIBCXX_DEBUG_PEDANTIC true)
endif()
if(append_git_version)
find_package(Git)
endif()
file(GLOB csocket_files LIST_DIRECTORIES FALSE
"${PROJECT_SOURCE_DIR}/third_party/Csocket/Csocket.*")
if(csocket_files STREQUAL "")
message(FATAL_ERROR " It looks like git submodules are not initialized.\n"
" Run: git submodule update --init --recursive")
endif()
install(DIRECTORY webskins
DESTINATION "${CMAKE_INSTALL_DATADIR}/znc")
install(DIRECTORY man/
DESTINATION "${CMAKE_INSTALL_MANDIR}/man1"
FILES_MATCHING PATTERN "znc*")
set(WANT_SYSTEMD false CACHE BOOL "Install znc.service to systemd")
if(WANT_SYSTEMD)
configure_file("znc.service.in" "znc.service")
set(SYSTEMD_DIR "" CACHE PATH "Path to systemd units")
if(SYSTEMD_DIR STREQUAL "" AND PKG_CONFIG_EXECUTABLE)
execute_process(COMMAND "${PKG_CONFIG_EXECUTABLE}"
--variable=systemdsystemunitdir systemd
OUTPUT_VARIABLE SYSTEMD_DIR)
endif()
if(SYSTEMD_DIR STREQUAL "")
message(FATAL_ERROR "Systemd is enabled, "
"but the unit dir can't be found.")
endif()
install(FILES "${PROJECT_BINARY_DIR}/znc.service"
DESTINATION "${SYSTEMD_DIR}")
endif()
# On cygwin, if to link modules against znc.exe directly, modperl can't call
# ZNC's functions very well. They do get called, but global variables have
# different addresses. That address actually is in modperl/ZNC.dll if to look
# at /proc/123/maps
# Example of such global variable is one returned by CZNC::Get()
# Modpython seems to work though with STATIC on cygwin... (I didn't test it
# too much though)
#
# Non-cygwin should link modules to /usr/bin/znc directly to prevent this:
# error while loading shared libraries: libznc.so: cannot open shared object file: No such file or directory
# Without need to touch LD_LIBRARY_PATH
if(CYGWIN)
set(znc_link "znclib")
set(lib_type "SHARED")
set(install_lib "znclib")
set(znclib_pc "-L${CMAKE_INSTALL_FULL_LIBDIR} -lznc")
else()
set(znc_link "znc")
set(lib_type "STATIC")
set(install_lib)
set(znclib_pc)
endif()
configure_file("include/znc/zncconfig.h.cmake.in" "include/znc/zncconfig.h")
add_subdirectory(include)
add_subdirectory(src)
add_subdirectory(modules)
add_subdirectory(test)
add_subdirectory(zz_msg)
add_custom_target(msg_after_all ALL
COMMAND "${CMAKE_COMMAND}" -E echo
COMMAND "${CMAKE_COMMAND}" -E echo " ZNC was successfully compiled."
COMMAND "${CMAKE_COMMAND}" -E echo
" Use 'make install' to install ZNC to '${CMAKE_INSTALL_PREFIX}'."
COMMAND "${CMAKE_COMMAND}" -E echo
VERBATIM)
add_dependencies(msg_after_all ${_all_targets})
# @echo ""
# @echo " ZNC was successfully compiled."
# @echo " Use '$(MAKE) install' to install ZNC to '$(prefix)'."
configure_file("ZNCConfig.cmake.in" "ZNCConfig.cmake" @ONLY)
include(CMakePackageConfigHelpers)
write_basic_package_version_file("ZNCConfigVersion.cmake"
COMPATIBILITY AnyNewerVersion)
install(FILES
"${PROJECT_BINARY_DIR}/ZNCConfig.cmake"
"${PROJECT_BINARY_DIR}/ZNCConfigVersion.cmake"
DESTINATION "${CMAKE_INSTALL_DATADIR}/znc/cmake")
configure_file("znc-buildmod.cmake.in" "znc-buildmod" @ONLY)
install(PROGRAMS "${PROJECT_BINARY_DIR}/znc-buildmod"
DESTINATION "${CMAKE_INSTALL_BINDIR}")
configure_file("znc.pc.cmake.in" "znc.pc" @ONLY)
install(FILES "${PROJECT_BINARY_DIR}/znc.pc"
DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
macro(summary_line text var)
if(${var})
list(APPEND summary_lines "${text} : yes")
else()
list(APPEND summary_lines "${text} : no")
endif()
endmacro()
set(summary_lines
"ZNC ${ZNC_VERSION}${alpha_version} configured"
" "
"Prefix : ${CMAKE_INSTALL_PREFIX}")
summary_line("SSL " "${OPENSSL_FOUND}")
summary_line("IPv6 " "${WANT_IPV6}")
summary_line("Async DNS" "${HAVE_THREADED_DNS}")
summary_line("Perl " "${PERLLIBS_FOUND}")
summary_line("Python " "${PYTHONLIBS_FOUND}")
summary_line("Tcl " "${TCL_FOUND}")
summary_line("Cyrus " "${CYRUS_FOUND}")
summary_line("Charset " "${ICU_FOUND}")
summary_line("Zlib " "${ZLIB_FOUND}")
include(render_framed_multiline)
render_framed_multiline("${summary_lines}")
message("")
message("Now you can run 'make' to compile ZNC")
message("")
# TODO
# ====
#
# readme: advice about cmake --system-information
# remove old configure.ac and Makefile.in
# consider mininum cmake version
+6 -4
View File
@@ -154,7 +154,7 @@ test/gmock-main.o: $(GMOCK_DIR)/src/gmock_main.cc Makefile
$(Q)$(CXX) $(CXXFLAGS) $(GTEST_FLAGS) -c -o $@ $< -MD -MF .depend/gmock-main.dep -MT $@
# Qt fails under TSAN, so CXXFLAGS/LDFLAGS can't be used.
test/Integration.o: test/Integration.cpp Makefile
test/Integration.o: test/integration/main.cpp Makefile
@mkdir -p .depend test
$(E) Building test object Integration...
$(Q)g++ $(qt_CFLAGS) $(GTEST_FLAGS) -c -o $@ $< -MD -MF .depend/Integration.test.dep -MT $@ '-DZNC_BIN_DIR="$(bindir)"' '-DZNC_SRC_DIR="$(realpath $(srcdir))"'
@@ -179,7 +179,10 @@ src/version.cpp: Makefile version.sh $(shell if [ x`cat .version_extra 2> /dev/n
$(E) Building source file version.cpp...
$(Q)WRITE_OUTPUT=yes $(srcdir)/version.sh "$(GIT)" > .version_extra 2> /dev/null
CLEAN += src/version.cpp src/Csocket.cpp include/znc/Csocket.h
CLEAN += src/version.cpp
endif
CLEAN += src/Csocket.cpp include/znc/Csocket.h
src/Csocket.cpp: third_party/Csocket/Csocket.cc
@rm -f $@
@@ -192,10 +195,9 @@ include/znc/Csocket.h: third_party/Csocket/Csocket.h
third_party/Csocket/Csocket.h third_party/Csocket/Csocket.cc:
@echo It looks like git submodules are not initialized. Run: git submodule update --init --recursive
@exit 1
endif
znc.service: znc.service.in
@sed -e "s:\@bindir\@:$(bindir):" $^ > $@
@sed -e "s:\@CMAKE_INSTALL_FULL_BINDIR\@:$(bindir):" $^ > $@
CLEAN += znc.service
+2
View File
@@ -14,6 +14,8 @@ ZNC includes modified code for SSL verification by Alban Diquet (https://github.
ZNC includes code from jQuery (http://jquery.com/), licensed under the MIT License.
ZNC includes code from jQuery UI (http://jqueryui.com/), licensed under the MIT License.
ZNC includes code from Selectize (http://brianreavis.github.io/selectize.js/), licensed under the Apache License 2.0.
ZNC includes modified code from CMakeFindFrameworks.cmake by Kitware, Inc., licensed under BSD License.
ZNC includes modified code from TestLargeFiles.cmake, licensed under Boost Software License, Version 1.0.
ZNC is developed by these people:
+29 -1
View File
@@ -26,7 +26,9 @@ Core:
* GNU make
* pkg-config
* GCC 4.7 or clang 3.2
* autoconf and automake (if building from git)
* Either of:
* autoconf and automake (but only if building from git, not from tarball)
* CMake
## Optional Requirements
@@ -53,6 +55,32 @@ Character Encodings:
## Installing ZNC
Currently there are 2 build systems in place: CMake and `./configure`.
`./configure` will eventually be removed.
There is also `configure.py` which should make migration to CMake easier:
it accepts the same parameters as `./configure`,
but calls CMake with CMake-style parameters.
### Installing with CMake
Installation from source code is performed using the CMake toolchain.
```shell
cmake .
make
make install
```
You can use `cmake-gui` or `ccmake` for more interactiveness.
Note for FreeBSD users:
By default base OpenSSL is selected.
If you want the one from ports, use `-DOPENSSL_ROOT_DIR=/usr/local`.
For troubleshooting, `cmake --system-information` will show you details.
### Installing with `./configure`
Installation from source code is performed using the `automake` toolchain.
If you are building from git, you will need to run `./autogen.sh` first to
produce the `configure` script.
+51
View File
@@ -0,0 +1,51 @@
#
# Copyright (C) 2004-2016 ZNC, see the NOTICE file for details.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
include("${CMAKE_CURRENT_LIST_DIR}/znc.cmake")
include(CMakeParseArguments)
# For some reason cygwin fails to build modules if Threads::Threads
# is not found.
if(NOT CYGWIN)
set(ZNC_NO_INCLUDE_THREADS true)
endif()
if(NOT ZNC_NO_INCLUDE_THREADS)
set(CMAKE_THREAD_PREFER_PTHREAD true)
set(THREADS_PREFER_PTHREAD_FLAG true)
find_package(Threads REQUIRED)
if(NOT CMAKE_USE_PTHREADS_INIT)
message(FATAL_ERROR "This compiler/OS doesn't seem "
"to support pthreads.")
endif()
endif()
function(znc_setup_module)
cmake_parse_arguments(znc_mod "" "TARGET;NAME" "" ${ARGN})
set_target_properties("${znc_mod_TARGET}" PROPERTIES
CXX_STANDARD 11
CXX_STANDARD_REQUIRED true
OUTPUT_NAME "${znc_mod_NAME}"
PREFIX ""
SUFFIX ".so"
NO_SONAME true
CXX_VISIBILITY_PRESET "hidden"
COMPILE_DEFINITIONS "znc_export_lib_EXPORTS")
set(znc_link "@znc_link@")
target_link_libraries("${znc_mod_TARGET}" PUBLIC "znc_internal_${znc_link}")
endfunction()
message(STATUS "Found ZNC @ZNC_VERSION@")
+40
View File
@@ -0,0 +1,40 @@
# Modification from upstream CMakeFindFrameworks.cmake from version 3.3.1:
# - add support of ${fwk}_FRAMEWORKS_ADDITIONAL input variable
#.rst:
# CMakeFindFrameworks
# -------------------
#
# helper module to find OSX frameworks
#=============================================================================
# Copyright 2003-2009 Kitware, Inc.
#
# Distributed under the OSI-approved BSD License (the "License");
# see accompanying file Copyright.txt for details.
#
# This software is distributed WITHOUT ANY WARRANTY; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the License for more information.
#=============================================================================
# (To distribute this file outside of CMake, substitute the full
# License text for the above reference.)
if(NOT CMAKE_FIND_FRAMEWORKS_INCLUDED)
set(CMAKE_FIND_FRAMEWORKS_INCLUDED 1)
macro(CMAKE_FIND_FRAMEWORKS fwk)
set(${fwk}_FRAMEWORKS)
if(APPLE)
foreach(dir
${${fwk}_FRAMEWORKS_ADDITIONAL}
~/Library/Frameworks/${fwk}.framework
/Library/Frameworks/${fwk}.framework
/System/Library/Frameworks/${fwk}.framework
/Network/Library/Frameworks/${fwk}.framework)
if(EXISTS ${dir})
set(${fwk}_FRAMEWORKS ${${fwk}_FRAMEWORKS} ${dir})
endif()
endforeach()
endif()
endmacro()
endif()
+94
View File
@@ -0,0 +1,94 @@
#
# Copyright (C) 2004-2016 ZNC, see the NOTICE file for details.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# perl 5.20 will fix this warning:
# https://rt.perl.org/Public/Bug/Display.html?id=120670
set(PERL_CFLAGS -Wno-reserved-user-defined-literal -Wno-literal-suffix
CACHE STRING "Perl compiler flags")
if(PerlLibs_FIND_VERSION_EXACT)
set(_PerlLibs_exact EXACT)
else()
set(_PerlLibs_exact)
endif()
find_package(Perl ${PerlLibs_FIND_VERSION} ${PerlLibs_exact} QUIET)
if(PERL_FOUND)
if(PERL_INCLUDE_DIR AND PERL_LIBRARIES)
else()
execute_process(
COMMAND "${PERL_EXECUTABLE}" -MExtUtils::Embed -e perl_inc
OUTPUT_VARIABLE _PerlLibs_inc_output
OUTPUT_STRIP_TRAILING_WHITESPACE)
string(REGEX REPLACE "^ *-I" "" _PerlLibs_include
"${_PerlLibs_inc_output}")
execute_process(
COMMAND "${PERL_EXECUTABLE}" -MExtUtils::Embed -e ldopts
OUTPUT_VARIABLE _PerlLibs_ld_output
OUTPUT_STRIP_TRAILING_WHITESPACE)
separate_arguments(_PerlLibs_ld_output)
set(_PerlLibs_ldflags)
set(_PerlLibs_libraries)
foreach(_PerlLibs_i ${_PerlLibs_ld_output})
if("${_PerlLibs_i}" MATCHES "^-l")
list(APPEND _PerlLibs_libraries "${_PerlLibs_i}")
else()
set(_PerlLibs_ldflags "${_PerlLibs_ldflags} ${_PerlLibs_i}")
endif()
endforeach()
get_filename_component(_PerlLibs_dir "${CMAKE_CURRENT_LIST_FILE}"
DIRECTORY)
try_compile(_PerlLibs_try
"${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/perl_check"
"${_PerlLibs_dir}/perl_check" perl_check
CMAKE_FLAGS
"-DPERL_INCLUDE_DIRS=${_PerlLibs_include}"
"-DPERL_LDFLAGS=${_PerlLibs_ldflags}"
"-DPERL_LIBRARIES=${_PerlLibs_libraries}"
"-DPERL_CFLAGS=${PERL_CFLAGS}"
OUTPUT_VARIABLE _PerlLibs_tryout)
if(_PerlLibs_try)
set(PERL_INCLUDE_DIR "${_PerlLibs_include}" CACHE PATH
"Perl include dir")
set(PERL_LDFLAGS "${_PerlLibs_ldflags}" CACHE STRING
"Perl linker flags")
set(PERL_LIBRARIES "${_PerlLibs_libraries}" CACHE STRING
"Perl libraries")
file(APPEND
"${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log"
"Output using Perl:\n${_PerlLibs_tryout}\n")
else()
set(_PerlLibs_failmsg FAIL_MESSAGE "Attempt to use Perl failed")
file(APPEND
"${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log"
"Error using Perl:\n${_PerlLibs_tryout}\n")
endif()
endif()
else()
set(_PerlLibs_failmsg FAIL_MESSAGE "Perl not found")
endif()
find_package_handle_standard_args(PerlLibs
REQUIRED_VARS PERL_INCLUDE_DIR PERL_LIBRARIES
VERSION_VAR PERL_VERSION_STRING
${_PerlLibs_failmsg})
set(PERL_INCLUDE_DIRS "${PERL_INCLUDE_DIR}")
mark_as_advanced(PERL_INCLUDE_DIR PERL_LDFLAGS PERL_LIBRARIES PERL_CFLAGS)
+39
View File
@@ -0,0 +1,39 @@
#
# Copyright (C) 2004-2016 ZNC, see the NOTICE file for details.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
if(NOT DEFINED cxx11check)
message(STATUS "Checking for C++11 support")
get_filename_component(_CXX11Check_dir "${CMAKE_CURRENT_LIST_FILE}"
DIRECTORY)
try_compile(cxx11_supported
"${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/cxx11check"
"${_CXX11Check_dir}/cxx11check" cxx11check
OUTPUT_VARIABLE _CXX11Check_tryout)
if(cxx11_supported)
message(STATUS "Checking for C++11 support - supported")
SET(cxx11check 1 CACHE INTERNAL "C++11 support")
file(APPEND
"${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log"
"Output of C++11 check:\n${_CXX11Check_tryout}\n")
else()
file(APPEND
"${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log"
"Error in C++11 check:\n${_CXX11Check_tryout}\n")
message(STATUS "Checking for C++11 support - not supported")
message(FATAL_ERROR " Upgrade your compiler.\n"
" GCC 4.7+ and Clang 3.2+ are known to work.")
endif()
endif()
+12
View File
@@ -0,0 +1,12 @@
// See TestLargeFiles.cmake for the origin of this file
#include <sys/types.h>
int main(int argc, char **argv)
{
/* Cause a compile-time error if off_t is smaller than 64 bits */
#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
int off_t_is_large[ (LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1 ];
return 0;
}
+26
View File
@@ -0,0 +1,26 @@
// See TestLargeFiles.cmake for the origin of this file
#cmakedefine _LARGEFILE_SOURCE
#cmakedefine _LARGEFILE64_SOURCE
#cmakedefine _LARGE_FILES
#cmakedefine _FILE_OFFSET_BITS ${_FILE_OFFSET_BITS}
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
/* Cause a compile-time error if off_t is smaller than 64 bits,
* and make sure we have ftello / fseeko.
*/
#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
int off_t_is_large[ (LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1 ];
FILE *fp = fopen(argv[0],"r");
off_t offset = ftello( fp );
fseeko( fp, offset, SEEK_CUR );
fclose(fp);
return 0;
}
+122
View File
@@ -0,0 +1,122 @@
# Downloaded from https://panthema.net/2012/1119-eSAIS-Inducing-Suffix-and-LCP-Arrays-in-External-Memory/eSAIS-DC3-LCP-0.5.4/stxxl/misc/cmake/TestLargeFiles.cmake.html
# That project's license is Boost Software License, Version 1.0.
# - Define macro to check large file support
#
# TEST_LARGE_FILES(VARIABLE)
#
# VARIABLE will be set to true if off_t is 64 bits, and fseeko/ftello present.
# This macro will also set defines necessary enable large file support, for instance
# _LARGE_FILES
# _LARGEFILE_SOURCE
# _FILE_OFFSET_BITS 64
# HAVE_FSEEKO
#
# However, it is YOUR job to make sure these defines are set in a cmakedefine so they
# end up in a config.h file that is included in your source if necessary!
set(_test_large_files_dir "${CMAKE_CURRENT_LIST_DIR}")
MACRO(TEST_LARGE_FILES VARIABLE)
IF(NOT DEFINED ${VARIABLE})
# On most platforms it is probably overkill to first test the flags for 64-bit off_t,
# and then separately fseeko. However, in the future we might have 128-bit filesystems
# (ZFS), so it might be dangerous to indiscriminately set e.g. _FILE_OFFSET_BITS=64.
MESSAGE(STATUS "Checking for 64-bit off_t")
# First check without any special flags
TRY_COMPILE(FILE64_OK "${PROJECT_BINARY_DIR}"
"${_test_large_files_dir}/TestFileOffsetBits.c")
if(FILE64_OK)
MESSAGE(STATUS "Checking for 64-bit off_t - present")
endif(FILE64_OK)
if(NOT FILE64_OK)
# Test with _FILE_OFFSET_BITS=64
TRY_COMPILE(FILE64_OK "${PROJECT_BINARY_DIR}"
"${_test_large_files_dir}/TestFileOffsetBits.c"
COMPILE_DEFINITIONS "-D_FILE_OFFSET_BITS=64" )
if(FILE64_OK)
MESSAGE(STATUS "Checking for 64-bit off_t - present with _FILE_OFFSET_BITS=64")
set(_FILE_OFFSET_BITS 64)
endif(FILE64_OK)
endif(NOT FILE64_OK)
if(NOT FILE64_OK)
# Test with _LARGE_FILES
TRY_COMPILE(FILE64_OK "${PROJECT_BINARY_DIR}"
"${_test_large_files_dir}/TestFileOffsetBits.c"
COMPILE_DEFINITIONS "-D_LARGE_FILES" )
if(FILE64_OK)
MESSAGE(STATUS "Checking for 64-bit off_t - present with _LARGE_FILES")
set(_LARGE_FILES 1)
endif(FILE64_OK)
endif(NOT FILE64_OK)
if(NOT FILE64_OK)
# Test with _LARGEFILE_SOURCE
TRY_COMPILE(FILE64_OK "${PROJECT_BINARY_DIR}"
"${_test_large_files_dir}/TestFileOffsetBits.c"
COMPILE_DEFINITIONS "-D_LARGEFILE_SOURCE" )
if(FILE64_OK)
MESSAGE(STATUS "Checking for 64-bit off_t - present with _LARGEFILE_SOURCE")
set(_LARGEFILE_SOURCE 1)
endif(FILE64_OK)
endif(NOT FILE64_OK)
if(NOT FILE64_OK)
# now check for Windows stuff
TRY_COMPILE(FILE64_OK "${PROJECT_BINARY_DIR}"
"${_test_large_files_dir}/TestWindowsFSeek.c")
if(FILE64_OK)
MESSAGE(STATUS "Checking for 64-bit off_t - present with _fseeki64")
set(HAVE__FSEEKI64 1)
endif(FILE64_OK)
endif(NOT FILE64_OK)
if(NOT FILE64_OK)
MESSAGE(STATUS "Checking for 64-bit off_t - not present")
else(NOT FILE64_OK)
# Set the flags we might have determined to be required above
configure_file("${_test_large_files_dir}/TestLargeFiles.c.cmakein"
"${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/TestLargeFiles.c")
MESSAGE(STATUS "Checking for fseeko/ftello")
# Test if ftello/fseeko are available
TRY_COMPILE(FSEEKO_COMPILE_OK "${PROJECT_BINARY_DIR}"
"${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/TestLargeFiles.c")
if(FSEEKO_COMPILE_OK)
MESSAGE(STATUS "Checking for fseeko/ftello - present")
endif(FSEEKO_COMPILE_OK)
if(NOT FSEEKO_COMPILE_OK)
# glibc 2.2 neds _LARGEFILE_SOURCE for fseeko (but not 64-bit off_t...)
TRY_COMPILE(FSEEKO_COMPILE_OK "${PROJECT_BINARY_DIR}"
"${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/TestLargeFiles.c"
COMPILE_DEFINITIONS "-D_LARGEFILE_SOURCE" )
if(FSEEKO_COMPILE_OK)
MESSAGE(STATUS "Checking for fseeko/ftello - present with _LARGEFILE_SOURCE")
set(_LARGEFILE_SOURCE 1)
endif(FSEEKO_COMPILE_OK)
endif(NOT FSEEKO_COMPILE_OK)
endif(NOT FILE64_OK)
if(FSEEKO_COMPILE_OK)
SET(${VARIABLE} 1 CACHE INTERNAL "Result of test for large file support" FORCE)
set(HAVE_FSEEKO 1)
else(FSEEKO_COMPILE_OK)
if (HAVE__FSEEKI64)
SET(${VARIABLE} 1 CACHE INTERNAL "Result of test for large file support" FORCE)
SET(HAVE__FSEEKI64 1 CACHE INTERNAL "Windows 64-bit fseek" FORCE)
else (HAVE__FSEEKI64)
MESSAGE(STATUS "Checking for fseeko/ftello - not found")
SET(${VARIABLE} 0 CACHE INTERNAL "Result of test for large file support" FORCE)
endif (HAVE__FSEEKI64)
endif(FSEEKO_COMPILE_OK)
ENDIF(NOT DEFINED ${VARIABLE})
ENDMACRO(TEST_LARGE_FILES VARIABLE)
+12
View File
@@ -0,0 +1,12 @@
// See TestLargeFiles.cmake for the origin of this file
#include <stdio.h>
int main()
{
__int64 off=0;
_fseeki64(NULL, off, SEEK_SET);
return 0;
}
+26
View File
@@ -0,0 +1,26 @@
#
# Copyright (C) 2004-2016 ZNC, see the NOTICE file for details.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
function(copy_csocket tgt source destination)
add_custom_command(OUTPUT "${destination}"
COMMAND "${CMAKE_COMMAND}"
-D "source=${source}"
-D "destination=${destination}"
-P "${PROJECT_SOURCE_DIR}/cmake/copy_csocket_cmd.cmake"
DEPENDS "${source}" "${PROJECT_SOURCE_DIR}/cmake/copy_csocket_cmd.cmake"
VERBATIM)
add_custom_target("${tgt}" DEPENDS "${destination}")
endfunction()
+20
View File
@@ -0,0 +1,20 @@
#
# Copyright (C) 2004-2016 ZNC, see the NOTICE file for details.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
file(READ "${source}" content)
string(REPLACE "#include \"defines.h\"" "#include <znc/defines.h>" content "${content}")
string(REPLACE "#include \"Csocket.h\"" "#include <znc/Csocket.h>" content "${content}")
file(WRITE "${destination}" "${content}")
+23
View File
@@ -0,0 +1,23 @@
#
# Copyright (C) 2004-2016 ZNC, see the NOTICE file for details.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
cmake_minimum_required(VERSION 3.0)
project(cxx11check)
set(CMAKE_VERBOSE_MAKEFILE true)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED true)
add_executable(main main.cpp)
+58
View File
@@ -0,0 +1,58 @@
// This file uses code from http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx_11.html (serial 5)
// Copyright (c) 2008 Benjamin Kosnik <bkoz@redhat.com>
// Copyright (c) 2012 Zack Weinberg <zackw@panix.com>
// Copyright (c) 2013 Roy Stogner <roystgnr@ices.utexas.edu>
// Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov <sokolov@google.com>
//
// Copying and distribution of this file, with or without modification, are
// permitted in any medium without royalty provided the copyright notice
// and this notice are preserved. This file is offered as-is, without any
// warranty.
template <typename T>
struct check {
static_assert(sizeof(int) <= sizeof(T), "not big enough");
};
struct Base {
virtual void f() {}
};
struct Child : public Base {
virtual void f() override {}
};
typedef check<check<bool>> right_angle_brackets;
int a;
decltype(a) b;
typedef check<int> check_type;
check_type c;
check_type&& cr = static_cast<check_type&&>(c);
auto d = a;
auto l = []() {};
// http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae
// Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function
// because of this
namespace test_template_alias_sfinae {
struct foo {};
template <typename T>
using member = typename T::member_type;
template <typename T>
void func(...) {}
template <typename T>
void func(member<T>*) {}
void test();
void test() { func<foo>(0); }
}
int main() { return 0; }
+76
View File
@@ -0,0 +1,76 @@
#
# Copyright (C) 2004-2016 ZNC, see the NOTICE file for details.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
if(nightly)
set(git_info "${nightly}")
elseif(append_git_version)
set(git ${gitcmd} "--git-dir=${srcdir}/.git")
execute_process(COMMAND ${git} describe --abbrev=0 HEAD
RESULT_VARIABLE git_result
ERROR_QUIET
OUTPUT_VARIABLE latest_tag)
string(STRIP "${latest_tag}" latest_tag)
if(git_result EQUAL 0)
execute_process(COMMAND ${git} rev-parse --short HEAD
OUTPUT_VARIABLE short_id)
string(STRIP "${short_id}" short_id)
if(latest_tag STREQUAL "")
# shallow clone
set(git_info "-git-${short_id}")
else()
# One character "x" per commit, remove newlines from output
execute_process(COMMAND ${git} log --format=tformat:x
"${latest_tag}..HEAD"
OUTPUT_VARIABLE commits_since)
string(REGEX REPLACE "[^x]" "" commits_since "${commits_since}")
string(LENGTH "${commits_since}" commits_since)
if(commits_since EQUAL 0)
# If this commit is tagged, don't print anything
# (the assumption here is: this is a release)
set(git_info "")
# However, this shouldn't happen, as for releases
# append_git_version should be set to false
else()
set(git_info "-git-${commits_since}-${short_id}")
endif()
endif()
execute_process(COMMAND ${gitcmd} status
--ignore-submodules=dirty
--porcelain
-- third_party/Csocket
WORKING_DIRECTORY "${srcdir}"
OUTPUT_VARIABLE franken)
string(STRIP "${franken}" franken)
if(NOT franken STREQUAL "")
message(WARNING " Csocket submodule looks outdated.\n"
" Run: git submodule update --init --recursive")
set(git_info "${git_info}-frankenznc")
endif()
else()
# Probably .git/ or git isn't found, or something
set(git_info "-git-unknown")
endif()
else()
set(git_info "")
endif()
configure_file("${srcfile}" "${destfile}")
+30
View File
@@ -0,0 +1,30 @@
#
# Copyright (C) 2004-2016 ZNC, see the NOTICE file for details.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
cmake_minimum_required(VERSION 3.0)
project(perl_check)
set(CMAKE_VERBOSE_MAKEFILE true)
if(APPLE)
set(CMAKE_SHARED_MODULE_CREATE_CXX_FLAGS
"${CMAKE_SHARED_MODULE_CREATE_CXX_FLAGS} -undefined dynamic_lookup")
endif()
add_library(main MODULE main.cpp)
target_include_directories(main PRIVATE ${PERL_INCLUDE_DIRS})
target_compile_options(main PRIVATE "${PERL_CFLAGS}")
target_link_libraries(main PRIVATE ${PERL_LIBRARIES})
set_target_properties(main PROPERTIES LINK_FLAGS "${PERL_LDFLAGS}")
+29
View File
@@ -0,0 +1,29 @@
/*
* Copyright (C) 2004-2016 ZNC, see the NOTICE file for details.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <EXTERN.h>
#include <perl.h>
#include <XSUB.h>
int perlcheck(int argc, char** argv, char** env) {
PERL_SYS_INIT3(&argc, &argv, &env);
PerlInterpreter* p = perl_alloc();
perl_construct(p);
perl_destruct(p);
perl_free(p);
PERL_SYS_TERM();
return 0;
}
+42
View File
@@ -0,0 +1,42 @@
#
# Copyright (C) 2004-2016 ZNC, see the NOTICE file for details.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
function(render_framed_multiline lines)
set(max_len 0)
foreach(l ${lines})
string(LENGTH "${l}" l_len)
if(l_len GREATER max_len)
set(max_len "${l_len}")
endif()
endforeach()
set(i 0)
set(header)
while(i LESS max_len)
set(header "${header}-")
math(EXPR i "${i} + 1")
endwhile()
message("+-${header}-+")
foreach(l ${lines})
string(LENGTH "${l}" l_len)
while(l_len LESS max_len)
set(l "${l} ")
math(EXPR l_len "${l_len} + 1")
endwhile()
message("| ${l} |")
endforeach()
message("+-${header}-+")
endfunction()
+63
View File
@@ -0,0 +1,63 @@
#
# Copyright (C) 2004-2016 ZNC, see the NOTICE file for details.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
if(NOT APPLE)
return()
endif()
include(FindPackageMessage)
find_program(brew brew)
if(brew)
find_package_message(brew "Homebrew found: ${brew}" "1;${brew}")
else()
find_package_message(brew "Homebrew not found" "0")
return()
endif()
execute_process(COMMAND "${brew}" --prefix icu4c
RESULT_VARIABLE brew_icu_f
OUTPUT_VARIABLE brew_icu OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET)
if(brew_icu_f EQUAL 0)
find_package_message(brew_icu "ICU via Homebrew: ${brew_icu}" "${brew_icu}")
set(ENV{PKG_CONFIG_PATH} "$ENV{PKG_CONFIG_PATH}:${brew_icu}/lib/pkgconfig")
endif()
execute_process(COMMAND "${brew}" --prefix openssl
RESULT_VARIABLE brew_ssl_f
OUTPUT_VARIABLE brew_ssl OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET)
if(brew_ssl_f EQUAL 0)
find_package_message(brew_ssl "OpenSSL via Homebrew: ${brew_ssl}"
"${brew_ssl}")
set(ENV{PKG_CONFIG_PATH} "$ENV{PKG_CONFIG_PATH}:${brew_ssl}/lib/pkgconfig")
endif()
execute_process(COMMAND "${brew}" --prefix python3
RESULT_VARIABLE brew_python_f
OUTPUT_VARIABLE brew_python OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET)
if(brew_python_f EQUAL 0)
find_package_message(brew_python "Python via Homebrew: ${brew_python}"
"${brew_python}")
list(APPEND Python_FRAMEWORKS_ADDITIONAL
"${brew_python}/Frameworks/Python.framework")
endif()
execute_process(COMMAND "${brew}" --prefix qt5
RESULT_VARIABLE brew_qt5_f
OUTPUT_VARIABLE brew_qt5 OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET)
if(brew_qt5_f EQUAL 0)
find_package_message(brew_qt5 "Qt5 via Homebrew: ${brew_qt5}"
"${brew_qt5}")
endif()
+2 -2
View File
@@ -511,12 +511,12 @@ if test "x$PERL" != xno -o "x$PYTHON" != xno; then
AC_MSG_ERROR([Could not found appropriate SWIG installation. Check config.log for details.])
fi
fi
if test -r "$srcdir/modules/modperl/ZNC.cpp" -a -r "$srcdir/modules/modpython/_znc_core.cpp"; then
if test -r "$srcdir/modules/modperl/generated.tar.gz" -a -r "$srcdir/modules/modpython/generated.tar.gz"; then
AC_MSG_NOTICE([modperl/modpython files are found, disabling SWIG])
USESWIG=no
fi
if test "x$USESWIG" = xno; then
if test ! -r "$srcdir/modules/modperl/ZNC.cpp" -o ! -r "$srcdir/modules/modpython/_znc_core.cpp"; then
if test ! -r "$srcdir/modules/modperl/generated.tar.gz" -o ! -r "$srcdir/modules/modpython/generated.tar.gz"; then
AC_MSG_ERROR([Can not build modperl/modpython. Either install SWIG, or build ZNC from a tarball, or disable modperl/modpython. Check config.log for details.])
else
AC_MSG_NOTICE([modperl/modpython files are found, no SWIG needed])
Executable
+128
View File
@@ -0,0 +1,128 @@
#!/usr/bin/env python3
#
# Copyright (C) 2004-2016 ZNC, see the NOTICE file for details.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
import argparse
import os
import subprocess
import sys
import re
extra_args = [os.path.dirname(sys.argv[0])]
parser = argparse.ArgumentParser()
def gnu_install_dir(name, cmake=None):
if cmake is None:
cmake = name.upper()
parser.add_argument('--' + name, action='append', metavar=cmake,
dest='cm_args',
type=lambda s: '-DCMAKE_INSTALL_{}={}'.format(cmake, s))
gnu_install_dir('prefix')
gnu_install_dir('bindir')
gnu_install_dir('sbindir')
gnu_install_dir('libexecdir')
gnu_install_dir('sysconfdir')
gnu_install_dir('sharedstatedir')
gnu_install_dir('localstatedir')
gnu_install_dir('libdir')
gnu_install_dir('includedir')
gnu_install_dir('oldincludedir')
gnu_install_dir('datarootdir')
gnu_install_dir('datadir')
gnu_install_dir('infodir')
gnu_install_dir('localedir')
gnu_install_dir('mandir')
gnu_install_dir('docdir')
group = parser.add_mutually_exclusive_group()
group.add_argument('--enable-debug', action='store_const', dest='build_type',
const='Debug', default='Release')
group.add_argument('--disable-debug', action='store_const', dest='build_type',
const='Release', default='Release')
def tristate(name, cmake=None):
if cmake is None:
cmake = name.upper()
group = parser.add_mutually_exclusive_group()
group.add_argument('--enable-' + name, action='append_const',
dest='cm_args', const='-DWANT_{}=YES'.format(cmake))
group.add_argument('--disable-' + name, action='append_const',
dest='cm_args', const='-DWANT_{}=NO'.format(cmake))
tristate('ipv6')
tristate('openssl')
tristate('zlib')
tristate('perl')
tristate('swig')
tristate('cyrus')
tristate('charset', 'ICU')
tristate('tcl')
class HandlePython(argparse.Action):
def __call__(self, parser, namespace, values, option_string=None):
extra_args.append('-DWANT_PYTHON=YES')
if values is not None:
x = re.search(r'\d.*', values)
if x:
extra_args.append('-DWANT_PYTHON_VERSION=' + x.group(0))
group = parser.add_mutually_exclusive_group()
group.add_argument('--enable-python', action=HandlePython, nargs='?',
metavar='PYTHON_VERSION')
group.add_argument('--disable-python', action='append_const', dest='cm_args',
const='-DWANT_PYTHON=NO')
parser.add_argument('--with-gtest', action='store', dest='gtest')
parser.add_argument('--with-gmock', action='store', dest='gmock')
class HandleSystemd(argparse.Action):
def __call__(self, parser, namespace, values, option_string=None):
extra_args.append('-DWANT_SYSTEMD=YES')
if values is not None:
extra_args.append('-DWANT_SYSTEMD_DIR=' + values)
parser.add_argument('--with-systemdsystemunitdir', action=HandleSystemd,
nargs='?', metavar='UNITDIR')
def env_type(s):
name, value = s.split('=', 1)
return (name, value)
parser.add_argument('env', nargs='*', type=env_type, metavar='ENV_VAR=VALUE')
args = parser.parse_args()
cm_args = args.cm_args or []
for env_key, env_value in args.env:
os.environ[env_key] = env_value
if args.gtest:
os.environ['GTEST_ROOT'] = args.gtest
if args.gmock:
os.environ['GMOCK_ROOT'] = args.gmock
if os.environ.get('CXX') is not None:
extra_args.append('-DCMAKE_CXX_COMPILER=' + os.environ['CXX'])
try:
os.remove('CMakeCache.txt')
except OSError:
pass
subprocess.check_call(['cmake', '-DCMAKE_BUILD_TYPE=' + args.build_type]
+ cm_args + extra_args)
+17
View File
@@ -0,0 +1,17 @@
#
# Copyright (C) 2004-2016 ZNC, see the NOTICE file for details.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
add_subdirectory(znc)
+34
View File
@@ -0,0 +1,34 @@
#
# Copyright (C) 2004-2016 ZNC, see the NOTICE file for details.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
copy_csocket(copy_csocket_h
"${PROJECT_SOURCE_DIR}/third_party/Csocket/Csocket.h"
"${CMAKE_CURRENT_BINARY_DIR}/Csocket.h")
# __attribute__((__visibility__("default")) macro comes from
# generate_export_header(), which wants a library.
# we don't really care which library is that.
# Macro defined by this generated header is used in Modules.h
# Name of this pseudolibrary matches the define passed to modules.
add_library(znc_export_lib SHARED IMPORTED)
include(GenerateExportHeader)
generate_export_header(znc_export_lib)
install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/" "${CMAKE_CURRENT_BINARY_DIR}/"
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/znc"
FILES_MATCHING
PATTERN "*.h"
PATTERN CMakeFiles EXCLUDE)
+19 -15
View File
@@ -50,24 +50,28 @@ class CModInfo;
#endif
#endif
#if HAVE_VISIBILITY
#define MODULE_EXPORT __attribute__((__visibility__("default")))
#ifdef BUILD_WITH_CMAKE
#include <znc/znc_export_lib_export.h>
#elif HAVE_VISIBILITY
#define ZNC_EXPORT_LIB_EXPORT __attribute__((__visibility__("default")))
#else
#define MODULE_EXPORT
#define ZNC_EXPORT_LIB_EXPORT
#endif
#define MODCOMMONDEFS(CLASS, DESCRIPTION, TYPE) \
extern "C" { \
MODULE_EXPORT bool ZNCModInfo(double dCoreVersion, CModInfo& Info); \
bool ZNCModInfo(double dCoreVersion, CModInfo& Info) { \
if (dCoreVersion != VERSION) return false; \
Info.SetDescription(DESCRIPTION); \
Info.SetDefaultType(TYPE); \
Info.AddType(TYPE); \
Info.SetLoader(TModLoad<CLASS>); \
TModInfo<CLASS>(Info); \
return true; \
} \
#define MODCOMMONDEFS(CLASS, DESCRIPTION, TYPE) \
extern "C" { \
ZNC_EXPORT_LIB_EXPORT bool ZNCModInfo(double dCoreVersion, \
CModInfo& Info); \
ZNC_EXPORT_LIB_EXPORT bool ZNCModInfo(double dCoreVersion, \
CModInfo& Info) { \
if (dCoreVersion != VERSION) return false; \
Info.SetDescription(DESCRIPTION); \
Info.SetDefaultType(TYPE); \
Info.AddType(TYPE); \
Info.SetLoader(TModLoad<CLASS>); \
TModInfo<CLASS>(Info); \
return true; \
} \
}
/** Instead of writing a constructor, you should call this macro. It accepts all
+4 -1
View File
@@ -1,13 +1,16 @@
#ifndef ZNC_VERSION_H
#define ZNC_VERSION_H
#ifndef BUILD_WITH_CMAKE
// The following defines are for #if comparison (preprocessor only likes ints)
#define VERSION_MAJOR 1
#define VERSION_MINOR 7
#define VERSION_PATCH -1
// This one is for display purpose
#define VERSION_STR "1.7.x"
// This one is for ZNCModInfo
#endif
// This one is for ZNCModInfo
#define VERSION (VERSION_MAJOR + VERSION_MINOR / 10.0)
// You can add -DVERSION_EXTRA="stuff" to your CXXFLAGS!
+53
View File
@@ -0,0 +1,53 @@
/*
* Copyright (C) 2004-2016 ZNC, see the NOTICE file for details.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef ZNCCONFIG_H
#define ZNCCONFIG_H
#define BUILD_WITH_CMAKE 1
#define VERSION_MAJOR @PROJECT_VERSION_MAJOR@
#define VERSION_MINOR @PROJECT_VERSION_MINOR@
#define VERSION_PATCH @PROJECT_VERSION_PATCH@
#define VERSION_STR "@PROJECT_VERSION@"
#cmakedefine _GLIBCXX_DEBUG 1
#cmakedefine _GLIBCXX_DEBUG_PEDANTIC 1
#define HAVE_PTHREAD 1
#cmakedefine HAVE_THREADED_DNS 1
#cmakedefine HAVE_LIBSSL 1
#cmakedefine HAVE_IPV6 1
#cmakedefine HAVE_ZLIB 1
#cmakedefine CSOCK_USE_POLL 1
#cmakedefine HAVE_GETOPT_LONG 1
#cmakedefine HAVE_LSTAT 1
#cmakedefine HAVE_TCSETATTR 1
#cmakedefine HAVE_GETPASSPHRASE 1
#cmakedefine HAVE_CLOCK_GETTIME 1
#cmakedefine HAVE_ICU 1
#define U_USING_ICU_NAMESPACE 1
#cmakedefine _LARGE_FILES 1
#cmakedefine _LARGEFILE_SOURCE 1
#cmakedefine _FILE_OFFSET_BITS @_FILE_OFFSET_BITS@
#define _MODDIR_ "@CMAKE_INSTALL_FULL_LIBDIR@/znc"
#define _DATADIR_ "@CMAKE_INSTALL_FULL_DATADIR@/znc"
#endif /* ZNCCONFIG_H */
+12 -9
View File
@@ -2,7 +2,8 @@
set -e
TMPDIR=`mktemp -d`
trap 'rm -rf $TMPDIR' EXIT
TMPDIR2=`mktemp -d`
trap 'rm -rf $TMPDIR $TMPDIR2' EXIT
if [ ! -f include/znc/main.h ] ; then
echo "Can't find source!"
@@ -39,23 +40,25 @@ TARGZ=`readlink -f -- $TARGZ`
echo "Exporting . to $TMPDIR/$ZNCDIR..."
git checkout-index --all --prefix=$TMPDIR/$ZNCDIR/
sed -e 's:#include "Csocket.h":#include <znc/Csocket.h>:' third_party/Csocket/Csocket.cc > $TMPDIR/$ZNCDIR/src/Csocket.cpp
sed -e 's:#include "defines.h":#include <znc/defines.h>:' third_party/Csocket/Csocket.h > $TMPDIR/$ZNCDIR/include/znc/Csocket.h
mkdir -p --mode=0755 $TMPDIR/$ZNCDIR/third_party/Csocket
cp -p third_party/Csocket/Csocket.cc third_party/Csocket/Csocket.h $TMPDIR/$ZNCDIR/third_party/Csocket/
(
cd $TMPDIR2
cmake $TMPDIR/$ZNCDIR -DWANT_PERL=yes -DWANT_PYTHON=yes
make modperl_dist modpython_dist
)
(
which swig3.0 && SWIG=`which swig3.0` || SWIG=`which swig`
cd $TMPDIR/$ZNCDIR
echo "Generating configure"
AUTOMAKE_FLAGS="--add-missing --copy" ./autogen.sh
rm -r autom4te.cache/
mkdir -p modules/.depend
make -C modules -f modperl/Makefile.gen srcdir=. SWIG=$SWIG PERL=`which perl`
make -C modules -f modpython/Makefile.gen srcdir=. SWIG=$SWIG PERL=`which perl`
rm -rf modules/.depend
rm .travis* .appveyor*
rm make-tarball.sh
sed -e "s/THIS_IS_NOT_TARBALL//" -i Makefile.in
echo '#include <znc/version.h>' > src/version.cpp
echo "const char* ZNC_VERSION_EXTRA = VERSION_EXTRA \"$DESC\";" >> src/version.cpp
if [ "x$DESC" != "x" ]; then
echo $DESC > .nightly
fi
)
(
cd $TMPDIR
+111
View File
@@ -0,0 +1,111 @@
#
# Copyright (C) 2004-2016 ZNC, see the NOTICE file for details.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# This is not recommended, but whatever.
file(GLOB all_modules LIST_DIRECTORIES FALSE "*")
function(add_cxx_module mod modpath)
znc_add_library("module_${mod}" MODULE "${modpath}")
set_target_properties("module_${mod}" PROPERTIES
OUTPUT_NAME "${mod}"
PREFIX ""
SUFFIX ".so"
NO_SONAME true
CXX_VISIBILITY_PRESET "hidden"
COMPILE_DEFINITIONS "znc_export_lib_EXPORTS")
if(moddef_${mod})
target_compile_definitions("module_${mod}" ${moddef_${mod}})
endif()
if(modcompile_${mod})
target_compile_options("module_${mod}" ${modcompile_${mod}})
endif()
if(modinclude_${mod})
target_include_directories("module_${mod}" ${modinclude_${mod}})
endif()
if(moddepend_${mod})
add_dependencies("module_${mod}" ${moddepend_${mod}})
endif()
target_link_libraries("module_${mod}" PRIVATE ${znc_link} ${modlink_${mod}})
set_target_properties("module_${mod}" PROPERTIES "" "" ${modprop_${mod}})
install(TARGETS "module_${mod}"
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}/znc")
endfunction()
function(add_perl_module mod modpath)
endfunction()
function(add_python_module mod modpath)
endfunction()
if(CYRUS_FOUND)
set(modcompile_cyrusauth PRIVATE ${CYRUS_CFLAGS})
set(modlink_cyrusauth ${CYRUS_LDFLAGS})
else()
set(moddisable_cyrusauth true)
endif()
if(PERLLIBS_FOUND)
add_subdirectory(modperl)
else()
set(moddisable_modperl true)
endif()
if(PYTHONLIBS_FOUND)
add_subdirectory(modpython)
else()
set(moddisable_modpython true)
endif()
if(TCL_FOUND)
add_subdirectory(modtcl)
else()
set(moddisable_modtcl true)
endif()
foreach(modpath ${all_modules})
string(REGEX MATCH "/([-a-zA-Z0-9_]+)\\.([a-z]+)$" unused "${modpath}")
set(mod "${CMAKE_MATCH_1}")
set(modtype "${CMAKE_MATCH_2}")
set(modenabled true)
if(moddisable_${mod})
set(modenabled false)
endif()
if(NOT OPENSSL_FOUND)
file(READ "${modpath}" modcontent)
string(FIND "${modcontent}" "REQUIRESSL" requiressl)
if(NOT requiressl EQUAL "-1")
set(modenabled false)
endif()
endif()
if(modenabled)
if(modtype STREQUAL "cpp")
add_cxx_module("${mod}" "${modpath}")
endif()
if(modtype STREQUAL "pm")
add_perl_module("${mod}" "${modpath}")
endif()
if(modtype STREQUAL "py")
add_python_module("${mod}" "${modpath}")
endif()
endif()
endforeach()
install(DIRECTORY data/
DESTINATION "${CMAKE_INSTALL_DATADIR}/znc/modules")
+107
View File
@@ -0,0 +1,107 @@
#
# Copyright (C) 2004-2016 ZNC, see the NOTICE file for details.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
set(modinclude_modperl PUBLIC ${PERL_INCLUDE_DIRS}
"${CMAKE_CURRENT_BINARY_DIR}/.." PARENT_SCOPE)
set(modcompile_modperl PUBLIC "${PERL_CFLAGS}" PARENT_SCOPE)
set(modlink_modperl PUBLIC ${PERL_LIBRARIES} PARENT_SCOPE)
set(modprop_modperl LINK_FLAGS "${PERL_LDFLAGS}" PARENT_SCOPE)
set(moddef_modperl PUBLIC "SWIG_TYPE_TABLE=znc" PARENT_SCOPE)
set(moddepend_modperl modperl_functions modperl_swigruntime PARENT_SCOPE)
if(APPLE)
set(CMAKE_SHARED_MODULE_CREATE_CXX_FLAGS
"${CMAKE_SHARED_MODULE_CREATE_CXX_FLAGS} -undefined dynamic_lookup")
endif()
if(SWIG_FOUND)
add_custom_command(
OUTPUT perlfunctions.cpp
COMMAND "${PERL_EXECUTABLE}"
"${CMAKE_CURRENT_SOURCE_DIR}/codegen.pl"
"${CMAKE_CURRENT_SOURCE_DIR}/functions.in"
"perlfunctions.cpp"
VERBATIM)
add_custom_command(
OUTPUT swigperlrun.h
COMMAND "${SWIG_EXECUTABLE}" -perl -c++ -shadow -external-runtime
"swigperlrun.h"
VERBATIM)
add_custom_command(
OUTPUT modperl_biglib.cpp ZNC.pm
COMMAND "${SWIG_EXECUTABLE}" -perl -c++ -shadow
"-I${PROJECT_BINARY_DIR}/include"
"-I${PROJECT_SOURCE_DIR}/include"
"-I${CMAKE_CURRENT_SOURCE_DIR}/.."
-DZNC_EXPORT_LIB_EXPORT
-outdir "${CMAKE_CURRENT_BINARY_DIR}"
-o "${CMAKE_CURRENT_BINARY_DIR}/modperl_biglib.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/modperl.i"
DEPENDS "modperl.i"
VERBATIM)
else()
add_custom_command(
OUTPUT swigperlrun.h ZNC.pm modperl_biglib.cpp perlfunctions.cpp
COMMAND "${CMAKE_COMMAND}" -E tar xz
"${CMAKE_CURRENT_SOURCE_DIR}/generated.tar.gz"
VERBATIM)
endif()
add_custom_target(modperl_functions DEPENDS "perlfunctions.cpp")
add_custom_target(modperl_swigruntime DEPENDS "swigperlrun.h")
execute_process(COMMAND "${PERL_EXECUTABLE}"
-MConfig "-eprint $Config::Config{dlext}"
OUTPUT_VARIABLE perl_ext)
znc_add_library(modperl_lib MODULE modperl_biglib.cpp)
target_include_directories(modperl_lib PRIVATE
"${PROJECT_BINARY_DIR}/include"
"${PROJECT_SOURCE_DIR}/include"
"${CMAKE_CURRENT_BINARY_DIR}/.."
"${CMAKE_CURRENT_SOURCE_DIR}/.."
${PERL_INCLUDE_DIRS})
target_link_libraries(modperl_lib ${znc_link})
set_target_properties(modperl_lib PROPERTIES
PREFIX ""
SUFFIX ".${perl_ext}"
OUTPUT_NAME "ZNC"
NO_SONAME true
LINK_FLAGS "${PERL_LDFLAGS}")
target_compile_options(modperl_lib PRIVATE "${PERL_CFLAGS}")
target_compile_definitions(modperl_lib PRIVATE "SWIG_TYPE_TABLE=znc")
if(CYGWIN)
target_link_libraries(modperl_lib module_modperl)
endif()
install(TARGETS modperl_lib
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}/znc/modperl")
install(FILES "startup.pl" "${CMAKE_CURRENT_BINARY_DIR}/ZNC.pm"
DESTINATION "${CMAKE_INSTALL_LIBDIR}/znc/modperl")
function(add_perl_module mod modpath)
install(FILES "${modpath}" DESTINATION "${CMAKE_INSTALL_LIBDIR}/znc")
endfunction()
# This target is used to generate tarball which doesn't depend on SWIG.
add_custom_target(modperl_dist
COMMAND "${CMAKE_COMMAND}" -E tar cz
"${CMAKE_CURRENT_SOURCE_DIR}/generated.tar.gz"
"swigperlrun.h" "ZNC.pm" "modperl_biglib.cpp" "perlfunctions.cpp"
DEPENDS swigperlrun.h ZNC.pm modperl_biglib.cpp perlfunctions.cpp
VERBATIM)
add_dependencies(modperl_dist copy_csocket_h)
+3 -3
View File
@@ -17,18 +17,18 @@ endif
.SECONDARY:
all: modperl/ZNC.cpp modperl/ZNC.pm modperl/perlfunctions.cpp modperl/swigperlrun.h
all: modperl/modperl_biglib.cpp modperl/ZNC.pm modperl/perlfunctions.cpp modperl/swigperlrun.h
modperl/swigperlrun.h:
@mkdir -p modperl
$(Q)$(SWIG) -perl5 -c++ -shadow -external-runtime $@
modperl/ZNC.cpp: modperl/modperl.i modperl/module.h modperl/CString.i
modperl/modperl_biglib.cpp: modperl/modperl.i modperl/module.h modperl/CString.i
$(E) Generating ZNC API for Perl...
@mkdir -p modperl .depend
$(Q)$(SWIG) -perl5 -c++ -shadow -outdir modperl -I$(srcdir) -I$(srcdir)/../include -I../include -MD -MF .depend/modperl.swig.dep -w362,315,401,402 -o $@ $<
modperl/ZNC.pm: modperl/ZNC.cpp
modperl/ZNC.pm: modperl/modperl_biglib.cpp
modperl/perlfunctions.cpp: modperl/codegen.pl modperl/functions.in
@mkdir -p modperl
+8 -2
View File
@@ -27,7 +27,7 @@ PERLHOOK := modperl_install
CLEAN += modperl/ZNC.$(PERLCEXT_EXT) modperl/ZNC.o modperl/gen
ifneq "$(SWIG)" ""
# Only delete these files if we can regenerate them
CLEAN += modperl/ZNC.pm modperl/swigperlrun.h modperl/ZNC.cpp modperl/perlfunctions.cpp
CLEAN += modperl/ZNC.pm modperl/swigperlrun.h modperl/modperl_biglib.cpp modperl/perlfunctions.cpp
endif
all: modperl_all
@@ -46,7 +46,7 @@ modperl/ZNC.$(PERLCEXT_EXT): modperl/ZNC.o Makefile modperl.so
$(E) Linking ZNC Perl bindings library...
$(Q)$(CXX) $(MODFLAGS) $(LDFLAGS) $(MODLINK) -o $@ $< $(PERL_LD) $(PERLDEPONMOD) $(LIBS)
modperl/ZNC.o: modperl/ZNC.cpp Makefile
modperl/ZNC.o: modperl/modperl_biglib.cpp Makefile
@mkdir -p modperl
@mkdir -p .depend
$(E) Building ZNC Perl bindings library...
@@ -54,6 +54,12 @@ modperl/ZNC.o: modperl/ZNC.cpp Makefile
ifneq "$(SWIG)" ""
include $(srcdir)/modperl/Makefile.gen
else
modperl/swigperlrun.h modperl/ZNC.pm modperl/perlfunctions.cpp: modperl/modperl_biglib.cpp
modperl/modperl_biglib.cpp: modperl/generated.tar.gz
@mkdir -p modperl
$(E) Unpacking ZNC Perl bindings...
$(Q)tar -xf $^ -C modperl
endif
modperl.o: modperl/perlfunctions.cpp modperl/swigperlrun.h
+3 -9
View File
@@ -22,10 +22,7 @@
#include <znc/Modules.h>
#if HAVE_VISIBILITY
#pragma GCC visibility push(default)
#endif
class CPerlModule : public CModule {
class ZNC_EXPORT_LIB_EXPORT CPerlModule : public CModule {
SV* m_perlObj;
VWebSubPages* _GetSubPages();
@@ -167,7 +164,7 @@ enum ELoadPerlMod {
Perl_LoadError,
};
class CPerlTimer : public CTimer {
class ZNC_EXPORT_LIB_EXPORT CPerlTimer : public CTimer {
SV* m_perlObj;
public:
@@ -190,7 +187,7 @@ inline CPerlTimer* CreatePerlTimer(CPerlModule* pModule, unsigned int uInterval,
perlObj);
}
class CPerlSocket : public CSocket {
class ZNC_EXPORT_LIB_EXPORT CPerlSocket : public CSocket {
SV* m_perlObj;
public:
@@ -241,6 +238,3 @@ inline int GetVersionMinor() { return VERSION_MINOR; }
inline double GetVersion() { return VERSION; }
inline CString GetVersionExtra() { return ZNC_VERSION_EXTRA; }
#if HAVE_VISIBILITY
#pragma GCC visibility pop
#endif
+97
View File
@@ -0,0 +1,97 @@
#
# Copyright (C) 2004-2016 ZNC, see the NOTICE file for details.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
set(modinclude_modpython PUBLIC ${PYTHON_INCLUDE_DIRS}
"${CMAKE_CURRENT_BINARY_DIR}/.." PARENT_SCOPE)
set(modlink_modpython PUBLIC ${PYTHON_LIBRARIES} PARENT_SCOPE)
set(moddef_modpython PUBLIC "SWIG_TYPE_TABLE=znc" PARENT_SCOPE)
set(moddepend_modpython modpython_functions modpython_swigruntime PARENT_SCOPE)
if(APPLE)
set(CMAKE_SHARED_MODULE_CREATE_CXX_FLAGS
"${CMAKE_SHARED_MODULE_CREATE_CXX_FLAGS} -undefined dynamic_lookup")
endif()
if(SWIG_FOUND)
add_custom_command(
OUTPUT "pyfunctions.cpp"
COMMAND "${PERL_EXECUTABLE}"
"${CMAKE_CURRENT_SOURCE_DIR}/codegen.pl"
"${CMAKE_CURRENT_SOURCE_DIR}/functions.in"
"pyfunctions.cpp")
add_custom_command(
OUTPUT "swigpyrun.h"
COMMAND "${SWIG_EXECUTABLE}" -python -py3 -c++ -shadow -external-runtime
"swigpyrun.h"
VERBATIM)
add_custom_command(
OUTPUT "modpython_biglib.cpp" "znc_core.py"
COMMAND "${SWIG_EXECUTABLE}" -python -py3 -c++ -shadow
"-I${PROJECT_BINARY_DIR}/include"
"-I${PROJECT_SOURCE_DIR}/include"
"-I${CMAKE_CURRENT_SOURCE_DIR}/.."
-DZNC_EXPORT_LIB_EXPORT
-outdir "${CMAKE_CURRENT_BINARY_DIR}"
-o "${CMAKE_CURRENT_BINARY_DIR}/modpython_biglib.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/modpython.i"
DEPENDS "modpython.i"
VERBATIM)
else()
add_custom_command(
OUTPUT swigpyrun.h znc_core.py modpython_biglib.cpp pyfunctions.cpp
COMMAND "${CMAKE_COMMAND}" -E tar xz
"${CMAKE_CURRENT_SOURCE_DIR}/generated.tar.gz"
VERBATIM)
endif()
add_custom_target(modpython_functions DEPENDS "pyfunctions.cpp")
add_custom_target(modpython_swigruntime DEPENDS "swigpyrun.h")
znc_add_library(modpython_lib MODULE modpython_biglib.cpp)
target_include_directories(modpython_lib PRIVATE
"${PROJECT_BINARY_DIR}/include"
"${PROJECT_SOURCE_DIR}/include"
"${CMAKE_CURRENT_BINARY_DIR}/.."
"${CMAKE_CURRENT_SOURCE_DIR}/.."
${PYTHON_INCLUDE_DIRS})
target_link_libraries(modpython_lib ${znc_link} ${PYTHON_LIBRARIES})
set_target_properties(modpython_lib PROPERTIES
PREFIX "_"
OUTPUT_NAME "znc_core"
NO_SONAME true)
target_compile_definitions(modpython_lib PRIVATE "SWIG_TYPE_TABLE=znc")
if(CYGWIN)
target_link_libraries(modpython_lib module_modpython)
endif()
install(TARGETS modpython_lib
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}/znc/modpython")
install(FILES "znc.py" "${CMAKE_CURRENT_BINARY_DIR}/znc_core.py"
DESTINATION "${CMAKE_INSTALL_LIBDIR}/znc/modpython")
function(add_python_module mod modpath)
install(FILES "${modpath}" DESTINATION "${CMAKE_INSTALL_LIBDIR}/znc")
endfunction()
# This target is used to generate tarball which doesn't depend on SWIG.
add_custom_target(modpython_dist
COMMAND "${CMAKE_COMMAND}" -E tar cz
"${CMAKE_CURRENT_SOURCE_DIR}/generated.tar.gz"
"swigpyrun.h" "znc_core.py" "modpython_biglib.cpp" "pyfunctions.cpp"
DEPENDS swigpyrun.h znc_core.py modpython_biglib.cpp pyfunctions.cpp
VERBATIM)
add_dependencies(modpython_dist copy_csocket_h)
+3 -3
View File
@@ -17,18 +17,18 @@ endif
.SECONDARY:
all: modpython/_znc_core.cpp modpython/znc_core.py modpython/pyfunctions.cpp modpython/swigpyrun.h
all: modpython/modpython_biglib.cpp modpython/znc_core.py modpython/pyfunctions.cpp modpython/swigpyrun.h
modpython/swigpyrun.h:
@mkdir -p modpython
$(Q)$(SWIG) -python -py3 -c++ -shadow -external-runtime $@
modpython/_znc_core.cpp: modpython/modpython.i modpython/module.h modpython/cstring.i
modpython/modpython_biglib.cpp: modpython/modpython.i modpython/module.h modpython/cstring.i
$(E) Generating ZNC API for python...
@mkdir -p modpython .depend
$(Q)$(SWIG) -python -py3 -c++ -shadow -outdir modpython -I$(srcdir) -I$(srcdir)/../include -I../include -MD -MF .depend/modpython.swig.dep -w362,315,401 -o $@ $<
modpython/znc_core.py: modpython/_znc_core.cpp
modpython/znc_core.py: modpython/modpython_biglib.cpp
modpython/pyfunctions.cpp: modpython/codegen.pl modpython/functions.in
@mkdir -p modpython
+8 -2
View File
@@ -23,7 +23,7 @@ CLEAN += modpython/_znc_core.$(PYCEXT_EXT)
CLEAN += modpython/_znc_core.o modpython/compiler.o
ifneq "$(SWIG)" ""
# Only delete these files if we can regenerate them
CLEAN += modpython/_znc_core.cpp modpython/znc_core.py
CLEAN += modpython/modpython_biglib.cpp modpython/znc_core.py
CLEAN += modpython/swigpyrun.h modpython/pyfunctions.cpp
endif
ifneq "$(srcdir)" "."
@@ -44,7 +44,7 @@ all: modpython_all
endif
modpython_all: modpython/_znc_core.$(PYCEXT_EXT)
modpython/_znc_core.o: modpython/_znc_core.cpp Makefile
modpython/_znc_core.o: modpython/modpython_biglib.cpp Makefile
@mkdir -p modpython
@mkdir -p .depend
$(E) Building ZNC python bindings library...
@@ -56,6 +56,12 @@ modpython/_znc_core.$(PYCEXT_EXT): modpython/_znc_core.o Makefile modpython.so
ifneq "$(SWIG)" ""
include $(srcdir)/modpython/Makefile.gen
else
modpython/swigpyrun.h modpython/znc_core.py modpython/pyfunctions.cpp: modpython/modpython_biglib.cpp
modpython/modpython_biglib.cpp: modpython/generated.tar.gz
@mkdir -p modpython
$(E) Unpacking ZNC python bindings...
$(Q)tar -xf $^ -C modpython
endif
modpython.o: modpython/pyfunctions.cpp modpython/swigpyrun.h
+3 -10
View File
@@ -27,10 +27,7 @@ class String {
class CModPython;
#if HAVE_VISIBILITY
#pragma GCC visibility push(default)
#endif
class CPyModule : public CModule {
class ZNC_EXPORT_LIB_EXPORT CPyModule : public CModule {
PyObject* m_pyObj;
CModPython* m_pModPython;
VWebSubPages* _GetSubPages();
@@ -216,7 +213,7 @@ inline CPyModule* CreatePyModule(CUser* pUser, CIRCNetwork* pNetwork,
pModPython);
}
class CPyTimer : public CTimer {
class ZNC_EXPORT_LIB_EXPORT CPyTimer : public CTimer {
PyObject* m_pyObj;
CModPython* m_pModPython;
@@ -246,7 +243,7 @@ inline CPyTimer* CreatePyTimer(CPyModule* pModule, unsigned int uInterval,
pyObj);
}
class CPySocket : public CSocket {
class ZNC_EXPORT_LIB_EXPORT CPySocket : public CSocket {
PyObject* m_pyObj;
CModPython* m_pModPython;
@@ -332,7 +329,3 @@ class CModulesIter {
CModules* m_pModules;
CModules::const_iterator m_it;
};
#if HAVE_VISIBILITY
#pragma GCC visibility pop
#endif
+18
View File
@@ -0,0 +1,18 @@
#
# Copyright (C) 2004-2016 ZNC, see the NOTICE file for details.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
set(modinclude_modtcl PRIVATE ${TCL_INCLUDE_PATH} PARENT_SCOPE)
set(modlink_modtcl PRIVATE ${TCL_LIBRARY} PARENT_SCOPE)
+100
View File
@@ -0,0 +1,100 @@
#
# Copyright (C) 2004-2016 ZNC, see the NOTICE file for details.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
znc_add_library(znclib ${lib_type} "ZNCString.cpp" "znc.cpp" "IRCNetwork.cpp"
"IRCSock.cpp" "Client.cpp" "Chan.cpp" "Nick.cpp" "Server.cpp"
"Modules.cpp" "MD5.cpp" "Buffer.cpp" "Utils.cpp" "FileUtils.cpp"
"HTTPSock.cpp" "Template.cpp" "ClientCommand.cpp" "Socket.cpp"
"SHA256.cpp" "WebModules.cpp" "Listener.cpp" "Config.cpp" "ZNCDebug.cpp"
"Threads.cpp" "Query.cpp" "SSLVerifyHost.cpp" "Message.cpp" "Csocket.cpp"
"versionc.cpp" "User.cpp")
znc_add_executable(znc "main.cpp")
target_link_libraries(znc PRIVATE znclib)
copy_csocket(copy_csocket_cc
"${PROJECT_SOURCE_DIR}/third_party/Csocket/Csocket.cc"
"${CMAKE_CURRENT_BINARY_DIR}/Csocket.cpp")
# make-tarball.sh can create this file, it'll contain -nightly-20151221-71eaf94
if(EXISTS "${PROJECT_SOURCE_DIR}/.nightly")
file(READ "${PROJECT_SOURCE_DIR}/.nightly" nightly)
string(STRIP "${nightly}" nightly)
else()
set(nightly "")
endif()
add_custom_target(version
COMMAND "${CMAKE_COMMAND}"
-D "nightly=${nightly}"
-D "alpha_version=${alpha_version}"
-D "append_git_version=${append_git_version}"
-D "gitcmd=${GIT_EXECUTABLE}"
-D "srcdir=${PROJECT_SOURCE_DIR}"
-D "srcfile=${CMAKE_CURRENT_SOURCE_DIR}/version.cpp.in"
-D "destfile=${CMAKE_CURRENT_BINARY_DIR}/versionc.cpp"
-P "${PROJECT_SOURCE_DIR}/cmake/gen_version.cmake"
# This is versionc to avoid possible conflict with version.cpp generated
# by make-tarball.sh
BYPRODUCTS "versionc.cpp"
WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}"
VERBATIM)
add_dependencies(znclib copy_csocket_h copy_csocket_cc version)
set(znc_include_dirs
"$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>"
"$<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include>"
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_FULL_INCLUDEDIR}>")
target_link_libraries(znclib ${CMAKE_DL_LIBS} Threads::Threads)
if(OPENSSL_FOUND)
target_link_libraries(znclib ${OPENSSL_LIBRARIES})
list(APPEND znc_include_dirs "${OPENSSL_INCLUDE_DIR}")
endif()
if(ZLIB_FOUND)
target_link_libraries(znclib ${ZLIB_LIBRARIES})
list(APPEND znc_include_dirs ${ZLIB_INCLUDE_DIRS})
endif()
if(ICU_FOUND)
target_link_libraries(znclib ${ICU_LDFLAGS})
list(APPEND znc_include_dirs ${ICU_INCLUDE_DIRS})
endif()
target_include_directories(znc PUBLIC ${znc_include_dirs})
target_include_directories(znclib PUBLIC ${znc_include_dirs})
set_target_properties(znclib ${znc_link} PROPERTIES
COMPILE_OPTIONS "-include;znc/zncconfig.h"
INTERFACE_COMPILE_OPTIONS "-include;znc/zncconfig.h"
POSITION_INDEPENDENT_CODE true
INTERFACE_POSITION_INDEPENDENT_CODE true
# This option is relevant only on non-cygwin
ENABLE_EXPORTS true)
# The following options are relevant only on cygwin
set_target_properties(znclib PROPERTIES
OUTPUT_NAME "znc"
SOVERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}")
install(TARGETS znc ${install_lib}
EXPORT znc
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
# this one is libznc.dll.a for cygwin
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}")
install(EXPORT znc
DESTINATION "${CMAKE_INSTALL_DATADIR}/znc/cmake"
NAMESPACE znc_internal_)
+18
View File
@@ -0,0 +1,18 @@
/*
* Copyright (C) 2004-2016 ZNC, see the NOTICE file for details.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <znc/version.h>
const char* ZNC_VERSION_EXTRA = VERSION_EXTRA "@alpha_version@" "@git_info@";
+6
View File
@@ -159,6 +159,12 @@ CString CZNC::GetCompileOptionsString() {
"yes"
#else
"no"
#endif
", build: "
#ifdef BUILD_WITH_CMAKE
"cmake"
#else
"autoconf"
#endif
;
}
+97
View File
@@ -0,0 +1,97 @@
#
# Copyright (C) 2004-2016 ZNC, see the NOTICE file for details.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# No CTest here, and no "make test" either:
# http://public.kitware.com/Bug/view.php?id=8438
# http://public.kitware.com/Bug/view.php?id=8774
include(ExternalProject)
include(FindPackageMessage)
# There is FindGTest.cmake, but it doesn't find gmock
#message(STATUS "Looking for GTest/GMock")
find_path(GTEST_ROOT src/gtest-all.cc
HINTS ENV GTEST_ROOT
PATHS "${PROJECT_SOURCE_DIR}/third_party/googletest/googletest")
find_path(GMOCK_ROOT src/gmock-all.cc
HINTS ENV GMOCK_ROOT
PATHS "${PROJECT_SOURCE_DIR}/third_party/googletest/googlemock")
set(gtest_error_msg "not found, testing will be disabled.")
set(gtest_error_msg "${gtest_error_msg} You can set environment variables")
set(gtest_error_msg "${gtest_error_msg} GTEST_ROOT and GMOCK_ROOT")
if(GTEST_ROOT)
find_package_message(gtest "Found GoogleTest: ${GTEST_ROOT}"
"${GTEST_ROOT}")
else()
find_package_message(gtest "GoogleTest ${gtest_error_msg}" "${GTEST_ROOT}")
return()
endif()
if(GMOCK_ROOT)
find_package_message(gmock "Found GoogleMock: ${GMOCK_ROOT}"
"${GMOCK_ROOT}")
else()
find_package_message(gmock "GoogleMock ${gtest_error_msg}" "${GMOCK_ROOT}")
return()
endif()
# Force the simple internal regex engine to get consistent behavior on all
# platforms. See
# https://code.google.com/p/chromium/issues/detail?id=317224 for more details.
set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS
"GTEST_HAS_POSIX_RE=0")
add_executable(unittest_bin EXCLUDE_FROM_ALL
"${GMOCK_ROOT}/src/gmock_main.cc"
"${GTEST_ROOT}/src/gtest-all.cc"
"${GMOCK_ROOT}/src/gmock-all.cc"
"ThreadTest.cpp" "NickTest.cpp" "ClientTest.cpp" "NetworkTest.cpp"
"MessageTest.cpp" "ModulesTest.cpp" "IRCSockTest.cpp" "QueryTest.cpp"
"StringTest.cpp" "ConfigTest.cpp" "BufferTest.cpp" "UtilsTest.cpp")
target_link_libraries(unittest_bin PRIVATE znclib)
target_include_directories(unittest_bin PRIVATE
"${GTEST_ROOT}" "${GTEST_ROOT}/include"
"${GMOCK_ROOT}" "${GMOCK_ROOT}/include")
add_custom_target(unittest COMMAND unittest_bin)
find_package(Qt5Network 5.4 QUIET HINTS ${brew_qt5})
if(Qt5Network_FOUND)
find_package_message(qt "Found Qt ${Qt5Network_VERSION}"
"1;${Qt5Network_VERSION}")
# Use different compiler flags, because Qt fails with sanitizers,
# and we don't need sanitizers to test the test itself anyway.
externalproject_add(inttest_bin
EXCLUDE_FROM_ALL true
BUILD_ALWAYS true
SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/integration"
BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/integration"
INSTALL_COMMAND ""
CMAKE_CACHE_ARGS
# Note the space in the end: protect from CXXFLAGS env var, but
# still support custom flags
"-DCMAKE_CXX_FLAGS:string=${INTEGRATION_TEST_CXX_FLAGS} "
"-DGTEST_ROOT:path=${GTEST_ROOT}"
"-DGMOCK_ROOT:path=${GMOCK_ROOT}"
"-DZNC_BIN_DIR:path=${CMAKE_INSTALL_FULL_BINDIR}"
"-DZNC_SRC_DIR:path=${PROJECT_SOURCE_DIR}"
"-DQt5_HINTS:path=${brew_qt5}")
add_custom_target(inttest COMMAND
"${CMAKE_CURRENT_BINARY_DIR}/integration/inttest")
add_dependencies(inttest inttest_bin)
else()
find_package_message(qt
"Qt >= 5.4 not found, integration testing will be disabled" "0")
endif()
+46
View File
@@ -0,0 +1,46 @@
#
# Copyright (C) 2004-2016 ZNC, see the NOTICE file for details.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
cmake_minimum_required(VERSION 3.0)
project(ZNCIntegrationTest)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED true)
set(CMAKE_THREAD_PREFER_PTHREAD true)
set(THREADS_PREFER_PTHREAD_FLAG true)
find_package(Threads REQUIRED)
find_package(Qt5Network 5.4 HINTS ${Qt5_HINTS})
# Force the simple internal regex engine to get consistent behavior on all
# platforms. See
# https://code.google.com/p/chromium/issues/detail?id=317224 for more details.
set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS
"GTEST_HAS_POSIX_RE=0")
add_executable(inttest "main.cpp"
"${GMOCK_ROOT}/src/gmock_main.cc"
"${GTEST_ROOT}/src/gtest-all.cc"
"${GMOCK_ROOT}/src/gmock-all.cc")
target_link_libraries(inttest Qt5::Network Threads::Threads)
target_include_directories(inttest PUBLIC
"${GTEST_ROOT}" "${GTEST_ROOT}/include"
"${GMOCK_ROOT}" "${GMOCK_ROOT}/include")
target_compile_definitions(inttest PRIVATE
"ZNC_BIN_DIR=\"${ZNC_BIN_DIR}\""
"ZNC_SRC_DIR=\"${ZNC_SRC_DIR}\"")
+78
View File
@@ -0,0 +1,78 @@
#!/usr/bin/env python3
#
# Copyright (C) 2004-2016 ZNC, see the NOTICE file for details.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
import argparse
import glob
import os
import shutil
import subprocess
import tempfile
parser = argparse.ArgumentParser(
description='Build external ZNC modules and place the results to '
'current directory. Several modules can be built at once.',
epilog='Adjustable environment variables: CXXFLAGS, LDFLAGS, LIBS')
parser.add_argument('-v', '--verbose', action='count', default=0,
help='use -vvv for more verbosity')
parser.add_argument('files', nargs='+', metavar='file.cpp',
help="path to the module's source file")
args = parser.parse_args()
with tempfile.TemporaryDirectory() as cmdir:
with open(os.path.join(cmdir, 'CMakeLists.txt'), 'w') as cm:
print('cmake_minimum_required(VERSION 3.0)', file=cm)
print('project(ExternalModules)', file=cm)
print('find_package(ZNC @ZNC_VERSION_MAJOR@.@ZNC_VERSION_MINOR@ PATHS '
'@CMAKE_INSTALL_FULL_DATADIR@/znc)', file=cm)
if args.verbose > 0:
print('set(CMAKE_VERBOSE_MAKEFILE true)', file=cm)
for mod_cpp in args.files:
mod, _ = os.path.splitext(os.path.basename(mod_cpp))
print(file=cm)
print('add_library(module_{} MODULE {})'.format(
mod, os.path.abspath(mod_cpp)), file=cm)
print('znc_setup_module(TARGET module_{} NAME {})'.format(mod, mod),
file=cm)
print('target_link_libraries(module_{} PRIVATE {})'.format(
mod, os.environ.get('LIBS', '')), file=cm)
if args.verbose > 0:
with open(os.path.join(cmdir, 'CMakeLists.txt')) as cm:
print(cm.read())
with tempfile.TemporaryDirectory() as build:
command = ['cmake', '-G@CMAKE_GENERATOR@',
'-DCMAKE_C_COMPILER=@CMAKE_C_COMPILER@',
'-DCMAKE_CXX_COMPILER=@CMAKE_CXX_COMPILER@',
'-DCMAKE_CXX_FLAGS={} @CMAKE_CXX_FLAGS@'.format(
os.environ.get('CXXFLAGS', '')),
'-DCMAKE_MODULE_LINKER_FLAGS={} @CMAKE_MODULE_LINKER_FLAGS@'.format(
os.environ.get('LDFLAGS', '')),
cmdir]
if args.verbose > 1:
cmd.append('--debug-output')
if args.verbose > 2:
cmd.append('--trace')
if args.verbose > 0:
print(command)
subprocess.check_call(command, cwd=build)
subprocess.check_call(['cmake', '--build', '.'], cwd=build)
for so in glob.iglob(os.path.join(build, '*.so')):
shutil.copy(so, os.getcwd())
+20
View File
@@ -0,0 +1,20 @@
# You can access these with e.g. pkg-config --variable=moddir znc
prefix=@CMAKE_INSTALL_PREFIX@
exec_prefix=${prefix}
datarootdir=${prefix}/@CMAKE_INSTALL_DATAROOTDIR@
bindir=${exec_prefix}/@CMAKE_INSTALL_BINDIR@
libdir=${prefix}/@CMAKE_INSTALL_LIBDIR@
datadir=${prefix}/@CMAKE_INSTALL_DATADIR@
includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@
cxx=@CMAKE_CXX_COMPILER@
version=@ZNC_VERSION@
moddir=${libdir}/znc
moddatadir=${datadir}/znc
Name: ZNC
Description: An advanced IRC proxy
Version: ${version}
URL: http://znc.in
Cflags: @CMAKE_CXX_FLAGS@ -I@CMAKE_INSTALL_FULL_INCLUDEDIR@ -include znc/zncconfig.h -Dznc_export_lib_EXPORTS
Libs: @znclib_pc@
+1 -1
View File
@@ -3,7 +3,7 @@ Description=ZNC, an advanced IRC bouncer
After=network.target
[Service]
ExecStart=@bindir@/znc -f
ExecStart=@CMAKE_INSTALL_FULL_BINDIR@/znc -f
User=znc
[Install]
+28
View File
@@ -0,0 +1,28 @@
#
# Copyright (C) 2004-2016 ZNC, see the NOTICE file for details.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# This is implementation detail of CMake, but this install() runs last.
# Details are at https://cmake.org/pipermail/cmake/2011-July/045615.html
install(CODE "message(\"
******************************************************************
ZNC was successfully installed.
You can use '${CMAKE_INSTALL_FULL_BINDIR}/znc --makeconf'
to generate a config file.
If you need help with using ZNC, please visit our wiki at:
http://znc.in\")")