Browse Source

Merge topic 'adsp-platform-and-compilers'

87142bbd5f ADSP: Add dedicated platform module
e9eabb0dcd ADSP: Configure compiler in compiler module
88b38f531a ADSP: Support both VDSP++ and CCES for ADSP compilers

Acked-by: Kitware Robot <[email protected]>
Merge-request: !7123
Brad King 3 years ago
parent
commit
c508935dad

+ 8 - 0
Help/envvar/ADSP_ROOT.rst

@@ -0,0 +1,8 @@
+ADSP_ROOT
+---------
+
+.. include:: ENV_VAR.txt
+
+The ``ADSP_ROOT`` environment variable specifies a default value
+for the :variable:`CMAKE_ADSP_ROOT` variable when there is no explicit
+configuration given on the first run while creating a new build tree.

+ 1 - 0
Help/manual/cmake-env-variables.7.rst

@@ -28,6 +28,7 @@ Environment Variables that Control the Build
 .. toctree::
 .. toctree::
    :maxdepth: 1
    :maxdepth: 1
 
 
+   /envvar/ADSP_ROOT
    /envvar/CMAKE_APPLE_SILICON_PROCESSOR
    /envvar/CMAKE_APPLE_SILICON_PROCESSOR
    /envvar/CMAKE_BUILD_PARALLEL_LEVEL
    /envvar/CMAKE_BUILD_PARALLEL_LEVEL
    /envvar/CMAKE_BUILD_TYPE
    /envvar/CMAKE_BUILD_TYPE

+ 22 - 0
Help/manual/cmake-toolchains.7.rst

@@ -301,6 +301,28 @@ Windows Store may look like this:
   set(CMAKE_SYSTEM_NAME WindowsStore)
   set(CMAKE_SYSTEM_NAME WindowsStore)
   set(CMAKE_SYSTEM_VERSION 8.1)
   set(CMAKE_SYSTEM_VERSION 8.1)
 
 
+.. _`Cross Compiling for ADSP SHARC/Blackfin`:
+
+Cross Compiling for ADSP SHARC/Blackfin
+---------------------------------------
+
+Cross-compiling for ADSP SHARC or Blackfin can be configured
+by setting the :variable:`CMAKE_SYSTEM_NAME` variable to ``ADSP``
+and the :variable:`CMAKE_SYSTEM_PROCESSOR` variable
+to the "part number", excluding the ``ADSP-`` prefix,
+for example, ``21594``, ``SC589``, etc.
+This value is case insensitive.
+
+CMake will automatically search for CCES or VDSP++ installs
+in their default install locations
+and select the most recent version found.
+CCES will be selected over VDSP++ if both are installed.
+Custom install paths can be set via the :variable:`CMAKE_ADSP_ROOT` variable
+or the :envvar:`ADSP_ROOT` environment variable.
+
+The compiler (``cc21k`` vs. ``ccblkfn``) is selected automatically
+based on the :variable:`CMAKE_SYSTEM_PROCESSOR` value provided.
+
 .. _`Cross Compiling for Android`:
 .. _`Cross Compiling for Android`:
 
 
 Cross Compiling for Android
 Cross Compiling for Android

+ 1 - 0
Help/manual/cmake-variables.7.rst

@@ -347,6 +347,7 @@ Variables that Control the Build
 .. toctree::
 .. toctree::
    :maxdepth: 1
    :maxdepth: 1
 
 
+   /variable/CMAKE_ADSP_ROOT
    /variable/CMAKE_AIX_EXPORT_ALL_SYMBOLS
    /variable/CMAKE_AIX_EXPORT_ALL_SYMBOLS
    /variable/CMAKE_ANDROID_ANT_ADDITIONAL_OPTIONS
    /variable/CMAKE_ANDROID_ANT_ADDITIONAL_OPTIONS
    /variable/CMAKE_ANDROID_API
    /variable/CMAKE_ANDROID_API

+ 13 - 0
Help/release/dev/adsp-platform-and-compilers.rst

@@ -0,0 +1,13 @@
+adsp-platform-and-compilers
+---------------------------
+
+* The ADSP compiler (SHARC and Blackfin) now supports
+  both CCES and VDSP++ installations,
+  with required configuration now done in the compiler module itself
+  rather than the Generic-ADSP platform module.
+
+* A dedicated ``ADSP`` platform has been added
+  to replace the existing ``Generic-ADSP`` implementation.
+  This features automatic detection of the latest CCES/VDSP++ install
+  and compiler selection (``cc21k`` vs. ``ccblkfn``)
+  based off of the :variable:`CMAKE_SYSTEM_PROCESSOR` variable.

+ 9 - 0
Help/variable/CMAKE_ADSP_ROOT.rst

@@ -0,0 +1,9 @@
+CMAKE_ADSP_ROOT
+---------------
+
+When :ref:`Cross Compiling for ADSP SHARC/Blackfin`,
+this variable holds the absolute path to the latest CCES or VDSP++ install.
+The directory is expected to contain the ``cc21k.exe`` and ``ccblkfn.exe`` compilers.
+This will be set automatically if a default install of CCES or VDSP++ can be found.
+
+See also the :envvar:`ADSP_ROOT` environment variable.

+ 10 - 1
Modules/CMakeDetermineCompilerId.cmake

@@ -841,15 +841,24 @@ function(CMAKE_DETERMINE_COMPILER_ID_CHECK lang file)
     set(ARCHITECTURE_ID)
     set(ARCHITECTURE_ID)
     set(SIMULATE_ID)
     set(SIMULATE_ID)
     set(SIMULATE_VERSION)
     set(SIMULATE_VERSION)
+    set(CMAKE_${lang}_COMPILER_ID_STRING_REGEX ".?I.?N.?F.?O.?:.?[A-Za-z0-9_]+\\[[^]]*\\]")
     foreach(encoding "" "ENCODING;UTF-16LE" "ENCODING;UTF-16BE")
     foreach(encoding "" "ENCODING;UTF-16LE" "ENCODING;UTF-16BE")
       file(STRINGS "${file}" CMAKE_${lang}_COMPILER_ID_STRINGS
       file(STRINGS "${file}" CMAKE_${lang}_COMPILER_ID_STRINGS
         LIMIT_COUNT 38 ${encoding}
         LIMIT_COUNT 38 ${encoding}
-        REGEX ".?I.?N.?F.?O.?:.?[A-Za-z0-9_]+\\[[^]]*\\]")
+        REGEX "${CMAKE_${lang}_COMPILER_ID_STRING_REGEX}")
       if(NOT CMAKE_${lang}_COMPILER_ID_STRINGS STREQUAL "")
       if(NOT CMAKE_${lang}_COMPILER_ID_STRINGS STREQUAL "")
         break()
         break()
       endif()
       endif()
     endforeach()
     endforeach()
 
 
+    # Some ADSP processors result in characters being detected as separate strings
+    if(CMAKE_${lang}_COMPILER_ID_STRINGS STREQUAL "")
+      file(STRINGS "${file}" CMAKE_${lang}_COMPILER_ID_STRINGS LENGTH_MAXIMUM 1)
+      string(REGEX REPLACE ";" "" CMAKE_${lang}_COMPILER_ID_STRING "${CMAKE_${lang}_COMPILER_ID_STRINGS}")
+      string(REGEX MATCHALL "${CMAKE_${lang}_COMPILER_ID_STRING_REGEX}"
+        CMAKE_${lang}_COMPILER_ID_STRINGS "${CMAKE_${lang}_COMPILER_ID_STRING}")
+    endif()
+
     # With the IAR Compiler, some strings are found twice, first time as incomplete
     # With the IAR Compiler, some strings are found twice, first time as incomplete
     # list like "?<Constant "INFO:compiler[IAR]">".  Remove the incomplete copies.
     # list like "?<Constant "INFO:compiler[IAR]">".  Remove the incomplete copies.
     list(FILTER CMAKE_${lang}_COMPILER_ID_STRINGS EXCLUDE REGEX "\\?<Constant \\\"")
     list(FILTER CMAKE_${lang}_COMPILER_ID_STRINGS EXCLUDE REGEX "\\?<Constant \\\"")

+ 9 - 0
Modules/CMakePlatformId.h.in

@@ -105,6 +105,9 @@
 #  define PLATFORM_ID "Integrity"
 #  define PLATFORM_ID "Integrity"
 # endif
 # endif
 
 
+# elif defined(_ADI_COMPILER)
+#  define PLATFORM_ID "ADSP"
+
 #else /* unknown platform */
 #else /* unknown platform */
 # define PLATFORM_ID
 # define PLATFORM_ID
 
 
@@ -233,6 +236,12 @@
 #  define ARCHITECTURE_ID ""
 #  define ARCHITECTURE_ID ""
 # endif
 # endif
 
 
+# elif defined(__ADSPSHARC__)
+#  define ARCHITECTURE_ID "SHARC"
+
+# elif defined(__ADSPBLACKFIN__)
+#  define ARCHITECTURE_ID "Blackfin"
+
 #else
 #else
 #  define ARCHITECTURE_ID
 #  define ARCHITECTURE_ID
 #endif
 #endif

+ 11 - 0
Modules/Compiler/ADSP-C.cmake

@@ -0,0 +1,11 @@
+include(Compiler/CMakeCommonCompilerMacros)
+include(Compiler/ADSP)
+
+__compiler_adsp(C)
+
+set(CMAKE_C90_STANDARD_COMPILE_OPTION -c89)
+set(CMAKE_C90_STANDARD__HAS_FULL_SUPPORT ON)
+
+set(CMAKE_C99_STANDARD__HAS_FULL_SUPPORT ON)
+
+__compiler_check_default_language_standard(C 8.0.0.0 99)

+ 16 - 0
Modules/Compiler/ADSP-CXX.cmake

@@ -0,0 +1,16 @@
+include(Compiler/CMakeCommonCompilerMacros)
+include(Compiler/ADSP)
+
+__compiler_adsp(CXX)
+
+set(CMAKE_CXX98_STANDARD_COMPILE_OPTION -c++)
+set(CMAKE_CXX98_EXTENSION_COMPILE_OPTION -g++)
+set(CMAKE_CXX98_STANDARD__HAS_FULL_SUPPORT ON)
+
+if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 8.3.0.0)
+  set(CMAKE_CXX11_STANDARD_COMPILE_OPTION -c++11)
+  set(CMAKE_CXX11_EXTENSION_COMPILE_OPTION -c++11 -g++)
+  set(CMAKE_CXX11_STANDARD__HAS_FULL_SUPPORT ON)
+endif()
+
+__compiler_check_default_language_standard(CXX 8.0.0.0 98)

+ 7 - 6
Modules/Compiler/ADSP-DetermineCompiler.cmake

@@ -1,10 +1,11 @@
 
 
-set(_compiler_id_pp_test "defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__)")
+set(_compiler_id_pp_test "defined(_ADI_COMPILER)")
 
 
 set(_compiler_id_version_compute "
 set(_compiler_id_version_compute "
-#if defined(__VISUALDSPVERSION__)
-  /* __VISUALDSPVERSION__ = 0xVVRRPP00 */
-# define @PREFIX@COMPILER_VERSION_MAJOR @MACRO_HEX@(__VISUALDSPVERSION__>>24)
-# define @PREFIX@COMPILER_VERSION_MINOR @MACRO_HEX@(__VISUALDSPVERSION__>>16 & 0xFF)
-# define @PREFIX@COMPILER_VERSION_PATCH @MACRO_HEX@(__VISUALDSPVERSION__>>8  & 0xFF)
+#if defined(__VERSIONNUM__)
+  /* __VERSIONNUM__ = 0xVVRRPPTT */
+#  define @PREFIX@COMPILER_VERSION_MAJOR @MACRO_DEC@(__VERSIONNUM__ >> 24 & 0xFF)
+#  define @PREFIX@COMPILER_VERSION_MINOR @MACRO_DEC@(__VERSIONNUM__ >> 16 & 0xFF)
+#  define @PREFIX@COMPILER_VERSION_PATCH @MACRO_DEC@(__VERSIONNUM__ >> 8 & 0xFF)
+#  define @PREFIX@COMPILER_VERSION_TWEAK @MACRO_DEC@(__VERSIONNUM__ & 0xFF)
 #endif")
 #endif")

+ 26 - 0
Modules/Compiler/ADSP.cmake

@@ -0,0 +1,26 @@
+include_guard()
+
+set(CMAKE_EXECUTABLE_SUFFIX ".dxe")
+
+macro(__compiler_adsp lang)
+  set(CMAKE_${lang}_OUTPUT_EXTENSION ".doj")
+
+  set(CMAKE_${lang}_LINKER_WRAPPER_FLAG "-flags-link" " ")
+  set(CMAKE_${lang}_LINKER_WRAPPER_FLAG_SEP ",")
+
+  set(_CMAKE_${lang}_ADSP_FLAGS "-proc=${CMAKE_ADSP_PROCESSOR}")
+
+  set(CMAKE_${lang}_COMPILE_OBJECT
+    "<CMAKE_${lang}_COMPILER> ${_CMAKE_${lang}_ADSP_FLAGS} <DEFINES> <INCLUDES> <FLAGS> -o <OBJECT> -c <SOURCE>")
+
+  set(CMAKE_${lang}_CREATE_STATIC_LIBRARY
+    "<CMAKE_${lang}_COMPILER> ${_CMAKE_${lang}_ADSP_FLAGS} -build-lib -o <TARGET> <CMAKE_${lang}_LINK_FLAGS> <OBJECTS>")
+
+  set(CMAKE_${lang}_LINK_EXECUTABLE
+    "<CMAKE_${lang}_COMPILER> ${_CMAKE_${lang}_ADSP_FLAGS} <FLAGS> <CMAKE_${lang}_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
+
+  unset(_CMAKE_${lang}_ADSP_FLAGS)
+
+  set(CMAKE_${lang}_CREATE_SHARED_LIBRARY)
+  set(CMAKE_${lang}_CREATE_MODULE_LIBRARY)
+endmacro()

+ 2 - 0
Modules/Platform/ADSP-C.cmake

@@ -0,0 +1,2 @@
+include(Platform/ADSP-Common)
+__platform_adsp(C)

+ 2 - 0
Modules/Platform/ADSP-CXX.cmake

@@ -0,0 +1,2 @@
+include(Platform/ADSP-Common)
+__platform_adsp(CXX)

+ 36 - 0
Modules/Platform/ADSP-Common.cmake

@@ -0,0 +1,36 @@
+include_guard()
+
+macro(__platform_adsp_init)
+  if(NOT CMAKE_ADSP_PLATFORM_INITIALIZED)
+    if(NOT CMAKE_SYSTEM_PROCESSOR)
+      message(FATAL_ERROR "ADSP: CMAKE_SYSTEM_PROCESSOR is required but not set")
+    endif()
+
+    set(CMAKE_ADSP_PROCESSOR "ADSP-${CMAKE_SYSTEM_PROCESSOR}")
+    string(TOUPPER "${CMAKE_ADSP_PROCESSOR}" CMAKE_ADSP_PROCESSOR)
+
+    set(CMAKE_ADSP_COMPILER_NAME cc21k.exe)
+    if(CMAKE_ADSP_PROCESSOR MATCHES "^ADSP-BF")
+      set(CMAKE_ADSP_COMPILER_NAME ccblkfn.exe)
+    endif()
+
+    set(CMAKE_ADSP_PLATFORM_INITIALIZED TRUE)
+  endif()
+endmacro()
+
+macro(__platform_adsp lang)
+  __platform_adsp_init()
+  set(CMAKE_${lang}_COMPILER "${CMAKE_ADSP_ROOT}/${CMAKE_ADSP_COMPILER_NAME}")
+
+  execute_process(
+    COMMAND "${CMAKE_${lang}_COMPILER}" "-proc=${CMAKE_ADSP_PROCESSOR}" "-version"
+    OUTPUT_QUIET ERROR_QUIET
+    RESULT_VARIABLE _adsp_is_valid_proc
+  )
+  if(NOT _adsp_is_valid_proc EQUAL 0)
+    message(FATAL_ERROR
+      "ADSP: unsupported processor '${CMAKE_ADSP_PROCESSOR}' for CMAKE_${lang}_COMPILER:\n"
+      "  ${CMAKE_${lang}_COMPILER}"
+    )
+  endif()
+endmacro()

+ 26 - 0
Modules/Platform/ADSP-Determine.cmake

@@ -0,0 +1,26 @@
+if(IS_DIRECTORY "$ENV{ADSP_ROOT}")
+    file(TO_CMAKE_PATH "$ENV{ADSP_ROOT}" CMAKE_ADSP_ROOT)
+endif()
+
+macro(_find_adsp_root path_pattern)
+  set(CMAKE_ADSP_ROOT "")
+  set(_adsp_root_version "0")
+  file(GLOB _adsp_root_paths "${path_pattern}")
+  foreach(_current_adsp_root_path IN LISTS _adsp_root_paths)
+    string(REGEX MATCH "([0-9\\.]+)/?$" _current_adsp_root_version "${_current_adsp_root_path}")
+    if(_current_adsp_root_version VERSION_GREATER _adsp_root_version)
+      set(CMAKE_ADSP_ROOT "${_current_adsp_root_path}")
+      set(_adsp_root_version "${_current_adsp_root_version}")
+    endif()
+  endforeach()
+endmacro()
+
+if(NOT CMAKE_ADSP_ROOT)
+  _find_adsp_root("C:/Analog Devices/CrossCore Embedded Studio *")
+endif()
+if(NOT CMAKE_ADSP_ROOT)
+  _find_adsp_root("C:/Program Files (x86)/Analog Devices/VisualDSP *")
+endif()
+if(NOT IS_DIRECTORY "${CMAKE_ADSP_ROOT}")
+  message(FATAL_ERROR "ADSP: could not find CCES/VDSP++ install directory ${CMAKE_ADSP_ROOT}")
+endif()

+ 4 - 0
Modules/Platform/ADSP.cmake

@@ -0,0 +1,4 @@
+include(Platform/ADSP-Common)
+__platform_adsp_init()
+
+set_property(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS FALSE)