hdf5 icon indicating copy to clipboard operation
hdf5 copied to clipboard

Support Android Targets

Open leleliu008 opened this issue 3 years ago • 7 comments

https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.13/hdf5-1.13.0/src/hdf5-1.13.0.tar.bz2

cmake \
        -DHDF5_BUILD_DOC=OFF \
        -DBUILD_SHARED_LIBS=ON \
        -DBUILD_STATIC_LIBS=ON \
        -DBUILD_STATIC_EXECS=ON \
        -DTEST_LFS_WORKS_RUN=ON
        -S . \
        -B build.d

27

It seems that this project do not support cross-compiling. how can I skip these build time checks? Thanks.

leleliu008 avatar Jan 29 '22 05:01 leleliu008

You can pre-populate the file needed - you need to do a search. However we do have CMake support in the src/CMakeLists.txt file for using the file. About line 1028 HDF5_USE_PREGEN variable.

byrnHDF avatar Jan 31 '22 13:01 byrnHDF

@byrnHDF can you point to a documentation on how to I'm trying to just compile the current develop branch of hdf5 for a current android on windows using the latest NDK ect.

I'm a bit lost in regards of a) where to get the values for this file (how to generate) and b) how the file needs to look like (are there examples?)

Can you give me a hint into the correct direction. Thanks.

jebos avatar Sep 28 '22 10:09 jebos

Some references first: CMake toolchains: https://cmake.org/cmake/help/latest/manual/cmake-toolchains.7.html aarch64 on Ubuntu: https://discourse.cmake.org/t/cross-compile-for-aarch64-on-ubuntu/2161/10 Using clang(includes an addendum for gcc) on windows to arm: https://stackoverflow.com/questions/54539682/how-to-set-up-cmake-to-cross-compile-with-clang-for-arm-embedded-on-windows?rq=1 CMake NDK: https://developer.android.com/ndk/guides/cmake

A note found during search: make sure you set the CMAKE_FIND_ROOT_PATH variable to a path where you have an exact copy of the root filesystem you have on your target device (with libraries and binaries pre-compiled for the target processor).

byrnHDF avatar Sep 28 '22 15:09 byrnHDF

Initial release_docs file: INSTALL_cross_compile.txt ` // HDF5 Build and Install Instructions for Cross Compiling

Cross-compiling has several consequences for CMake: CMake cannot automatically detect the target platform. CMake cannot find libraries and headers in the default system directories. Executables built during cross compiling cannot be executed.

Cross-compiling support means that CMake separates information about the build platform and target platform and gives the user mechanisms to solve cross-compiling issues without additional requirements such as running virtual machines, etc.

CMake uses a toolchain of utilities to compile, link libraries and create archives, and other tasks to drive the build. The toolchain utilities available are determined by the languages enabled.

CMake stores info about the current toolchain in the following variables: CMAKE_C_COMPILER, CMAKE_CXX_COMPILER. They contain paths to the C and C++ compilers respectively. This is usually enough on desktop platforms. In the case of the embedded systems, also a custom linker and assembler setting is needed. In more complex projects you may need to additionally specify binaries to other parts of the toolchain (size, ranlib, objcopy…). All these tools should be set in the corresponding variables: CMAKE_AR, CMAKE_ASM_COMPILER, CMAKE_LINKER, CMAKE_OBJCOPY, CMAKE_RANLIB

As for the host and target operating systems, CMake stores their names in the following variables: CMAKE_HOST_SYSTEM_NAME – name of the platform, on which CMake is running (host platform). On major operating systems this is set to the Linux, Windows or Darwin (MacOS) value. CMAKE_SYSTEM_NAME – name of the platform, for which we are building (target platform). By default, this value is the same as CMAKE_HOST_SYSTEM_NAME, which means that we are building for the local platform (no cross-compilation).

Put the toolchain variables into a separate file (e.g. <toolchain_name>.cmake) and set CMAKE_TOOLCHAIN_FILE variable to the path of that file. If cmake is invoked with the command line parameter: --toolchain path/to/file or -DCMAKE_TOOLCHAIN_FILE=path/to/file the file will be loaded early to set values for the compilers. The CMAKE_CROSSCOMPILING variable is set to true when CMake is cross-compiling.

Structure of the toolchain file

In fact, the toolchain file doesn’t have any structure. You can put anything you want there. But the best practice is to define at least these settings: path to the toolchain binaries (C compiler, C++ compiler, linker, etc.) name of the target platform (and optionally target processor architecture) required compilation and linking flags on that particular platform toolchain sysroot settings

References: https://cmake.org/cmake/help/latest/manual/cmake-toolchains.7.html https://gitlab.com/embeddedlinux/libs/platform `

