build: add build script

Change-Id: I0f9528aafd0483e6c8c55053071acafedae778e6
diff --git a/BUILD.md b/BUILD.md
new file mode 100644
index 0000000..1802bef
--- /dev/null
+++ b/BUILD.md
@@ -0,0 +1,56 @@
+# Building DHTNet
+
+This document provides instructions on how to build DHTNet from source code. Ensure that you have met all the dependencies before proceeding with the build.
+
+## Dependencies
+
+DHTNet depends on the following libraries:
+
+- **OpenDHT** 2.6, used to launch DHT nodes.
+- **[pjproject](https://github.com/savoirfairelinux/pjproject)**, used for ICE negotiation.
+- **msgpack-c** 1.2+, used for data serialization.
+- **GnuTLS** 3.3+, used for cryptographic operations.
+- **Nettle** 2.4+, a GnuTLS dependency for crypto.
+- **{fmt}** 9.0+, for log formatting.
+
+## Building Instructions
+
+Follow these steps to build DHTNet:
+
+### 1. Clone the DHTNet Repository
+
+Clone the DHTNet repository to your local machine:
+
+```bash
+git clone https://github.com/savoirfairelinux/dhtnet.git
+cd dhtnet
+```
+
+### 2. Update dependencies:
+
+Ensure that you have the latest versions of the required Git submodules, pjproject, and OpenDHT. Run the following command:
+
+   ```bash
+   git submodule update --init --recursive
+   ```
+This step ensures that your project has the most up-to-date dependencies for the build process.
+
+### 3. Install dependencies:
+
+Create a build directory and use CMake to configure the build:
+
+```bash
+cd dependencies && ./build.py && cd ..
+mkdir build
+cd build
+cmake ..
+```
+Finally, initiate the build process:
+
+```bash
+make
+```
+
+## Contributing
+
+If you encounter issues or wish to contribute to DHTNet's development, please visit the [GitHub repository](https://github.com/savoirfairelinux/dhtnet) for more details on how to get involved.
\ No newline at end of file
diff --git a/dependencies/build.py b/dependencies/build.py
new file mode 100755
index 0000000..949505e
--- /dev/null
+++ b/dependencies/build.py
@@ -0,0 +1,130 @@
+#!/usr/bin/env python3
+# build.py --- Convenience script for building and running DHTNET dependencies
+
+# Copyright (C) 2023 Savoir-faire Linux Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA.
+
+import subprocess
+import os
+import logging
+
+# Configure the logging system
+logging.basicConfig(filename='install.log', level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
+
+# Define paths and directories
+opendht_dir = "opendht"
+pjproject_dir = "pjproject"
+restinio_dir = "restinio"
+install_dir = os.path.abspath("install")
+
+def build_and_install_opendht():
+    logging.info("Building and installing OpenDHT...")
+    try:
+        # Configure OpenDHT with CMake
+        subprocess.run(["cmake", ".",
+            "-DCMAKE_INSTALL_PREFIX=" + install_dir,
+            "-DCMAKE_BUILD_TYPE=Release",
+            "-DBUILD_TESTING=OFF",
+            "-DOPENDHT_PYTHON=OFF",
+            "-DOPENDHT_TOOLS=OFF",
+            "-DOPENDHT_DOCUMENTATION=OFF",
+            "-DOPENDHT_HTTP=ON",
+            "-DOPENDHT_PROXY_CLIENT=ON",
+        ], cwd=opendht_dir, check=True)
+
+        # Build and install OpenDHT
+        subprocess.run(["make", "install"], cwd=opendht_dir, check=True)
+        logging.info("OpenDHT installed successfully.")
+    except subprocess.CalledProcessError as e:
+        logging.error("Error building or installing OpenDHT: %s", e)
+
+def build_and_install_pjproject():
+    # Build PJSIP libraries
+    try:
+        configure_command = [
+            "./configure",
+            f"--prefix={install_dir}",
+            "--disable-sound",
+            "--enable-video",
+            "--enable-ext-sound",
+            "--disable-speex-aec",
+            "--disable-g711-codec",
+            "--disable-l16-codec",
+            "--disable-gsm-codec",
+            "--disable-g722-codec",
+            "--disable-g7221-codec",
+            "--disable-speex-codec",
+            "--disable-ilbc-codec",
+            "--disable-opencore-amr",
+            "--disable-silk",
+            "--disable-sdl",
+            "--disable-ffmpeg",
+            "--disable-v4l2",
+            "--disable-openh264",
+            "--disable-resample",
+            "--disable-libwebrtc",
+            f"--with-gnutls={install_dir}"
+        ]
+        subprocess.run(configure_command, cwd=pjproject_dir, check=True)
+        subprocess.run(["make"], cwd=pjproject_dir, check=True)
+        subprocess.run(["make", "install"], cwd=pjproject_dir, check=True)
+
+        logging.info("PJSIP libraries built successfully.")
+    except subprocess.CalledProcessError as e:
+        logging.error("Error building PJSIP libraries: %s", e)
+
+def build_and_install_restinio():
+    try:
+        restino_build_dir = restinio_dir + "/dev/"
+        cmake_command = [
+            "cmake",
+            f"-DCMAKE_INSTALL_PREFIX={install_dir}",
+            "-DRESTINIO_TEST=OFF",
+            "-DRESTINIO_SAMPLE=OFF",
+            "-DRESTINIO_INSTALL_SAMPLES=OFF",
+            "-DRESTINIO_BENCH=OFF",
+            "-DRESTINIO_INSTALL_BENCHES=OFF",
+            "-DRESTINIO_FIND_DEPS=ON",
+            "-DRESTINIO_ALLOW_SOBJECTIZER=Off",
+            "-DRESTINIO_USE_BOOST_ASIO=none",
+            "."
+        ]
+        subprocess.run(cmake_command, cwd=restino_build_dir, check=True)
+        subprocess.run(["make", "-j8"], cwd=restino_build_dir, check=True)
+        subprocess.run(["make", "install"], cwd=restino_build_dir, check=True)
+        # subprocess.run(["cd", "../.."], check=True)
+        # subprocess.run(["rm", "-rf", "restinio"], check=True)
+
+        logging.info("restinio built and installed successfully.")
+    except subprocess.CalledProcessError as e:
+        logging.error("Error building or installing restinio: %s", e)
+
+def main():
+    # Create install directory if it doesn't exist
+    if not os.path.exists(install_dir):
+        os.makedirs(install_dir)
+    # Build and install restinio
+    build_and_install_restinio()
+
+    # Build and install OpenDHT
+    build_and_install_opendht()
+
+    # Build and install pjproject
+    build_and_install_pjproject()
+
+
+if __name__ == "__main__":
+    main()