diff --git a/CMakeLists.txt b/CMakeLists.txt
index 8a09e1664cfd021d7a9ea73240cdcfbb0bde9dd6..ec60df8b35c0197fffe93c1a4db61f09123060dd 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -102,7 +102,7 @@ add_list_string_option(CMAKE_BUILD_TYPE "RelWithDebInfo" "Choose the type of bui
 # in case /proc/cpuinfo exists we want to inspect available Intrinsics
 # -so not to go always through SIMDE emulation
 # -so to avoid AVX512 instructions generation by gcc   
-if(EXISTS "/proc/cpuinfo")
+if(EXISTS "/proc/cpuinfo" AND NOT CROSS_COMPILE)
   file(STRINGS "/proc/cpuinfo" CPUFLAGS REGEX flags LIMIT_COUNT 1)
 else()
   message(WARNING "did not find /proc/cpuinfo -- not setting any x86-specific compilation variables")
@@ -115,7 +115,10 @@ eval_boolean(AUTODETECT_AVX2 DEFINED CPUFLAGS AND CPUFLAGS MATCHES "avx2")
 add_boolean_option(AVX2 ${AUTODETECT_AVX2} "Whether AVX2 intrinsics is available on the host processor" ON)
 
 message(STATUS "CPU architecture is ${CMAKE_SYSTEM_PROCESSOR}")
-if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
+if (CROSS_COMPILE)
+  message(STATUS "setting as aarch64")
+  set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -gdwarf-2 -lgcc -lrt")
+elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
   # The following intrinsics are assumed to be available on any x86 system
   # (avx, f16c, fma, gnfi, mmx, pclmul, sse, sse2, sse3, xop)
   set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -DSIMDE_X86_AVX_NATIVE -DSIMDE_X86_AVX_NATIVE -DSIMDE_X86_F16C_NATIVE -DSIMDE_X86_FMA_NATIVE -DSIMDE_X86_GFNI_NATIVE -DSIMDE_X86_MMX_NATIVE -DSIMDE_X86_PCLMUL_NATIVE -DSIMDE_X86_SSE2_NATIVE -DSIMDE_X86_SSE3_NATIVE -DSIMDE_X86_SSE_NATIVE -DSIMDE_X86_XOP_HAVE_COM_ -DSIMDE_X86_XOP_NATIVE")
@@ -146,7 +149,11 @@ else()
   message(FATAL_ERROR "compile for CPU architecture ${CPUARCH}, CMAKE_SYSTEM_PROCESSOR ${CMAKE_SYSTEM_PROCESSOR}")
 endif()
 
-set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -march=native")
+if (NOT CROSS_COMPILE)
+  set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -march=native")
+else ()
+  set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -march=armv8-a")
+endif()
 
 # add autotools definitions that were maybe used!
 add_definitions("-DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_FCNTL_H=1 -DHAVE_ARPA_INET_H=1 -DHAVE_SYS_TIME_H=1 -DHAVE_SYS_SOCKET_H=1 -DHAVE_STRERROR=1 -DHAVE_SOCKET=1 -DHAVE_MEMSET=1 -DHAVE_GETTIMEOFDAY=1 -DHAVE_STDLIB_H=1 -DHAVE_MALLOC=1 -DHAVE_LIBSCTP")
diff --git a/cmake_targets/cross-arm.cmake b/cmake_targets/cross-arm.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..6209245876ca1dd1ed1324ba86c42b23b54ba430
--- /dev/null
+++ b/cmake_targets/cross-arm.cmake
@@ -0,0 +1,16 @@
+set(CMAKE_SYSTEM_NAME Linux)
+set(CMAKE_SYSTEM_PROCESSOR arm)
+
+set(CMAKE_C_COMPILER   /usr/bin/aarch64-linux-gnu-gcc-9)
+set(CMAKE_CXX_COMPILER /usr/bin/aarch64-linux-gnu-g++-9)
+
+set(CROSS_COMPILE 1)
+set(bnProc_gen_128_DIR    ${CMAKE_CURRENT_BINARY_DIR}/${NATIVE_DIR}) # /../build)
+set(bnProc_gen_avx2_DIR   ${CMAKE_CURRENT_BINARY_DIR}/${NATIVE_DIR}) # /../build)
+set(bnProc_gen_avx512_DIR ${CMAKE_CURRENT_BINARY_DIR}/${NATIVE_DIR}) # /../build)
+set(cnProc_gen_128_DIR    ${CMAKE_CURRENT_BINARY_DIR}/${NATIVE_DIR}) # /../build)
+set(cnProc_gen_avx2_DIR   ${CMAKE_CURRENT_BINARY_DIR}/${NATIVE_DIR}) # /../build)
+set(cnProc_gen_avx512_DIR ${CMAKE_CURRENT_BINARY_DIR}/${NATIVE_DIR}) # /../build)
+set(genids_DIR            ${CMAKE_CURRENT_BINARY_DIR}/${NATIVE_DIR}) # /../build)
+set(_check_vcd_DIR        ${CMAKE_CURRENT_BINARY_DIR}/${NATIVE_DIR}) # /../build)
+
diff --git a/common/utils/T/CMakeLists.txt b/common/utils/T/CMakeLists.txt
index 19aed0440e61dc9ce820cf10ea9c3e286bed8a90..1f9055e00762d747879316efb20a0fd237944e99 100644
--- a/common/utils/T/CMakeLists.txt
+++ b/common/utils/T/CMakeLists.txt
@@ -1,8 +1,13 @@
-add_executable(genids genids.c)
-set_target_properties(genids PROPERTIES RUNTIME_OUTPUT_DIRECTORY .)
-
+if (CROSS_COMPILE)
+  find_package(genids)
+else()
+  add_executable(genids genids.c)
+  set_target_properties(genids PROPERTIES RUNTIME_OUTPUT_DIRECTORY .)
+  export(TARGETS genids FILE
+          "${CMAKE_BINARY_DIR}/genidsConfig.cmake")
+endif()
 add_custom_command(OUTPUT T_IDs.h
-                   COMMAND ./genids ${CMAKE_CURRENT_SOURCE_DIR}/T_messages.txt T_IDs.h
+                   COMMAND genids ${CMAKE_CURRENT_SOURCE_DIR}/T_messages.txt T_IDs.h
                    DEPENDS genids
                    COMMENT "Generating T_IDs.h from T_messages.txt"
 )
@@ -12,14 +17,19 @@ add_custom_command(OUTPUT T_messages.txt.h
                    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
 )
 
-add_executable(_check_vcd check_vcd.c tracer/database.c tracer/utils.c T_IDs.h T_messages.txt.h)
-target_include_directories(_check_vcd PRIVATE
-                           .. ../itti ../../../openair2/COMMON tracer
-                           ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
-target_compile_options(_check_vcd PRIVATE -Wall)
-target_link_libraries(_check_vcd PRIVATE m pthread)
-set_target_properties(_check_vcd PROPERTIES RUNTIME_OUTPUT_DIRECTORY .)
-
+if (CROSS_COMPILE)
+  find_package(_check_vcd)
+else ()
+  add_executable(_check_vcd check_vcd.c tracer/database.c tracer/utils.c T_IDs.h T_messages.txt.h)
+  target_include_directories(_check_vcd PRIVATE
+                             .. ../itti ../../../openair2/COMMON tracer
+                             ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
+  target_compile_options(_check_vcd PRIVATE -Wall)
+  target_link_libraries(_check_vcd PRIVATE m pthread)
+  set_target_properties(_check_vcd PROPERTIES RUNTIME_OUTPUT_DIRECTORY .)
+  export(TARGETS _check_vcd FILE
+            "${CMAKE_BINARY_DIR}/_check_vcdConfig.cmake")
+endif()
 add_custom_target(check_vcd
                   COMMAND _check_vcd ${CMAKE_CURRENT_SOURCE_DIR}/T_messages.txt ${CMAKE_CURRENT_SOURCE_DIR}/../LOG/vcd_signal_dumper.h
                   DEPENDS _check_vcd
diff --git a/doc/BUILD.md b/doc/BUILD.md
index 45e0c1dc0676beb7d059bea046bf2d355e11824a..798d0b5ea22a31d71193c74822cbea8e0b6b6818 100644
--- a/doc/BUILD.md
+++ b/doc/BUILD.md
@@ -215,3 +215,8 @@ ccmake ../../..
 cmake-gui ../../..
 ```
 You can of course use all standard cmake/ninja/make commands in this directory.
+
+# Cross Compile
+
+If you want to use cross-compiler on x86 platform for aarch64 version, please refer the [cross-compile.md](./cross-compile.md) for more information.
+
diff --git a/doc/README.md b/doc/README.md
index 5898c22ef49489d619c822d1549f23936c4d876e..0f52a0b8ffd1620a0e88b1e487e2a285ef9b4eeb 100644
--- a/doc/README.md
+++ b/doc/README.md
@@ -19,6 +19,7 @@
 - [FEATURE_SET.md](./FEATURE_SET.md): lists supported features
 - [GET_SOURCES.md](./GET_SOURCES.md): how to download the sources
 - [BUILD.md](./BUILD.md): how to build the sources
+- [cross-compile.md](./cross-compile.md): how to cross-compile OAI for ARM
 - [clang-format.md](./clang-format.md): how to format the code
 - [environment-variables.md](./environment-variables.md): the environment variables used by OAI
 
diff --git a/doc/cross-compile.md b/doc/cross-compile.md
new file mode 100644
index 0000000000000000000000000000000000000000..7e8205eaa6f6eeadbd45217b0cc71ba21bd2e31f
--- /dev/null
+++ b/doc/cross-compile.md
@@ -0,0 +1,93 @@
+[[_TOC_]]
+
+
+# OpenAirInterface Cross-Compiler User Guide
+
+## Environment
+
+- OS: ubuntu 20.04
+
+### Set up the environment
+
+Set up for install the package for aarch64.
+
+```shell
+sudo dpkg --add-architecture arm64
+
+echo -e \
+        "deb [arch=arm64] http://ports.ubuntu.com/ focal main restricted\n"\
+        "deb [arch=arm64] http://ports.ubuntu.com/ focal-updates main restricted\n"\
+        "deb [arch=arm64] http://ports.ubuntu.com/ focal universe\n"\
+        "deb [arch=arm64] http://ports.ubuntu.com/ focal-updates universe\n"\
+        "deb [arch=arm64] http://ports.ubuntu.com/ focal multiverse\n"\
+        "deb [arch=arm64] http://ports.ubuntu.com/ focal-updates multiverse\n"\
+        "deb [arch=arm64] http://ports.ubuntu.com/ focal-backports main restricted universe multiverse"\
+    | sudo tee /etc/apt/sources.list.d/arm-cross-compile-sources.list
+
+sudo cp /etc/apt/sources.list "/etc/apt/sources.list.`date`.backup"
+sudo sed -i -E "s/(deb)\ (http:.+)/\1\ [arch=amd64]\ \2/" /etc/apt/sources.list
+
+sudo apt update
+sudo apt install -y gcc-9-aarch64-linux-gnu \
+                    g++-9-aarch64-linux-gnu
+
+sudo apt-get install -y \
+    libatlas-base-dev:arm64 \
+    libblas-dev:arm64 \
+    libc6-dev-i386 \
+    liblapack-dev:arm64 \
+    liblapacke-dev:arm64 \
+    libreadline-dev:arm64 \
+    libgnutls28-dev:arm64 \
+    libconfig-dev:arm64 \
+    libsctp-dev:arm64 \
+    libssl-dev:arm64 \
+    libtool:arm64 \
+    zlib1g-dev:arm64
+```
+
+## Install and Build
+
+### Install required packages
+
+Use the host compiler to install some dependencies.
+
+```shell
+cd cmake_targets
+./build_oai -I
+```
+
+### Build the LDPC generators
+
+Use the x86 compiler to build the `ldpc_generators` and generate the header
+file in the `ran_build/build` folder.  They are necessary during a build for
+code generation, and therefore need to be created for the x86 architecture.
+
+```shell
+rm -r ran_build
+mkdir ran_build
+mkdir ran_build/build
+mkdir ran_build/build-cross
+
+cd ran_build/build
+cmake ../../..
+make -j`nproc` ldpc_generators generate_T
+```
+
+### Build the Other Executables for aarch64
+
+Switch to the `ran_build/build-cross` folder to build the target executables
+for ARM. The `cross-arm.cmake` file defines some ARM-specific build tools
+(e.g., compilers) that you might need to adapt. Further, it defines cmake
+variables that define in this step where the host tools (such as LDPC
+generators) are to be found. For the latter, the `NATIVE_DIR` option has to
+be defined in order to tell cmake where the host tools have been built.
+
+```shell
+cd ../build-cross
+cmake ../../.. -DCMAKE_TOOLCHAIN_FILE=../../../cmake_targets/cross-arm.cmake -DNATIVE_DIR=../build
+
+make -j`nproc` dlsim ulsim ldpctest polartest smallblocktest nr_pbchsim nr_dlschsim nr_ulschsim nr_dlsim nr_ulsim nr_pucchsim nr_prachsim
+make -j`nproc` lte-softmodem nr-softmodem nr-cuup oairu lte-uesoftmodem nr-uesoftmodem
+make -j`nproc` params_libconfig coding rfsimulator
+```
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/CMakeLists.txt b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/CMakeLists.txt
index b84b259152aa4db504186b714562237623eb01de..26ef39408fc69c81973fa2105c5a729ef8e0a007 100644
--- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/CMakeLists.txt
+++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/CMakeLists.txt
@@ -5,13 +5,23 @@ add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/generator_cnProc_avx512 ldpc/generato
 
 # custom target to build all generators
 add_custom_target(ldpc_generators)
+
+# if (CROSS_COMPILE)
+#   find_package(bnProc_gen_avx2)
+#   find_package(bnProc_gen_128)
+#   find_package(bnProc_gen_avx512)
+#   find_package(cnProc_gen_avx2)
+#   find_package(cnProc_gen_128)
+#   find_package(cnProc_gen_avx512)
+# endif()
+
 add_dependencies(ldpc_generators
-                 bnProc_gen_avx2
-                 bnProc_gen_128
-                 bnProc_gen_avx512
-                 cnProc_gen_avx2
-                 cnProc_gen_128
-                 cnProc_gen_avx512)
+                 bnProc_gen_avx2_files
+                 bnProc_gen_128_files
+                 bnProc_gen_avx512_files
+                 cnProc_gen_avx2_files
+                 cnProc_gen_128_files
+                 cnProc_gen_avx512_files)
 
 add_library(ldpc_gen_HEADERS INTERFACE)
 target_link_libraries(ldpc_gen_HEADERS INTERFACE
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/CMakeLists.txt b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/CMakeLists.txt
index 96ad39f79c9190ee84265c44ffa12d0d774b1433..e67f3868adbe41e77fb9d1b821ca8e0fdf7e1f3f 100644
--- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/CMakeLists.txt
+++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/CMakeLists.txt
@@ -1,55 +1,89 @@
-add_executable(bnProc_gen_avx2
-               bnProc_gen_BG1_avx2.c
-               bnProc_gen_BG2_avx2.c
-               bnProcPc_gen_BG1_avx2.c
-               bnProcPc_gen_BG2_avx2.c
-               main.c)
-add_executable(bnProc_gen_128
-               bnProc_gen_BG1_128.c
-               bnProc_gen_BG2_128.c
-               bnProcPc_gen_BG1_128.c
-               bnProcPc_gen_BG2_128.c
-               main128.c)
-	       
-target_compile_options(bnProc_gen_avx2 PRIVATE -W -Wall )
-
-target_compile_options(bnProc_gen_128 PRIVATE -W -Wall )
-#set(bnProc_headers
-#    bnProc/nrLDPC_bnProc_BG1_R13_AVX2.h
-#    bnProc/nrLDPC_bnProc_BG1_R23_AVX2.h
-#    bnProc/nrLDPC_bnProc_BG1_R89_AVX2.h
-#    bnProc/rLDPC_bnProc_BG2_R13_AVX2.h
-#    bnProc/rLDPC_bnProc_BG2_R15_AVX2.h
-#    bnProc/rLDPC_bnProc_BG2_R23_AVX2.h)
-#
-#set(bnProcPc_headers
-#    bnProcPc/rLDPC_bnProcPc_BG1_R13_AVX2.h
-#    bnProcPc/rLDPC_bnProcPc_BG1_R23_AVX2.h
-#    bnProcPc/rLDPC_bnProcPc_BG1_R89_AVX2.h
-#    bnProcPc/rLDPC_bnProcPc_BG2_R13_AVX2.h
-#    bnProcPc/rLDPC_bnProcPc_BG2_R15_AVX2.h
-#    bnProcPc/rLDPC_bnProcPc_BG2_R23_AVX2.h)
-
-add_custom_command(TARGET bnProc_gen_avx2 POST_BUILD
-  #OUTPUT ${bnProc_headers} ${bnProcPc_headers}
+if (CROSS_COMPILE)
+  find_package(bnProc_gen_128)
+  find_package(bnProc_gen_avx2)
+else()
+  add_executable(bnProc_gen_avx2
+                 bnProc_gen_BG1_avx2.c
+                 bnProc_gen_BG2_avx2.c
+                 bnProcPc_gen_BG1_avx2.c
+                 bnProcPc_gen_BG2_avx2.c
+                 main.c)
+  add_executable(bnProc_gen_128
+                 bnProc_gen_BG1_128.c
+                 bnProc_gen_BG2_128.c
+                 bnProcPc_gen_BG1_128.c
+                 bnProcPc_gen_BG2_128.c
+                 main128.c)
+  	       
+  target_compile_options(bnProc_gen_avx2 PRIVATE -W -Wall )
+  
+  target_compile_options(bnProc_gen_128 PRIVATE -W -Wall )
+  export(TARGETS bnProc_gen_avx2 FILE
+          "${CMAKE_BINARY_DIR}/bnProc_gen_avx2Config.cmake")
+  export(TARGETS bnProc_gen_128 FILE
+          "${CMAKE_BINARY_DIR}/bnProc_gen_128Config.cmake")
+endif ()
+
+set(bnProc_headers
+  bnProc/nrLDPC_bnProc_BG1_R13_AVX2.h
+  bnProc/nrLDPC_bnProc_BG1_R23_AVX2.h
+  bnProc/nrLDPC_bnProc_BG1_R89_AVX2.h
+  bnProc/nrLDPC_bnProc_BG2_R13_AVX2.h
+  bnProc/nrLDPC_bnProc_BG2_R15_AVX2.h
+  bnProc/nrLDPC_bnProc_BG2_R23_AVX2.h)
+
+set(bnProcPc_headers
+  bnProcPc/nrLDPC_bnProcPc_BG1_R13_AVX2.h
+  bnProcPc/nrLDPC_bnProcPc_BG1_R23_AVX2.h
+  bnProcPc/nrLDPC_bnProcPc_BG1_R89_AVX2.h
+  bnProcPc/nrLDPC_bnProcPc_BG2_R13_AVX2.h
+  bnProcPc/nrLDPC_bnProcPc_BG2_R15_AVX2.h
+  bnProcPc/nrLDPC_bnProcPc_BG2_R23_AVX2.h)
+
+set(bnProc128_headers
+  bnProc/nrLDPC_bnProc_BG1_R13_128.h
+  bnProc/nrLDPC_bnProc_BG1_R23_128.h
+  bnProc/nrLDPC_bnProc_BG1_R89_128.h
+  bnProc/nrLDPC_bnProc_BG2_R13_128.h
+  bnProc/nrLDPC_bnProc_BG2_R15_128.h
+  bnProc/nrLDPC_bnProc_BG2_R23_128.h)
+
+set(bnProcPc128_headers
+  bnProcPc/nrLDPC_bnProcPc_BG1_R13_128.h
+  bnProcPc/nrLDPC_bnProcPc_BG1_R23_128.h
+  bnProcPc/nrLDPC_bnProcPc_BG1_R89_128.h
+  bnProcPc/nrLDPC_bnProcPc_BG2_R13_128.h
+  bnProcPc/nrLDPC_bnProcPc_BG2_R15_128.h
+  bnProcPc/nrLDPC_bnProcPc_BG2_R23_128.h)
+
+
+add_custom_command(
+  # TARGET bnProc_gen_avx2 POST_BUILD
+  OUTPUT ${bnProc_headers} ${bnProcPc_headers}
   COMMAND ${CMAKE_COMMAND} -E make_directory bnProc
   COMMAND ${CMAKE_COMMAND} -E make_directory bnProcPc
   COMMAND bnProc_gen_avx2 .
   DEPENDS bnProc_gen_avx2
   COMMENT "Generating LDPC bnProc header files for AVX2"
 )
-add_custom_command(TARGET bnProc_gen_128 POST_BUILD
-  #OUTPUT ${bnProc_headers} ${bnProcPc_headers}
+add_custom_target(bnProc_gen_avx2_files DEPENDS ${bnProc_headers} ${bnProcPc_headers})
+
+add_custom_command(
+  # TARGET bnProc_gen_128 POST_BUILD
+  OUTPUT ${bnProc128_headers} ${bnProcPc128_headers}
   COMMAND ${CMAKE_COMMAND} -E make_directory bnProc128
   COMMAND ${CMAKE_COMMAND} -E make_directory bnProcPc128
   COMMAND bnProc_gen_128 .
   DEPENDS bnProc_gen_128
   COMMENT "Generating LDPC bnProc header files for 128-bit SIMD"
 )
+add_custom_target(bnProc_gen_128_files DEPENDS ${bnProc128_headers} ${bnProcPc128_headers})
 
 add_library(bnProc_gen_avx2_HEADERS INTERFACE)
 target_include_directories(bnProc_gen_avx2_HEADERS INTERFACE ${CMAKE_CURRENT_BINARY_DIR})
-add_dependencies(bnProc_gen_avx2_HEADERS bnProc_gen_avx2)
+add_dependencies(bnProc_gen_avx2_HEADERS bnProc_gen_avx2_files)
+
 add_library(bnProc_gen_128_HEADERS INTERFACE)
 target_include_directories(bnProc_gen_128_HEADERS INTERFACE ${CMAKE_CURRENT_BINARY_DIR})
-add_dependencies(bnProc_gen_128_HEADERS bnProc_gen_128)
+add_dependencies(bnProc_gen_128_HEADERS bnProc_gen_128_files)
+
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/CMakeLists.txt b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/CMakeLists.txt
index f8da0c9c2484624635333eef5c3c130d641777bf..e06d3ed21b1c8dc715ff7b931fedd168ef9669d0 100644
--- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/CMakeLists.txt
+++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/CMakeLists.txt
@@ -1,36 +1,45 @@
-add_executable(bnProc_gen_avx512
-               bnProc_gen_BG1_avx512.c
-               bnProc_gen_BG2_avx512.c
-               bnProcPc_gen_BG1_avx512.c
-               bnProcPc_gen_BG2_avx512.c
-               main.c)
-target_compile_options(bnProc_gen_avx512 PRIVATE -W -Wall )
+if (CROSS_COMPILE)
+  find_package(bnProc_gen_avx512)
+else()
+  add_executable(bnProc_gen_avx512
+                 bnProc_gen_BG1_avx512.c
+                 bnProc_gen_BG2_avx512.c
+                 bnProcPc_gen_BG1_avx512.c
+                 bnProcPc_gen_BG2_avx512.c
+                 main.c)
+  target_compile_options(bnProc_gen_avx512 PRIVATE -W -Wall )
+  export(TARGETS bnProc_gen_avx512 FILE
+        "${CMAKE_BINARY_DIR}/bnProc_gen_avx512Config.cmake")
+endif ()
 
-#set(bnProc_avx512_headers
-#    bnProc_avx512/rLDPC_bnProc_BG1_R13_AVX512.h
-#    bnProc_avx512/rLDPC_bnProc_BG1_R23_AVX512.h
-#    bnProc_avx512/rLDPC_bnProc_BG1_R89_AVX512.h
-#    bnProc_avx512/rLDPC_bnProc_BG2_R13_AVX512.h
-#    bnProc_avx512/rLDPC_bnProc_BG2_R15_AVX512.h
-#    bnProc_avx512/rLDPC_bnProc_BG2_R23_AVX512.h)
-#
-#set(bnProcPc_avx512_headers
-#    bnProcPc_avx512/rLDPC_bnProcPc_BG1_R13_AVX512.h
-#    bnProcPc_avx512/rLDPC_bnProcPc_BG1_R23_AVX512.h
-#    bnProcPc_avx512/rLDPC_bnProcPc_BG1_R89_AVX512.h
-#    bnProcPc_avx512/rLDPC_bnProcPc_BG2_R13_AVX512.h
-#    bnProcPc_avx512/rLDPC_bnProcPc_BG2_R15_AVX512.h
-#    bnProcPc_avx512/rLDPC_bnProcPc_BG2_R23_AVX512.h)
+set(bnProc_avx512_headers
+    bnProc_avx512/nrLDPC_bnProc_BG1_R13_AVX512.h
+    bnProc_avx512/nrLDPC_bnProc_BG1_R23_AVX512.h
+    bnProc_avx512/nrLDPC_bnProc_BG1_R89_AVX512.h
+    bnProc_avx512/nrLDPC_bnProc_BG2_R13_AVX512.h
+    bnProc_avx512/nrLDPC_bnProc_BG2_R15_AVX512.h
+    bnProc_avx512/nrLDPC_bnProc_BG2_R23_AVX512.h)
 
-add_custom_command(TARGET bnProc_gen_avx512 POST_BUILD
-  #OUTPUT ${bnProc_avx512_headers} ${bnProcPc_avx512_headers}
+set(bnProcPc_avx512_headers
+    bnProcPc_avx512/nrLDPC_bnProcPc_BG1_R13_AVX512.h
+    bnProcPc_avx512/nrLDPC_bnProcPc_BG1_R23_AVX512.h
+    bnProcPc_avx512/nrLDPC_bnProcPc_BG1_R89_AVX512.h
+    bnProcPc_avx512/nrLDPC_bnProcPc_BG2_R13_AVX512.h
+    bnProcPc_avx512/nrLDPC_bnProcPc_BG2_R15_AVX512.h
+    bnProcPc_avx512/nrLDPC_bnProcPc_BG2_R23_AVX512.h)
+
+add_custom_command(
+  # TARGET bnProc_gen_avx512 POST_BUILD
+  OUTPUT ${bnProc_avx512_headers} ${bnProcPc_avx512_headers}
   COMMAND ${CMAKE_COMMAND} -E make_directory bnProc_avx512
   COMMAND ${CMAKE_COMMAND} -E make_directory bnProcPc_avx512
   COMMAND bnProc_gen_avx512 .
   DEPENDS bnProc_gen_avx512
   COMMENT "Generating LDPC bnProc header files for AVX512"
 )
+add_custom_target(bnProc_gen_avx512_files DEPENDS ${bnProc_avx512_headers} ${bnProcPc_avx512_headers})
 
 add_library(bnProc_gen_avx512_HEADERS INTERFACE)
 target_include_directories(bnProc_gen_avx512_HEADERS INTERFACE ${CMAKE_CURRENT_BINARY_DIR})
-add_dependencies(bnProc_gen_avx512_HEADERS bnProc_gen_avx512)
+add_dependencies(bnProc_gen_avx512_HEADERS bnProc_gen_avx512_files)
+
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc/CMakeLists.txt b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc/CMakeLists.txt
index a54349c61dbd826e0258ce75c02d05a602bd4135..8c097dc4dce33ad165206443b58dc42dada4f07c 100644
--- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc/CMakeLists.txt
+++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc/CMakeLists.txt
@@ -1,41 +1,64 @@
-add_executable(cnProc_gen_avx2
-               cnProc_gen_BG1_avx2.c
-               cnProc_gen_BG2_avx2.c
-               main.c)
-add_executable(cnProc_gen_128
-               cnProc_gen_BG1_128.c
-               cnProc_gen_BG2_128.c
-               main128.c)
-target_compile_options(cnProc_gen_avx2 PRIVATE -W -Wall )
-target_compile_options(cnProc_gen_128 PRIVATE -W -Wall )
+if (CROSS_COMPILE)
+  find_package(cnProc_gen_128)
+  find_package(cnProc_gen_avx2)
+else()
+  add_executable(cnProc_gen_avx2
+                 cnProc_gen_BG1_avx2.c
+                 cnProc_gen_BG2_avx2.c
+                 main.c)
+  add_executable(cnProc_gen_128
+                 cnProc_gen_BG1_128.c
+                 cnProc_gen_BG2_128.c
+                 main128.c)
+  target_compile_options(cnProc_gen_avx2 PRIVATE -W -Wall )
+  target_compile_options(cnProc_gen_128 PRIVATE -W -Wall )
+  export(TARGETS cnProc_gen_avx2 FILE
+          "${CMAKE_BINARY_DIR}/cnProc_gen_avx2Config.cmake")
+  export(TARGETS cnProc_gen_128 FILE
+          "${CMAKE_BINARY_DIR}/cnProc_gen_128Config.cmake")
+endif()  
 
-#set(cnProc_headers
-#    cnProc/rLDPC_cnProc_BG1_R13_AVX2.h
-#    cnProc/rLDPC_cnProc_BG1_R23_AVX2.h
-#    cnProc/rLDPC_cnProc_BG1_R89_AVX2.h
-#    cnProc/rLDPC_cnProc_BG2_R13_AVX2.h
-#    cnProc/rLDPC_cnProc_BG2_R15_AVX2.h
-#    cnProc/rLDPC_cnProc_BG2_R23_AVX2.h)
+set(cnProc_headers
+    cnProc/nrLDPC_cnProc_BG1_R13_AVX2.h
+    cnProc/nrLDPC_cnProc_BG1_R23_AVX2.h
+    cnProc/nrLDPC_cnProc_BG1_R89_AVX2.h
+    cnProc/nrLDPC_cnProc_BG2_R13_AVX2.h
+    cnProc/nrLDPC_cnProc_BG2_R15_AVX2.h
+    cnProc/nrLDPC_cnProc_BG2_R23_AVX2.h)
 
-add_custom_command(TARGET cnProc_gen_avx2 POST_BUILD
-  #OUTPUT ${cnProc_headers}
+set(cnProc128_headers
+    cnProc/nrLDPC_cnProc_BG1_R13_128.h
+    cnProc/nrLDPC_cnProc_BG1_R23_128.h
+    cnProc/nrLDPC_cnProc_BG1_R89_128.h
+    cnProc/nrLDPC_cnProc_BG2_R13_128.h
+    cnProc/nrLDPC_cnProc_BG2_R15_128.h
+    cnProc/nrLDPC_cnProc_BG2_R23_128.h)
+
+add_custom_command(
+  # TARGET cnProc_gen_avx2 POST_BUILD
+  OUTPUT ${cnProc_headers}
   COMMAND ${CMAKE_COMMAND} -E make_directory cnProc
   COMMAND cnProc_gen_avx2 .
   DEPENDS cnProc_gen_avx2
   COMMENT "Generating LDPC cnProc header files for AVX2"
 )
+add_custom_target(cnProc_gen_avx2_files DEPENDS ${cnProc_headers})
 
-add_custom_command(TARGET cnProc_gen_128 POST_BUILD
-  #OUTPUT ${cnProc_headers}
+add_custom_command(
+  # TARGET cnProc_gen_128 POST_BUILD
+  OUTPUT ${cnProc128_headers}
   COMMAND ${CMAKE_COMMAND} -E make_directory cnProc128
   COMMAND cnProc_gen_128 .
   DEPENDS cnProc_gen_128
   COMMENT "Generating LDPC cnProc header files for 128-bit SIMD"
 )
+add_custom_target(cnProc_gen_128_files DEPENDS ${cnProc128_headers})
+
 add_library(cnProc_gen_avx2_HEADERS INTERFACE)
 target_include_directories(cnProc_gen_avx2_HEADERS INTERFACE ${CMAKE_CURRENT_BINARY_DIR})
-add_dependencies(cnProc_gen_avx2_HEADERS cnProc_gen_avx2)
+add_dependencies(cnProc_gen_avx2_HEADERS cnProc_gen_avx2_files)
 
 add_library(cnProc_gen_128_HEADERS INTERFACE)
 target_include_directories(cnProc_gen_128_HEADERS INTERFACE ${CMAKE_CURRENT_BINARY_DIR})
-add_dependencies(cnProc_gen_128_HEADERS cnProc_gen_128)
+add_dependencies(cnProc_gen_128_HEADERS cnProc_gen_128_files)
+
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/CMakeLists.txt b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/CMakeLists.txt
index f6da998c851ed9e642206599d03dc4ab26c9a6b6..e78d0ee007e38972128c1eba7d44ef182710c3ad 100644
--- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/CMakeLists.txt
+++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/CMakeLists.txt
@@ -1,25 +1,33 @@
-add_executable(cnProc_gen_avx512
-               cnProc_gen_BG1_avx512.c
-               cnProc_gen_BG2_avx512.c
-               main.c)
-target_compile_options(cnProc_gen_avx512 PRIVATE -W -Wall )
+if (CROSS_COMPILE)
+  find_package(cnProc_gen_avx512)
+else()
+  add_executable(cnProc_gen_avx512
+                 cnProc_gen_BG1_avx512.c
+                 cnProc_gen_BG2_avx512.c
+                 main.c)
+  target_compile_options(cnProc_gen_avx512 PRIVATE -W -Wall )
+  export(TARGETS cnProc_gen_avx512 FILE
+          "${CMAKE_BINARY_DIR}/cnProc_gen_avx512Config.cmake")
+endif()
 
-#set(cnProc_avx512_headers
-#    cnProc_avx512/nrLDPC_cnProc_BG1_R13_AVX512.h
-#    cnProc_avx512/nrLDPC_cnProc_BG1_R23_AVX512.h
-#    cnProc_avx512/nrLDPC_cnProc_BG1_R89_AVX512.h
-#    cnProc_avx512/nrLDPC_cnProc_BG2_R13_AVX512.h
-#    cnProc_avx512/nrLDPC_cnProc_BG2_R15_AVX512.h
-#    cnProc_avx512/nrLDPC_cnProc_BG2_R23_AVX512.h)
+set(cnProc_avx512_headers
+    cnProc_avx512/nrLDPC_cnProc_BG1_R13_AVX512.h
+    cnProc_avx512/nrLDPC_cnProc_BG1_R23_AVX512.h
+    cnProc_avx512/nrLDPC_cnProc_BG1_R89_AVX512.h
+    cnProc_avx512/nrLDPC_cnProc_BG2_R13_AVX512.h
+    cnProc_avx512/nrLDPC_cnProc_BG2_R15_AVX512.h
+    cnProc_avx512/nrLDPC_cnProc_BG2_R23_AVX512.h)
 
-add_custom_command(TARGET cnProc_gen_avx512 POST_BUILD
-  #OUTPUT ${cnProc_avx512_headers}
+add_custom_command(
+  # TARGET cnProc_gen_avx512 POST_BUILD
+  OUTPUT ${cnProc_avx512_headers}
   COMMAND ${CMAKE_COMMAND} -E make_directory cnProc_avx512
   COMMAND cnProc_gen_avx512 .
   DEPENDS cnProc_gen_avx512
   COMMENT "Generating LDPC cnProc header files for AVX512"
 )
-
+add_custom_target(cnProc_gen_avx512_files DEPENDS ${cnProc_avx512_headers})
 add_library(cnProc_gen_avx512_HEADERS INTERFACE)
 target_include_directories(cnProc_gen_avx512_HEADERS INTERFACE ${CMAKE_CURRENT_BINARY_DIR})
-add_dependencies(cnProc_gen_avx512_HEADERS cnProc_gen_avx512)
+add_dependencies(cnProc_gen_avx512_HEADERS cnProc_gen_avx512_files)
+