lordgamez commented on code in PR #1681:
URL: https://github.com/apache/nifi-minifi-cpp/pull/1681#discussion_r1389526709
##########
bootstrap/cli.py:
##########
@@ -0,0 +1,141 @@
+import os
+
+import inquirer
+
+from minifi_option import MinifiOptions
+from system_dependency import install_required
+
+
+def install_dependencies(minifi_options: MinifiOptions):
+ install_required(minifi_options)
+
+
+def run_cmake(minifi_options: MinifiOptions):
+ if not os.path.exists(minifi_options.build_dir):
+ os.mkdir(minifi_options.build_dir)
+ os.chdir(minifi_options.build_dir)
+ cmake_cmd = f"cmake -G Ninja {minifi_options.create_cmake_options_str()}
{minifi_options.source_dir}"
+ print(f"Running {cmake_cmd}")
+ os.system(cmake_cmd)
+
+
+def do_build(minifi_options: MinifiOptions):
+ os.chdir(minifi_options.build_dir)
+ os.system("cmake --build .")
+
+
+def do_one_click_build(minifi_options: MinifiOptions) -> bool:
+ install_dependencies(minifi_options)
+ run_cmake(minifi_options)
+ do_build(minifi_options)
+ return True
+
+
+def modify_bool_options(minifi_options: MinifiOptions):
+ options = [inquirer.Checkbox(
+ "MiNiFi C++ options",
+ message="Select MiNiFi C++ components",
+ choices=[name for name, obj in minifi_options.bool_options.items()],
+ default=[name for name, obj in minifi_options.bool_options.items() if
obj.value == "ON"]
+ )]
+
+ selection_result = inquirer.prompt(options)
+ for minifi_option in minifi_options.bool_options.values():
+ if minifi_option.name in selection_result:
+ minifi_option.value = "ON"
+ else:
+ minifi_option.value = "OFF"
+
+
+def main_menu(minifi_options: MinifiOptions):
+ done = False
+ while not done:
+ main_menu_options = {
+ f"Build dir: {minifi_options.build_dir}": build_dir_menu,
+ f"Build type: {minifi_options.build_type.value}": build_type_menu,
+ "Build options": bool_menu,
+ "One click build": do_one_click_build,
Review Comment:
I would love to see a once click build without checking for dependencies,
just cmake + build :)
##########
bootstrap/system_dependency.py:
##########
@@ -0,0 +1,168 @@
+from __future__ import annotations
+
+import os
+import platform
+import sys
+from typing import Dict
+
+import distro
+
+from minifi_option import MinifiOptions
+
+
+def _query_yes_no(question: str, no_confirm: bool) -> bool:
Review Comment:
Could we change this to a `[Y/n]` functionality to have the default answer
yes when the Enter is pressed?
##########
README.md:
##########
@@ -304,8 +304,30 @@ sudo brew install libpcap
### Bootstrapping
-- MiNiFi C++ offers a bootstrap script in the root of our github repo that
will bootstrap the cmake and build process for you without the need to install
dependencies yourself. To use this
- process, please run the command `bootstrap.sh` from the root of the MiNiFi
C++ source tree.
+MiNiFi C++ offers bootstrap scripts that will bootstrap the cmake and build
process for you without the need to install dependencies yourself.
+
+#### Python based bootstrapping
+
+Set up a virtual environment in the bootstrap folder.
Review Comment:
A wrapper script would be useful that creates the venv and starts the
bootstrap without manually taking care of that
##########
bootstrap/system_dependency.py:
##########
@@ -0,0 +1,168 @@
+from __future__ import annotations
+
+import os
+import platform
+import sys
+from typing import Dict
+
+import distro
+
+from minifi_option import MinifiOptions
+
+
+def _query_yes_no(question: str, no_confirm: bool) -> bool:
+ valid = {"yes": True, "y": True, "ye": True, "no": False, "n": False}
+
+ if no_confirm:
+ return True
+ while True:
+ print("{} [y/n]".format(question))
+ choice = input().lower()
+ if choice in valid:
+ return valid[choice]
+ else:
+ print("Please respond with 'yes' or 'no' " "(or 'y' or 'n').")
+
+
+def _get_system_identifier():
+ platform_system = platform.system()
+ if platform_system == "Linux":
+ return distro.id()
+ return platform_system
+
+
+def _replace_wholewords(target: str, replace_dict: Dict[str]):
+ words = target.split()
+ output_string = ' '.join(replace_dict.get(word, word) for word in words)
+ return output_string
+
+
+def _run_command_with_confirm(command: str, no_confirm: bool) -> bool:
+ if _query_yes_no("Running {}".format(command), no_confirm):
+ return os.system(command) == 0
+
+
+def _install_with_brew(dependencies_str: str, no_confirm: bool):
+ replace_dict = {"patch": "",
+ "jni": "maven"}
+ command = "brew install {}".format(
+ _replace_wholewords(dependencies_str, replace_dict))
+ assert _run_command_with_confirm(command, no_confirm)
+
+
+def _install_with_apt(dependencies_str: str, no_confirm: bool):
+ replace_dict = {"libarchive": "liblzma-dev",
+ "lua": "liblua5.1-0-dev",
+ "python": "libpython3-dev",
+ "libusb": "libusb-1.0-0-dev libusb-dev",
+ "libpng": "libpng-dev",
+ "libpcap": "libpcap-dev",
+ "jni": "openjdk-8-jdk openjdk-8-source maven"}
+
+ command = "sudo apt install -y {}".format(
+ _replace_wholewords(dependencies_str, replace_dict))
+ assert _run_command_with_confirm(command, no_confirm)
Review Comment:
I think it's a bit drastic to assert on this call, if we are in the menus
and decide not to run the suggested update, we should return to the previous,
or root menu instead of crashing.
##########
bootstrap/cli.py:
##########
@@ -0,0 +1,141 @@
+import os
+
+import inquirer
+
+from minifi_option import MinifiOptions
+from system_dependency import install_required
+
+
+def install_dependencies(minifi_options: MinifiOptions):
+ install_required(minifi_options)
+
+
+def run_cmake(minifi_options: MinifiOptions):
+ if not os.path.exists(minifi_options.build_dir):
+ os.mkdir(minifi_options.build_dir)
+ os.chdir(minifi_options.build_dir)
+ cmake_cmd = f"cmake -G Ninja {minifi_options.create_cmake_options_str()}
{minifi_options.source_dir}"
+ print(f"Running {cmake_cmd}")
+ os.system(cmake_cmd)
+
+
+def do_build(minifi_options: MinifiOptions):
+ os.chdir(minifi_options.build_dir)
+ os.system("cmake --build .")
+
+
+def do_one_click_build(minifi_options: MinifiOptions) -> bool:
+ install_dependencies(minifi_options)
+ run_cmake(minifi_options)
+ do_build(minifi_options)
+ return True
+
+
+def modify_bool_options(minifi_options: MinifiOptions):
+ options = [inquirer.Checkbox(
+ "MiNiFi C++ options",
+ message="Select MiNiFi C++ components",
+ choices=[name for name, obj in minifi_options.bool_options.items()],
+ default=[name for name, obj in minifi_options.bool_options.items() if
obj.value == "ON"]
+ )]
+
+ selection_result = inquirer.prompt(options)
+ for minifi_option in minifi_options.bool_options.values():
+ if minifi_option.name in selection_result:
+ minifi_option.value = "ON"
+ else:
+ minifi_option.value = "OFF"
+
+
+def main_menu(minifi_options: MinifiOptions):
+ done = False
+ while not done:
+ main_menu_options = {
+ f"Build dir: {minifi_options.build_dir}": build_dir_menu,
+ f"Build type: {minifi_options.build_type.value}": build_type_menu,
+ "Build options": bool_menu,
+ "One click build": do_one_click_build,
+ "Step by step build": step_by_step_menu,
+ "Exit": lambda options: True,
+ }
+
+ questions = [
+ inquirer.List(
+ "sub_menu",
+ message="Main Menu",
+ choices=[menu_option_name for menu_option_name in
main_menu_options],
+ ),
+ ]
+
+ main_menu_prompt = inquirer.prompt(questions)
+ done = main_menu_options[main_menu_prompt["sub_menu"]](minifi_options)
+
+
+def build_type_menu(minifi_options: MinifiOptions) -> bool:
+ questions = [
+ inquirer.List(
+ "build_type",
+ message="Build type",
+ choices=minifi_options.build_type.possible_values,
+ ),
+ ]
+
+ answers = inquirer.prompt(questions)
+ minifi_options.build_type.value = answers["build_type"]
+ return False
+
+
+def build_dir_menu(minifi_options: MinifiOptions) -> bool:
+ questions = [
+ inquirer.Path('build_dir',
+ message="Build directory",
+ default=minifi_options.build_dir
+ ),
+ ]
+ minifi_options.build_dir = inquirer.prompt(questions)["build_dir"]
+ return False
+
+
+def bool_menu(minifi_options: MinifiOptions) -> bool:
Review Comment:
Would it be possible to save the selected options in a bt_state file just
like in the bootstrap.sh?
##########
bootstrap/cli.py:
##########
@@ -0,0 +1,141 @@
+import os
+
+import inquirer
+
+from minifi_option import MinifiOptions
+from system_dependency import install_required
+
+
+def install_dependencies(minifi_options: MinifiOptions):
+ install_required(minifi_options)
+
+
+def run_cmake(minifi_options: MinifiOptions):
+ if not os.path.exists(minifi_options.build_dir):
+ os.mkdir(minifi_options.build_dir)
+ os.chdir(minifi_options.build_dir)
+ cmake_cmd = f"cmake -G Ninja {minifi_options.create_cmake_options_str()}
{minifi_options.source_dir}"
+ print(f"Running {cmake_cmd}")
+ os.system(cmake_cmd)
+
+
+def do_build(minifi_options: MinifiOptions):
+ os.chdir(minifi_options.build_dir)
+ os.system("cmake --build .")
+
+
+def do_one_click_build(minifi_options: MinifiOptions) -> bool:
+ install_dependencies(minifi_options)
+ run_cmake(minifi_options)
+ do_build(minifi_options)
+ return True
+
+
+def modify_bool_options(minifi_options: MinifiOptions):
+ options = [inquirer.Checkbox(
+ "MiNiFi C++ options",
+ message="Select MiNiFi C++ components",
+ choices=[name for name, obj in minifi_options.bool_options.items()],
+ default=[name for name, obj in minifi_options.bool_options.items() if
obj.value == "ON"]
+ )]
+
+ selection_result = inquirer.prompt(options)
+ for minifi_option in minifi_options.bool_options.values():
+ if minifi_option.name in selection_result:
+ minifi_option.value = "ON"
+ else:
+ minifi_option.value = "OFF"
+
+
+def main_menu(minifi_options: MinifiOptions):
+ done = False
+ while not done:
+ main_menu_options = {
+ f"Build dir: {minifi_options.build_dir}": build_dir_menu,
+ f"Build type: {minifi_options.build_type.value}": build_type_menu,
+ "Build options": bool_menu,
Review Comment:
This could be renamed to something like "MiNiFi Library Options" for
extensions and library usage and have a separate "Build Options" for using
ninja/msbuild/make, werror, sanitizers and other build options (I suppose that
will be part 2).
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]