At work I had a need for cross-compiling OpenCV from x86_64-linux to aarch64-linux for use on an edge device.
My coworker @considerate was able to get this successfully cross-compiling.
I wanted to share the overlay in case it helps anyone else attempting to cross-compile OpenCV:
final: prev: {
opencv =
(prev.opencv.override {
# These are disabled to make cross-compiling easier.
enableFfmpeg = false;
enableGStreamer = false;
enablePNG = false;
enableJPEG = true;
hdf5 = null;
}).overrideAttrs (old: {
nativeBuildInputs = old.nativeBuildInputs ++ [final.pkgsBuildHost.protobuf];
cmakeFlags = old.cmakeFlags ++ [
"-DWITH_OPENJPEG=OFF"
"-DWITH_OPENEXR=OFF"
"-DBUILD_opencv_photo=OFF"
"-DBUILD_opencv_dnn=OFF"
];
});
}
This is tested against the nixos-21.05
channel at commit nixos/ddccontrol: init · NixOS/nixpkgs@63ee5cd · GitHub. You can test this by building pkgsCross.aarch64-multiplatform.opencv
on x86_64-linux.
If someone wanted to put some more work into it, it would probably be possible to fix and re-enable some of those additional dependencies (like ffmpeg, png, etc). It would also be nice to get this working by default in Nixpkgs (although I’m not sure how willing maintainers are to merge in things disabling a bunch of stuff just for a niche use-case).