byrnHDF avatar Sep 28 '22 15:09 byrnHDF

The one file that needs to be pre-generated is the H5Tinit.c file. The variables indicated in the error log (see above) are the variables that need to match the target system.

The HDF5 CMake variables; HDF5_USE_PREGEN: set this to true HDF5_USE_PREGEN_DIR: set this path to the preset H5Tinit.c file

byrnHDF avatar Sep 28 '22 15:09 byrnHDF

There may be more HDF5 files that will need adjustments for different platforms, but H5Tinit.c is the key file. The next possible issue might be the H5pubconf.h file that is generated - if that happens we can adjust the PREGEN code blocks to account for it.

byrnHDF avatar Sep 28 '22 15:09 byrnHDF

The one file that needs to be pre-generated is the H5Tinit.c file. The variables indicated in the error log (see above) are the variables that need to match the target system.

The HDF5 CMake variables; HDF5_USE_PREGEN: set this to true HDF5_USE_PREGEN_DIR: set this path to the preset H5Tinit.c file

I also encountered this problem, how to get the value of the variable matching the target system?

cbldlpl avatar Nov 17 '22 08:11 cbldlpl

Can this issue be closed?

  • The long double checks are gone
  • AC_RUN_IFELSE in the Autotools has defaults for everything that is left (just szip encoding and checking pthread_attr_setscope)
  • H5detect is gone
  • H5make_libsettings is gone

Cross compiling should basically just work now

derobins avatar Jun 13 '23 15:06 derobins

@derobins Thanks for your effort. I tried the master branch HEAD and it was successfully built, so this can be closed now.

leleliu008 avatar Jun 13 '23 17:06 leleliu008

The cross compiling is broken again:

CMake Error: try_run() invoked in cross-compiling mode, please set the following cache variables appropriately:
   H5_LDOUBLE_TO_LONG_SPECIAL_RUN (advanced)
   H5_LDOUBLE_TO_LONG_SPECIAL_RUN__TRYRUN_OUTPUT (advanced)
For details see /github/home/.ndk-pkg/run/524/hdf5/src/_/TryRunResults.cmake
CMake Error: try_run() invoked in cross-compiling mode, please set the following cache variables appropriately:
   H5_LONG_TO_LDOUBLE_SPECIAL_RUN (advanced)
   H5_LONG_TO_LDOUBLE_SPECIAL_RUN__TRYRUN_OUTPUT (advanced)
For details see /github/home/.ndk-pkg/run/524/hdf5/src/_/TryRunResults.cmake
CMake Error: try_run() invoked in cross-compiling mode, please set the following cache variables appropriately:
   H5_LDOUBLE_TO_LLONG_ACCURATE_RUN (advanced)
   H5_LDOUBLE_TO_LLONG_ACCURATE_RUN__TRYRUN_OUTPUT (advanced)
For details see /github/home/.ndk-pkg/run/524/hdf5/src/_/TryRunResults.cmake
CMake Error: try_run() invoked in cross-compiling mode, please set the following cache variables appropriately:
   H5_LLONG_TO_LDOUBLE_CORRECT_RUN (advanced)
   H5_LLONG_TO_LDOUBLE_CORRECT_RUN__TRYRUN_OUTPUT (advanced)
For details see /github/home/.ndk-pkg/run/524/hdf5/src/_/TryRunResults.cmake
CMake Error: try_run() invoked in cross-compiling mode, please set the following cache variables appropriately:
   H5_DISABLE_SOME_LDOUBLE_CONV_RUN (advanced)
   H5_DISABLE_SOME_LDOUBLE_CONV_RUN__TRYRUN_OUTPUT (advanced)
For details see /github/home/.ndk-pkg/run/524/hdf5/src/_/TryRunResults.cmake

leleliu008 avatar Jul 23 '23 02:07 leleliu008

Was this the develop branch? Looks like the checks were reverted about 5 weeks ago.

byrnHDF avatar Jul 23 '23 13:07 byrnHDF

Yes, I use the default breach: develop.

leleliu008 avatar Jul 23 '23 19:07 leleliu008