diff --git a/.github/workflows/nix.yaml b/.github/workflows/nix.yaml index 433d7e5..1b010b2 100644 --- a/.github/workflows/nix.yaml +++ b/.github/workflows/nix.yaml @@ -28,7 +28,10 @@ jobs: arch: [amd64] steps: - uses: actions/checkout@v4 - + + - name: Use latest India OSM data + run: nix flake lock --update-input india-latest + - name: Build all flake outputs run: om ci diff --git a/docker.nix b/docker.nix index f9cf5cb..4bb7f9f 100644 --- a/docker.nix +++ b/docker.nix @@ -1,27 +1,27 @@ { self, ... }: let imageName = "ghcr.io/nammayatri/osrm-builder"; - imageTag = builtins.substring 0 6 (self.rev or "dev"); + imageTag = builtins.substring 0 6 (self.rev or "dev"); in { perSystem = { self', pkgs, lib, ... }: { packages = { dockerImage = pkgs.dockerTools.buildImage { - name = imageName; - tag = imageTag; + name = imageName; + tag = imageTag; created = "now"; + + # pull in everything under / via buildEnv copyToRoot = pkgs.buildEnv { - name = "patched-osrm-backend"; + name = "osrm-data"; paths = with pkgs; [ cacert coreutils bashInteractive + self'.packages.patched-osrm-backend + self'.packages.osrm-server + self'.packages.osrm-data ]; - /* pathsToLink = [ - "/bin" - "/opt" - ]; - */ }; }; }; diff --git a/osrm.nix b/osrm.nix index 5907f85..d6fff80 100644 --- a/osrm.nix +++ b/osrm.nix @@ -1,52 +1,76 @@ { inputs, ... }: let - openStreetDataFileName = "india-latest"; - carLuaPath = ./car.lua; # Adjust this path as needed - speedDataPath = ./speed-data.csv; - indiaSpeedDataFileName = "india-latest-speed-data"; + openStreetDataFileName = "india-latest"; + carLuaPath = ./car.lua; + speedDataPath = ./speed-data.csv; + indiaSpeedDataFileName = "india-latest-speed-data"; in { perSystem = { self', pkgs, lib, ... }: { - packages = - rec { - patched-osrm-backend = pkgs.stdenv.mkDerivation { - name = "patched-osrm-backend"; - src = inputs.osrm-backend; - buildInputs = [ - pkgs.cmake - pkgs.boost - pkgs.tbb_2021_8 # Use TBB 2021.8 explicitly - pkgs.expat - pkgs.bzip2 - pkgs.libzip - pkgs.pkg-config - pkgs.lua5_2 - ]; + packages = rec { + # 1) Build your custom OSRM backend via CMake + patched-osrm-backend = pkgs.stdenv.mkDerivation { + name = "patched-osrm-backend"; + src = inputs.osrm-backend; + buildInputs = [ + pkgs.cmake + pkgs.boost + pkgs.tbb_2021_8 + pkgs.expat + pkgs.bzip2 + pkgs.libzip + pkgs.pkg-config + pkgs.lua5_2 + ]; + phases = [ "unpackPhase" "buildPhase" "installPhase" ]; + buildPhase = '' + mkdir build && cd build + cmake .. \ + -DENABLE_MASON=ON \ + -DENABLE_IPO=OFF \ + -DTBB_ROOT=${pkgs.tbb_2021_8} \ + -DCMAKE_PREFIX_PATH="${pkgs.boost};${pkgs.tbb_2021_8};${pkgs.expat};${pkgs.bzip2};${pkgs.lua5_2}" \ + -DCMAKE_CXX_STANDARD=20 \ + -DCMAKE_CXX_FLAGS="-std=c++20 -Wno-error=array-bounds -fpermissive" \ + -DCMAKE_INSTALL_PREFIX=$out + make + ''; + installPhase = '' + mkdir -p $out/bin $out/profiles + cp osrm-* $out/bin/ + cp -r ../profiles/* $out/profiles/ + cp ${carLuaPath} $out/profiles/car.lua + ''; + }; + + # 2) Generate .osrm.* data under /opt/osrm-data + osrm-data = pkgs.runCommandNoCC "osrm-data" { + buildInputs = [ patched-osrm-backend ]; + } '' + # create the same path your k8s command uses + mkdir -p $out/opt/osrm-data + cd $out/opt/osrm-data + + ln -s ${inputs.india-latest} ${openStreetDataFileName}.osm.pbf + ln -s ${speedDataPath} ${indiaSpeedDataFileName}.csv + + ${patched-osrm-backend}/bin/osrm-extract -p ${patched-osrm-backend}/profiles/car.lua ${openStreetDataFileName}.osm.pbf + + ${patched-osrm-backend}/bin/osrm-partition ${openStreetDataFileName}.osrm + + ${patched-osrm-backend}/bin/osrm-customize --segment-speed-file ${indiaSpeedDataFileName}.csv ${openStreetDataFileName}.osrm + ''; - phases = [ "unpackPhase" "buildPhase" "installPhase" ]; - buildPhase = '' - mkdir build - cd build - cmake .. \ - -DENABLE_MASON=ON \ - -DENABLE_IPO=OFF \ - -DTBB_ROOT=${pkgs.tbb_2021_8} \ - -DCMAKE_PREFIX_PATH="${pkgs.boost};${pkgs.tbb_2021_8};${pkgs.expat};${pkgs.bzip2};${pkgs.lua5_2}" \ - -DCMAKE_CXX_STANDARD=20 \ - -DCMAKE_CXX_FLAGS="-std=c++20 -Wno-error=array-bounds -fpermissive" \ - -DCMAKE_INSTALL_PREFIX=$out - make - ''; - installPhase = '' - mkdir -p $out/bin $out/profiles - cp osrm-* $out/bin/ - - cp -r ../profiles/* $out/profiles/ - - cp ${carLuaPath} $out/profiles/car.lua - ''; - }; + # 3) Wrapper pointing at the /opt directory + osrm-server = pkgs.writeShellApplication { + name = "osrm-server"; + runtimeInputs = [ patched-osrm-backend ]; + text = '' + set -x + osrm-routed --algorithm mld /opt/osrm-data/${openStreetDataFileName}.osrm + ''; }; + }; }; }