mirror of
https://github.com/SELinuxProject/setools
synced 2025-04-10 11:31:25 +00:00
The setup.py script attempts to locate the 'libsepol.so' library if the SEPOL environment variable is not set, but does not fail safely if the find fails. This commit adds error checking if the 'libsepol.so' is not located.
191 lines
7.4 KiB
Python
191 lines
7.4 KiB
Python
#!/usr/bin/env python
|
|
|
|
import glob
|
|
from setuptools import setup
|
|
import distutils.log as log
|
|
from distutils.core import Extension
|
|
from distutils.cmd import Command
|
|
from distutils.unixccompiler import UnixCCompiler
|
|
from setuptools.command.build_ext import build_ext
|
|
import subprocess
|
|
import sys
|
|
import os
|
|
from os.path import join
|
|
|
|
|
|
class QtHelpCommand(Command):
|
|
description = "Build Qt help files."
|
|
user_options = []
|
|
|
|
def initialize_options(self):
|
|
pass
|
|
|
|
def finalize_options(self):
|
|
pass
|
|
|
|
def run(self):
|
|
command = ['qcollectiongenerator', 'apol.qhcp', '-o', 'apol.qhc']
|
|
self.announce("Building Qt help files", level=log.INFO)
|
|
self.announce(' '.join(command), level=log.INFO)
|
|
pwd = os.getcwd()
|
|
os.chdir("./qhc")
|
|
subprocess.check_call(command)
|
|
os.chdir(pwd)
|
|
|
|
|
|
class YaccCommand(Command):
|
|
description = "Build yacc parsers."
|
|
user_options = []
|
|
|
|
def initialize_options(self):
|
|
pass
|
|
|
|
def finalize_options(self):
|
|
pass
|
|
|
|
def run(self):
|
|
command = ['bison', '-y', '-d', 'libqpol/policy_parse.y',
|
|
'-o', 'libqpol/policy_parse.c']
|
|
self.announce("Generating parser", level=log.INFO)
|
|
self.announce(' '.join(command), level=log.INFO)
|
|
subprocess.check_call(command)
|
|
|
|
|
|
class LexCommand(Command):
|
|
description = "Build lex scanners."
|
|
user_options = []
|
|
|
|
def initialize_options(self):
|
|
pass
|
|
|
|
def finalize_options(self):
|
|
pass
|
|
|
|
def run(self):
|
|
command = [
|
|
'flex', '-o', 'libqpol/policy_scan.c', 'libqpol/policy_scan.l']
|
|
self.announce("Generating scanner", level=log.INFO)
|
|
self.announce(' '.join(command), level=log.INFO)
|
|
subprocess.check_call(command)
|
|
|
|
|
|
class BuildExtCommand(build_ext):
|
|
|
|
def run(self):
|
|
self.run_command('build_yacc')
|
|
self.run_command('build_lex')
|
|
build_ext.run(self)
|
|
|
|
|
|
try:
|
|
static_sepol = os.environ['SEPOL']
|
|
except KeyError:
|
|
# try to find libsepol.a. The find_library_file function
|
|
# chooses dynamic libraries over static ones, so
|
|
# this assumes that the static lib is in the same directory
|
|
# as the dynamic lib.
|
|
dynamic_sepol = UnixCCompiler().find_library_file(['.', '/usr/lib64', '/usr/lib'], 'sepol')
|
|
|
|
if dynamic_sepol is None:
|
|
print('Unable to find a libsepol.so on your system!')
|
|
print('Please set the SEPOL environment variable. Exiting.')
|
|
exit(1)
|
|
|
|
static_sepol = dynamic_sepol.replace(".so", ".a")
|
|
|
|
if sys.platform.startswith('darwin'):
|
|
macros=[('DARWIN',1)]
|
|
else:
|
|
macros=[]
|
|
|
|
ext_py_mods = [Extension('setools.policyrep._qpol',
|
|
['setools/policyrep/qpol.i',
|
|
'libqpol/avrule_query.c',
|
|
'libqpol/bool_query.c',
|
|
'libqpol/bounds_query.c',
|
|
'libqpol/class_perm_query.c',
|
|
'libqpol/cond_query.c',
|
|
'libqpol/constraint_query.c',
|
|
'libqpol/context_query.c',
|
|
'libqpol/default_object_query.c',
|
|
'libqpol/expand.c',
|
|
'libqpol/fs_use_query.c',
|
|
'libqpol/ftrule_query.c',
|
|
'libqpol/genfscon_query.c',
|
|
'libqpol/isid_query.c',
|
|
'libqpol/iterator.c',
|
|
'libqpol/mls_query.c',
|
|
'libqpol/mlsrule_query.c',
|
|
'libqpol/module.c',
|
|
'libqpol/module_compiler.c',
|
|
'libqpol/netifcon_query.c',
|
|
'libqpol/nodecon_query.c',
|
|
'libqpol/permissive_query.c',
|
|
'libqpol/polcap_query.c',
|
|
'libqpol/policy.c',
|
|
'libqpol/policy_define.c',
|
|
'libqpol/policy_extend.c',
|
|
'libqpol/portcon_query.c',
|
|
'libqpol/queue.c',
|
|
'libqpol/rbacrule_query.c',
|
|
'libqpol/role_query.c',
|
|
'libqpol/syn_rule_query.c',
|
|
'libqpol/terule_query.c',
|
|
'libqpol/type_query.c',
|
|
'libqpol/user_query.c',
|
|
'libqpol/policy_parse.c',
|
|
'libqpol/policy_scan.c',
|
|
'libqpol/xen_query.c'],
|
|
include_dirs=['libqpol', 'libqpol/include'],
|
|
extra_compile_args=['-Werror', '-Wextra',
|
|
'-Waggregate-return',
|
|
'-Wcast-align',
|
|
'-Wfloat-equal',
|
|
'-Wformat', '-Wformat=2',
|
|
'-Winit-self', '-Winline',
|
|
'-Wmissing-format-attribute',
|
|
'-Wmissing-include-dirs',
|
|
'-Wnested-externs',
|
|
'-Wold-style-definition',
|
|
'-Wpointer-arith',
|
|
'-Wredundant-decls',
|
|
'-Wstrict-prototypes',
|
|
'-Wunknown-pragmas',
|
|
'-Wwrite-strings',
|
|
'-Wno-missing-field-initializers', # SWIG 3.0.2 generates partially-initialized structs
|
|
'-Wno-unused-parameter', # SWIG generates functions with unused parameters
|
|
'-Wno-cast-qual', # libsepol uses const-to-nonconst casts
|
|
'-Wno-shadow', # SWIG generates shadow variables
|
|
'-Wno-unreachable-code', # Bison generates unreachable code
|
|
'-fno-exceptions'],
|
|
swig_opts=['-Ilibqpol/include'],
|
|
define_macros=macros,
|
|
extra_objects=[static_sepol])]
|
|
|
|
setup(name='setools',
|
|
version='4.1-dev',
|
|
description='SELinux Policy tools.',
|
|
author='Tresys Technology, LLC',
|
|
author_email='setools@tresys.com',
|
|
url='https://github.com/TresysTechnology/setools',
|
|
cmdclass={'build_yacc': YaccCommand,
|
|
'build_lex': LexCommand,
|
|
'build_ext': BuildExtCommand,
|
|
'build_qhc': QtHelpCommand},
|
|
packages=['setools', 'setools.diff', 'setools.policyrep', 'setoolsgui', 'setoolsgui.apol'],
|
|
scripts=['apol', 'sediff', 'seinfo', 'seinfoflow', 'sesearch', 'sedta'],
|
|
data_files=[(join(sys.prefix, 'share/man/man1'), glob.glob("man/*.1") ),
|
|
(join(sys.prefix, 'share/setools'), glob.glob("data/*.ui") +
|
|
["data/perm_map", "qhc/apol.qhc"] )],
|
|
ext_modules=ext_py_mods,
|
|
test_suite='tests',
|
|
license='GPLv2+, LGPLv2.1+',
|
|
classifiers=[
|
|
'Environment :: Console',
|
|
'Environment :: X11 Applications :: Qt',
|
|
'Intended Audience :: Information Technology',
|
|
'Topic :: Security',
|
|
'Topic :: Utilities',
|
|
],
|
|
)
|