mirror of
https://github.com/libevent/libevent.git
synced 2025-01-31 09:12:55 +08:00
6349e94a0a
In ce8be2385b5fee16859a630fca0c98ad290c8e21 ("cmake: set rpath for libraries on linux") RPATH was first instroduced. Later in 6d09efe8686de824adf3d8810bbe0d5c386643e4 ("Set RPATH only if installation is done into non system directory") it was set only if it was installed to non system directory. But absolute RPATH not a good default, let's change this. Fixes: #920
207 lines
6.3 KiB
Python
207 lines
6.3 KiB
Python
#!/usr/bin/env python3
|
|
#
|
|
# Check if find_package(Libevent COMPONENTS xxx) can get the correct library.
|
|
# Note: this script has only been tested on python3.
|
|
# Usage:
|
|
# cd cmake-build-dir
|
|
# cmake <options> .. && cmake --build .
|
|
# python /path/to/test-export.py [static|shared]
|
|
|
|
import sys
|
|
import os
|
|
import shutil
|
|
import platform
|
|
import subprocess
|
|
import tempfile
|
|
|
|
results = ("success", "failure")
|
|
FNULL = open(os.devnull, 'wb')
|
|
script_dir = os.path.split(os.path.realpath(sys.argv[0]))[0]
|
|
# working_dir is cmake build dir
|
|
working_dir = os.getcwd()
|
|
if len(sys.argv) > 1 and sys.argv[1] == "static":
|
|
link_type = sys.argv[1]
|
|
else:
|
|
link_type = "shared"
|
|
|
|
|
|
def exec_cmd(cmd, silent):
|
|
if silent:
|
|
p = subprocess.Popen(cmd, stdout=FNULL, stderr=FNULL, shell=True)
|
|
else:
|
|
p = subprocess.Popen(cmd, shell=True)
|
|
p.communicate()
|
|
return p.poll()
|
|
|
|
|
|
def link_and_run(link, code):
|
|
"""Check if the source code matches the library component.
|
|
|
|
Compile source code relative to one component and link to another component.
|
|
Then run the generated executor.
|
|
|
|
Args:
|
|
link: The name of component that the source code will link with.
|
|
code: The source code related component name.
|
|
|
|
Returns:
|
|
Returns 0 if links and runs successfully, otherwise 1.
|
|
"""
|
|
exec_cmd("cmake --build . --target clean", True)
|
|
arch = ''
|
|
if platform.system() == "Windows":
|
|
arch = '-A x64'
|
|
cmd = 'cmake .. %s -DEVENT__LINK_COMPONENT=%s -DEVENT__CODE_COMPONENT=%s' % (
|
|
arch, link, code)
|
|
if link_type == "static":
|
|
cmd = "".join([cmd, " -DLIBEVENT_STATIC_LINK=1"])
|
|
r = exec_cmd(cmd, True)
|
|
if r == 0:
|
|
r = exec_cmd('cmake --build .', True)
|
|
if r == 0:
|
|
r = exec_cmd('ctest', True)
|
|
if r != 0:
|
|
r = 1
|
|
return r
|
|
|
|
# expect 0:success 1:failure
|
|
def testcase(link, code, expect):
|
|
r = link_and_run(link, code)
|
|
if link == "":
|
|
link = "all"
|
|
if code == "":
|
|
code = "all"
|
|
if r != expect:
|
|
print('[test-export] fail: link %s and run %s expects %s but gets %s.' %
|
|
(link, code, results[expect], results[r]))
|
|
sys.exit(1)
|
|
else:
|
|
print('[test-export] success: link %s and run %s expects and gets %s.' %
|
|
(link, code, results[r]))
|
|
|
|
# Dependency relationships between libevent libraries:
|
|
# core: none
|
|
# extra: core
|
|
# pthreads: core,pthread
|
|
# openssl: core,openssl
|
|
def test_group():
|
|
testcase("core", "core", 0)
|
|
testcase("extra", "extra", 0)
|
|
testcase("openssl", "openssl", 0)
|
|
testcase("mbedtls", "mbedtls", 0)
|
|
testcase("", "", 0)
|
|
testcase("extra", "core", 0)
|
|
testcase("openssl", "core", 0)
|
|
testcase("mbedtls", "core", 0)
|
|
testcase("core", "extra", 1)
|
|
testcase("core", "openssl", 1)
|
|
testcase("extra", "openssl", 1)
|
|
testcase("openssl", "extra", 1)
|
|
testcase("core", "mbedtls", 1)
|
|
testcase("extra", "mbedtls", 1)
|
|
testcase("mbedtls", "extra", 1)
|
|
if platform.system() != "Windows":
|
|
testcase("pthreads", "pthreads", 0)
|
|
testcase("pthreads", "core", 0)
|
|
testcase("core", "pthreads", 1)
|
|
testcase("extra", "pthreads", 1)
|
|
testcase("pthreads", "extra", 1)
|
|
testcase("pthreads", "openssl", 1)
|
|
testcase("openssl", "pthreads", 1)
|
|
testcase("pthreads", "mbedtls", 1)
|
|
testcase("mbedtls", "pthreads", 1)
|
|
|
|
|
|
def config_restore():
|
|
if os.path.isfile("tempconfig") and not os.path.isfile("LibeventConfig.cmake"):
|
|
os.rename("tempconfig", "LibeventConfig.cmake")
|
|
|
|
|
|
def config_backup():
|
|
if os.path.isfile("tempconfig"):
|
|
os.remove("tempconfig")
|
|
if os.path.isfile("LibeventConfig.cmake"):
|
|
os.rename("LibeventConfig.cmake", "tempconfig")
|
|
|
|
|
|
shutil.rmtree(os.path.join(script_dir, "build"), ignore_errors=True)
|
|
|
|
|
|
def run_test_group():
|
|
os.chdir(script_dir)
|
|
if not os.path.isdir("build"):
|
|
os.mkdir("build")
|
|
os.chdir("build")
|
|
test_group()
|
|
os.chdir(working_dir)
|
|
|
|
|
|
need_exportdll = False
|
|
if link_type == "shared" and platform.system() == "Windows":
|
|
need_exportdll = True
|
|
|
|
# On Windows, we need to add the directory containing the dll to the
|
|
# 'PATH' environment variable so that the program can call it.
|
|
def export_dll(dir):
|
|
if need_exportdll:
|
|
os.environ["PATH"] += os.pathsep + dir
|
|
|
|
|
|
def unexport_dll(dir):
|
|
if need_exportdll:
|
|
paths = os.environ["PATH"].split(os.pathsep)
|
|
paths = list(set(paths))
|
|
if dir in paths:
|
|
paths.remove(dir)
|
|
os.environ["PATH"] = os.pathsep.join(paths)
|
|
|
|
|
|
print("[test-export] use %s library" % link_type)
|
|
|
|
# Test for build tree.
|
|
print("[test-export] test for build tree")
|
|
dllpath = os.path.join(working_dir, "bin", "Debug")
|
|
config_restore()
|
|
os.environ["CMAKE_PREFIX_PATH"] = working_dir
|
|
export_dll(dllpath)
|
|
run_test_group()
|
|
del os.environ["CMAKE_PREFIX_PATH"]
|
|
unexport_dll(dllpath)
|
|
|
|
# Install libevent libraries to system path. Remove LibeventConfig.cmake
|
|
# from build directory to avoid confusion when using find_package().
|
|
print("[test-export] test for install tree(in system-wide path)")
|
|
if platform.system() == "Windows":
|
|
prefix = "C:\\Program Files\\libevent"
|
|
dllpath = os.path.join(prefix, "lib")
|
|
else:
|
|
prefix = "/usr/local"
|
|
exec_cmd('cmake -DCMAKE_SKIP_INSTALL_RPATH=OFF -DCMAKE_INSTALL_PREFIX="%s" ..' % prefix, True)
|
|
exec_cmd('cmake --build . --target install', True)
|
|
config_backup()
|
|
os.environ["CMAKE_PREFIX_PATH"] = os.path.join(prefix, "lib/cmake/libevent")
|
|
export_dll(dllpath)
|
|
run_test_group()
|
|
unexport_dll(dllpath)
|
|
del os.environ["CMAKE_PREFIX_PATH"]
|
|
|
|
# Uninstall the libraries installed in the above steps. Install the libraries
|
|
# into a temporary directory. Same as above, remove LibeventConfig.cmake from
|
|
# build directory to avoid confusion when using find_package().
|
|
print("[test-export] test for install tree(in non-system-wide path)")
|
|
exec_cmd("cmake --build . --target uninstall", True)
|
|
tempdir = tempfile.TemporaryDirectory()
|
|
cmd = 'cmake -DCMAKE_SKIP_INSTALL_RPATH=OFF -DCMAKE_INSTALL_PREFIX="%s" ..' % tempdir.name
|
|
exec_cmd(cmd, True)
|
|
exec_cmd("cmake --build . --target install", True)
|
|
config_backup()
|
|
os.environ["CMAKE_PREFIX_PATH"] = os.path.join(tempdir.name, "lib/cmake/libevent")
|
|
dllpath = os.path.join(tempdir.name, "lib")
|
|
export_dll(dllpath)
|
|
run_test_group()
|
|
unexport_dll(dllpath)
|
|
del os.environ["CMAKE_PREFIX_PATH"]
|
|
config_restore()
|
|
|
|
print("[test-export] all testcases have run successfully")
|