Commit 09a2996a authored by Ghislain MARY's avatar Ghislain MARY

Simplify prepare.py by using the reworked prepare.py from cmake-builder.

parent 2f08f4df
...@@ -22,13 +22,11 @@ ...@@ -22,13 +22,11 @@
# #
############################################################################ ############################################################################
import argparse
import os import os
import platform import platform
import sys import sys
from logging import error, warning, info, INFO, basicConfig from logging import error, warning, info
from subprocess import Popen from subprocess import Popen
from distutils.spawn import find_executable
sys.dont_write_bytecode = True sys.dont_write_bytecode = True
sys.path.insert(0, 'submodules/cmake-builder') sys.path.insert(0, 'submodules/cmake-builder')
try: try:
...@@ -40,86 +38,142 @@ except Exception as e: ...@@ -40,86 +38,142 @@ except Exception as e:
exit(1) exit(1)
class DesktopTarget(prepare.Target): class DesktopTarget(prepare.Target):
def __init__(self, use_group="NO"): def __init__(self, group_builders=False):
prepare.Target.__init__(self, '') super(DesktopTarget, self).__init__('desktop')
current_path = os.path.dirname(os.path.realpath(__file__)) current_path = os.path.dirname(os.path.realpath(__file__))
if platform.system() == 'Windows':
current_path = current_path.replace('\\', '/')
self.config_file = 'configs/config-desktop.cmake' self.config_file = 'configs/config-desktop.cmake'
self.output = 'OUTPUT/' + self.name
if platform.system() == 'Windows': if platform.system() == 'Windows':
self.generator = 'Visual Studio 12 2013' self.generator = 'Visual Studio 12 2013'
self.additional_args = [ self.external_source_path = os.path.join(current_path, 'submodules')
'-DCMAKE_INSTALL_MESSAGE=LAZY',
'-DLINPHONE_BUILDER_EXTERNAL_SOURCE_PATH=' + current_path + '/submodules',
'-DLINPHONE_BUILDER_GROUP_EXTERNAL_SOURCE_PATH_BUILDERS=' + use_group
]
class PythonTarget(prepare.Target): class PythonTarget(prepare.Target):
def __init__(self): def __init__(self):
prepare.Target.__init__(self, '') super(PythonTarget, self).__init__('python')
current_path = os.path.dirname(os.path.realpath(__file__)) current_path = os.path.dirname(os.path.realpath(__file__))
if platform.system() == 'Windows':
current_path = current_path.replace('\\', '/')
self.config_file = 'configs/config-python.cmake' self.config_file = 'configs/config-python.cmake'
self.output = 'OUTPUT/' + self.name
if platform.system() == 'Windows': if platform.system() == 'Windows':
self.generator = 'Visual Studio 9 2008' self.generator = 'Visual Studio 9 2008'
self.additional_args = [ self.external_source_path = os.path.join(current_path, 'submodules')
'-DCMAKE_INSTALL_MESSAGE=LAZY',
'-DLINPHONE_BUILDER_EXTERNAL_SOURCE_PATH=' + current_path + '/submodules',
'-DLINPHONE_BUILDER_GROUP_EXTERNAL_SOURCE_PATH_BUILDERS=YES'
]
class PythonRaspberryTarget(prepare.Target): class PythonRaspberryTarget(prepare.Target):
def __init__(self): def __init__(self):
prepare.Target.__init__(self, '') super(PythonRaspberryTarget, self).__init__('python-raspberry')
current_path = os.path.dirname(os.path.realpath(__file__)) current_path = os.path.dirname(os.path.realpath(__file__))
self.required_build_platforms = ['Linux'] self.required_build_platforms = ['Linux']
self.config_file = 'configs/config-python-raspberry.cmake' self.config_file = 'configs/config-python-raspberry.cmake'
self.toolchain_file = 'toolchains/toolchain-raspberry.cmake' self.toolchain_file = 'toolchains/toolchain-raspberry.cmake'
self.additional_args = [ self.output = 'OUTPUT/' + self.name
'-DCMAKE_INSTALL_MESSAGE=LAZY', self.external_source_path = os.path.join(current_path, 'submodules')
'-DLINPHONE_BUILDER_EXTERNAL_SOURCE_PATH=' + current_path + '/submodules',
'-DLINPHONE_BUILDER_GROUP_EXTERNAL_SOURCE_PATH_BUILDERS=YES'
]
desktop_targets = {
'desktop': DesktopTarget(),
def check_is_installed(binary, prog='it', warn=True): 'python': PythonTarget(),
if not find_executable(binary): 'python-raspeberry': PythonRaspberryTarget()
if warn: }
error("Could not find {}. Please install {}.".format(binary, prog))
return False class DesktopPreparator(prepare.Preparator):
return True
def __init__(self, targets=desktop_targets, default_targets=['desktop']):
super(DesktopPreparator, self).__init__(targets, default_targets)
def check_tools(): self.veryclean = True
ret = 0 self.argparser.add_argument('-ac', '--all-codecs', help="Enable all codecs, including the non-free ones", action='store_true')
self.argparser.add_argument('-sys', '--use-system-dependencies', help="Find dependencies on the system.", action='store_true')
# at least FFmpeg requires no whitespace in sources path... self.argparser.add_argument('-p', '--package', help="Build an installation package (only on Mac OSX and Windows).", action='store_true')
if " " in os.path.dirname(os.path.realpath(__file__)):
error("Invalid location: path should not contain any spaces.") def parse_args(self):
ret = 1 super(DesktopPreparator, self).parse_args()
ret |= not check_is_installed('cmake') if self.args.use_system_dependencies:
self.additional_args += ["-DLINPHONE_BUILDER_USE_SYSTEM_DEPENDENCIES=YES"]
if self.args.all_codecs:
self.additional_args += ["-DENABLE_GPL_THIRD_PARTIES=YES"]
self.additional_args += ["-DENABLE_NON_FREE_CODECS=YES"]
self.additional_args += ["-DENABLE_AMRNB=YES"]
self.additional_args += ["-DENABLE_AMRWB=YES"]
self.additional_args += ["-DENABLE_G729=YES"]
self.additional_args += ["-DENABLE_GSM=YES"]
self.additional_args += ["-DENABLE_ILBC=YES"]
self.additional_args += ["-DENABLE_ISAC=YES"]
self.additional_args += ["-DENABLE_OPUS=YES"]
self.additional_args += ["-DENABLE_SILK=YES"]
self.additional_args += ["-DENABLE_SPEEX=YES"]
self.additional_args += ["-DENABLE_FFMPEG=YES"]
self.additional_args += ["-DENABLE_H263=YES"]
self.additional_args += ["-DENABLE_H263P=YES"]
self.additional_args += ["-DENABLE_MPEG4=YES"]
self.additional_args += ["-DENABLE_OPENH264=YES"]
self.additional_args += ["-DENABLE_VPX=YES"]
self.additional_args += ["-DENABLE_X264=NO"]
if self.args.package:
self.additional_args += ["-DENABLE_PACKAGING=YES"]
self.additional_args += ["-DCMAKE_SKIP_INSTALL_RPATH=YES"]
self.additional_args += ["-DENABLE_RELATIVE_PREFIX=YES"]
def clean(self):
super(DesktopPreparator, self).clean()
if os.path.isfile('Makefile'):
os.remove('Makefile')
if os.path.isdir('WORK') and not os.listdir('WORK'):
os.rmdir('WORK')
if os.path.isdir('OUTPUT') and not os.listdir('OUTPUT'):
os.rmdir('OUTPUT')
if not os.path.isdir("submodules/linphone/mediastreamer2/src") or not os.path.isdir("submodules/linphone/oRTP/src"): def prepare(self):
error("Missing some git submodules. Did you run:\n\tgit submodule update --init --recursive") retcode = super(DesktopPreparator, self).prepare()
ret = 1 if retcode != 0:
if retcode == 51:
if os.path.isfile('Makefile'):
Popen("make help-prepare-options".split(" "))
retcode = 0
return retcode
# Only generated makefile if we are using Ninja or Makefile
if self.generator().endswith('Ninja'):
if not check_is_installed("ninja", "it"):
return 1
self.generate_makefile('ninja -C')
info("You can now run 'make' to build.")
elif self.generator().endswith("Unix Makefiles"):
self.generate_makefile('$(MAKE) -C')
info("You can now run 'make' to build.")
elif self.generator() == "Xcode":
info("You can now open Xcode project with: open WORK/cmake/Project.xcodeproj")
else:
warning("Not generating meta-makefile for generator {}.".format(self.generator))
def generate_makefile(self, generator):
targets = self.args.target
targets_str = ""
for target in targets:
targets_str += """
{target}: {target}-build
{target}-build:
\t{generator} WORK/{target}/cmake
\t@echo "Done"
""".format(target=target, generator=generator)
makefile = """
targets={targets}
return ret .PHONY: all
all: build
def generate_makefile(generator): build: $(addsuffix -build, $(targets))
makefile = """
.PHONY: all
all: {targets_str}
\t{generator} WORK/cmake
pull-transifex: pull-transifex:
\t$(MAKE) -C linphone pull-transifex \t$(MAKE) -C linphone pull-transifex
...@@ -135,139 +189,21 @@ help: help-prepare-options ...@@ -135,139 +189,21 @@ help: help-prepare-options
\t@echo "" \t@echo ""
\t@echo "(please read the README.md file first)" \t@echo "(please read the README.md file first)"
\t@echo "" \t@echo ""
\t@echo "Available targets:" \t@echo "Available targets: {targets}"
\t@echo ""
\t@echo " * all, build : normal build"
\t@echo "" \t@echo ""
""".format(options=' '.join(sys.argv), generator=generator) """.format(targets=' '.join(targets), targets_str=targets_str, options=' '.join(sys.argv), generator=generator)
f = open('Makefile', 'w') f = open('Makefile', 'w')
f.write(makefile) f.write(makefile)
f.close() f.close()
def main(argv=None):
basicConfig(format="%(levelname)s: %(message)s", level=INFO)
if argv is None:
argv = sys.argv
argparser = argparse.ArgumentParser(
description="Prepare build of Linphone and its dependencies.")
argparser.add_argument(
'-ac', '--all-codecs', help="Enable all codecs, including the non-free ones", action='store_true')
argparser.add_argument(
'-c', '--clean', help="Clean a previous build instead of preparing a build.", action='store_true')
argparser.add_argument(
'-C', '--veryclean', help="Clean a previous build instead of preparing a build (also deleting the install prefix).",
action='store_true')
argparser.add_argument(
'-d', '--debug', help="Prepare a debug build, eg. add debug symbols and use no optimizations.", action='store_true')
argparser.add_argument(
'-f', '--force', help="Force preparation, even if working directory already exist.", action='store_true')
argparser.add_argument(
'-G', '--generator', help="CMake build system generator (default: let CMake choose, use cmake -h to get the complete list).",
default="Unix Makefiles", dest='generator')
argparser.add_argument(
'-L', '--list-cmake-variables', help="List non-advanced CMake cache variables.", action='store_true', dest='list_cmake_variables')
argparser.add_argument(
'-sys', '--use-system-dependencies', help="Find dependencies on the system.", action='store_true')
argparser.add_argument(
'-p', '--package', help="Build an installation package (only on Mac OSX and Windows).", action='store_true')
argparser.add_argument(
'--python', help="Build Python module instead of desktop application.", action='store_true')
argparser.add_argument(
'--python-raspberry', help="Build Python module for raspberry pi instead of desktop application.", action='store_true')
argparser.add_argument(
'-t', '--tunnel', help="Enable Tunnel.", action='store_true')
args, additional_args = argparser.parse_known_args()
if args.use_system_dependencies:
additional_args += ["-DLINPHONE_BUILDER_USE_SYSTEM_DEPENDENCIES=YES"]
if args.all_codecs:
additional_args += ["-DENABLE_GPL_THIRD_PARTIES=YES"]
additional_args += ["-DENABLE_NON_FREE_CODECS=YES"]
additional_args += ["-DENABLE_AMRNB=YES"]
additional_args += ["-DENABLE_AMRWB=YES"]
additional_args += ["-DENABLE_G729=YES"]
additional_args += ["-DENABLE_GSM=YES"]
additional_args += ["-DENABLE_ILBC=YES"]
additional_args += ["-DENABLE_ISAC=YES"]
additional_args += ["-DENABLE_OPUS=YES"]
additional_args += ["-DENABLE_SILK=YES"]
additional_args += ["-DENABLE_SPEEX=YES"]
additional_args += ["-DENABLE_FFMPEG=YES"]
additional_args += ["-DENABLE_H263=YES"]
additional_args += ["-DENABLE_H263P=YES"]
additional_args += ["-DENABLE_MPEG4=YES"]
additional_args += ["-DENABLE_OPENH264=YES"]
additional_args += ["-DENABLE_VPX=YES"]
additional_args += ["-DENABLE_X264=NO"]
if args.package:
additional_args += ["-DENABLE_PACKAGING=YES"]
additional_args += ["-DCMAKE_SKIP_INSTALL_RPATH=YES"]
additional_args += ["-DENABLE_RELATIVE_PREFIX=YES"]
if check_tools() != 0:
return 1
if args.tunnel or os.path.isdir("submodules/tunnel"):
if not os.path.isdir("submodules/tunnel"):
info("Tunnel wanted but not found yet, trying to clone it...")
p = Popen("git clone gitosis@git.linphone.org:tunnel.git submodules/tunnel".split(" "))
p.wait()
if p.returncode != 0:
error("Could not clone tunnel. Please see http://www.belledonne-communications.com/voiptunnel.html")
return 1
info("Tunnel enabled.")
additional_args += ["-DENABLE_TUNNEL=YES"]
# install_git_hook()
target = None
if args.python:
target = PythonTarget()
elif args.python_raspberry:
target = PythonRaspberryTarget()
else:
# for simple Makefile / ninja builds, we do not want to use grouped feature
# to ease development by having each project separated from each other
ungrouped_generators = [ "Unix Makefiles", "Ninja" ]
use_group = "YES" if args.package or not any(generator in args.generator for generator in ungrouped_generators) else "NO"
target = DesktopTarget(use_group=use_group)
target.generator = args.generator
if args.clean or args.veryclean:
if args.veryclean:
target.veryclean()
else:
target.clean()
if os.path.isfile('Makefile'):
os.remove('Makefile')
else:
retcode = prepare.run(target, args.debug, False, args.list_cmake_variables, args.force, additional_args)
if retcode != 0:
if retcode == 51:
Popen("make help-prepare-options".split(" "))
retcode = 0
return retcode
# only generated makefile if we are using Ninja or Makefile
if target.generator.endswith('Ninja'):
if not check_is_installed("ninja", "it"):
return 1
generate_makefile('ninja -C')
info("You can now run 'make' to build.")
elif target.generator.endswith("Unix Makefiles"):
generate_makefile('$(MAKE) -C')
info("You can now run 'make' to build.")
elif target.generator == "Xcode":
info("You can now open Xcode project with: open WORK/cmake/Project.xcodeproj")
else:
warning("Not generating meta-makefile for generator {}.".format(target.generator))
return 0 def main():
preparator = DesktopPreparator()
preparator.parse_args()
if preparator.check_tools() != 0:
return 1
return preparator.run()
if __name__ == "__main__": if __name__ == "__main__":
sys.exit(main()) sys.exit(main())
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