Commit 4182b51b by Victor M. Alvarez

Allow building yara-python with libyara statically linked

parent 3a9aaef3
README
setup.py
yara-python.c
/*
This a dummy file to satisfy some #include "config.h" directives while
building libyara.
*/
[metadata]
description-file = README.md
\ No newline at end of file
......@@ -14,27 +14,133 @@
# limitations under the License.
#
from distutils.command.build import build
from setuptools import setup, Extension
import distutils.errors
import distutils.ccompiler
import distutils.sysconfig
import contextlib
import os
import sys
from distutils.core import setup, Extension
import tempfile
import shutil
import subprocess
@contextlib.contextmanager
def muted(*streams):
"""A context manager to redirect stdout and/or stderr to /dev/null.
Examples:
with muted(sys.stdout):
...
with muted(sys.stderr):
...
with muted(sys.stdout, sys.stderr):
...
"""
devnull = open(os.devnull, 'w')
try:
old_streams = [os.dup(s.fileno()) for s in streams]
for s in streams:
os.dup2(devnull.fileno(), s.fileno())
yield
finally:
for o,n in zip(old_streams, streams):
os.dup2(o, n.fileno())
devnull.close()
def has_function(function_name, libraries=None):
compiler = distutils.ccompiler.new_compiler()
with muted(sys.stdout, sys.stderr):
result = compiler.has_function(
function_name, libraries=libraries)
return result
class BuildCommand(build):
user_options = build.user_options + [
('static','s','build libyara statically into yara-python module'),
('enable-cuckoo', None,'enable "cuckoo" module (use with --static)'),
('enable-magic', None,'enable "magic" module (use with --static)'),
('enable-profiling', None,'enable profiling features')]
args = sys.argv[1:]
macros = []
boolean_options = build.boolean_options + [
'static', 'enable-cuckoo', 'enable-magic', 'enable-profiling']
if '--with-profiling' in args:
macros.append(('PROFILING_ENABLED','1'))
args.remove('--with-profiling')
def initialize_options(self):
build.initialize_options(self)
self.static = None
self.enable_magic = None
self.enable_cuckoo = None
self.enable_profiling = None
setup(script_args=args,
name='yara-python',
version='3.4.0',
author='Victor M. Alvarez',
author_email='plusvic@gmail.com;vmalvarez@virustotal.com',
ext_modules=[Extension(
def finalize_options(self):
build.finalize_options(self)
if self.enable_magic and not self.static:
raise distutils.errors.DistutilsOptionError(
'--enable-magic must be used with --static')
if self.enable_cuckoo and not self.static:
raise distutils.errors.DistutilsOptionError(
'--enable-cuckoo must be used with --static')
def run(self):
sources = ['./yara-python.c']
exclusions = ['pe_utils.c']
libraries = ['yara']
include_dirs = []
macros = []
if has_function('memmem'):
macros.append(('HAVE_MEMMEM', '1'))
if has_function('strlcpy'):
macros.append(('HAVE_STRLCPY', '1'))
if has_function('strlcat'):
macros.append(('HAVE_STRLCAT', '1'))
if self.enable_profiling:
macros.append(('PROFILING_ENABLED', '1'))
if self.static:
libraries = []
include_dirs = ['yara/libyara/include', 'yara/libyara/', '.']
if self.enable_magic:
macros.append(('MAGIC', '1'))
else:
exclusions.append('magic.c')
if self.enable_cuckoo:
macros.append(('CUCKOO', '1'))
else:
exclusions.append('cuckoo.c')
for directory, _, files in os.walk('yara/libyara/'):
for x in files:
if x.endswith('.c') and x not in exclusions:
sources.append(os.path.join(directory, x))
self.distribution.ext_modules = [Extension(
name='yara',
sources=['yara-python.c'],
libraries=['yara'],
include_dirs=['../libyara/include'],
library_dirs=['../libyara/.libs'],
sources=sources,
include_dirs=include_dirs,
libraries=libraries,
define_macros=macros,
extra_compile_args=['-std=gnu99']
)])
extra_compile_args=['-std=gnu99', '-Wno-deprecated-declarations'])]
build.run(self)
setup(
name='yara-python',
version='3.4.1',
author='Victor M. Alvarez',
author_email='plusvic@gmail.com;vmalvarez@virustotal.com',
url='https://github.com/plusvic/yara-python',
cmdclass={'build': BuildCommand},
data_files=['./config.h'])
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment