diff --git a/BUILD.md b/BUILD.md new file mode 100644 index 0000000000000000000000000000000000000000..1802bef3a3d663edf5d245747b5744dff9f05328 --- /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 0000000000000000000000000000000000000000..949505efec249ed9c214f67d09b35ad77ee3b7e9 --- /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()