blob: d3bd220afae4c6b8609754c3d89ea1db3a3a6c6d [file] [log] [blame]
Imre Kisdd154112021-10-08 11:21:14 +02001#-------------------------------------------------------------------------------
2# Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
3#
4# SPDX-License-Identifier: BSD-3-Clause
5#
6#-------------------------------------------------------------------------------
7
8# Determine the number of processes to run while running parallel builds.
9# Pass -DPROCESSOR_COUNT=<n> to cmake to override.
10if(NOT DEFINED PROCESSOR_COUNT)
11 include(ProcessorCount)
12 ProcessorCount(PROCESSOR_COUNT)
13 set(PROCESSOR_COUNT ${PROCESSOR_COUNT} CACHE STRING "Number of cores to use for parallel builds.")
14endif()
15
16set(NEWLIB_URL "https://sourceware.org/git/newlib-cygwin.git" CACHE STRING "newlib repository URL")
17set(NEWLIB_REFSPEC "newlib-4.1.0" CACHE STRING "newlib git refspec")
18set(NEWLIB_INSTALL_PATH "${CMAKE_CURRENT_BINARY_DIR}/newlib_install" CACHE PATH "newlib installation directory")
19
20include(FetchContent)
21
22# Checking git
23find_program(GIT_COMMAND "git")
24if (NOT GIT_COMMAND)
25 message(FATAL_ERROR "Please install git")
26endif()
27
28# Fetching newlib
29FetchContent_Declare(
30 newlib
31 GIT_REPOSITORY ${NEWLIB_URL}
32 GIT_TAG ${NEWLIB_REFSPEC}
33 GIT_SHALLOW TRUE
34 PATCH_COMMAND git stash
35 COMMAND git am ${CMAKE_CURRENT_LIST_DIR}/0001-Allow-aarch64-linux-gcc-to-compile-bare-metal-lib.patch
36 COMMAND git reset HEAD~1
37)
38
39# FetchContent_GetProperties exports newlib_SOURCE_DIR and newlib_BINARY_DIR variables
40FetchContent_GetProperties(newlib)
41if(NOT newlib_POPULATED)
42 message(STATUS "Fetching newlib")
43 FetchContent_Populate(newlib)
44endif()
45
46# Extracing compiler prefix without the trailing hyphen from the C compiler name
47get_filename_component(COMPILER_PATH ${CMAKE_C_COMPILER} DIRECTORY)
48get_filename_component(COMPILER_NAME ${CMAKE_C_COMPILER} NAME)
49string(REGEX REPLACE "([^-]+-[^-]+-[^-]+).*" "\\1" COMPILER_PREFIX ${COMPILER_NAME})
50
51# Newlib configure step
52# CC env var must be unset otherwise configure will assume the cross compiler is the host compiler
53# The configure options are set to minimize code size and memory usage.
54execute_process(COMMAND
55 ${CMAKE_COMMAND} -E env --unset=CC PATH=${COMPILER_PATH}:$ENV{PATH} ./configure
56 --target=${COMPILER_PREFIX}
57 --prefix=${NEWLIB_INSTALL_PATH}
58 --enable-newlib-nano-formatted-io
59 --enable-newlib-nano-malloc
60 --enable-lite-exit
61 --enable-newlib-reent-small
62 --enable-newlib-global-atexit
63 --disable-multilib
64 CFLAGS_FOR_TARGET=-fpic
65 LDFLAGS_FOR_TARGET=-fpie
66 WORKING_DIRECTORY
67 ${newlib_SOURCE_DIR}
68 RESULT_VARIABLE _newlib_error
69)
70
71if (_newlib_error)
72 message(FATAL_ERROR "Configuration step of newlib failed with ${_newlib_error}.")
73endif()
74
75# Newlib build step
76execute_process(COMMAND
77 ${CMAKE_COMMAND} -E env --unset=CC PATH=${COMPILER_PATH}:$ENV{PATH} make -j${PROCESSOR_COUNT}
78 WORKING_DIRECTORY
79 ${newlib_SOURCE_DIR}
80 RESULT_VARIABLE _newlib_error
81)
82
83if (_newlib_error)
84 message(FATAL_ERROR "Build step of newlib failed with ${_newlib_error}.")
85endif()
86
87# Newlib install step
88execute_process(COMMAND
89 ${CMAKE_COMMAND} -E env --unset=CC PATH=${COMPILER_PATH}:$ENV{PATH} make install
90 WORKING_DIRECTORY
91 ${newlib_SOURCE_DIR}
92 RESULT_VARIABLE _newlib_error
93)
94
95if (_newlib_error)
96 message(FATAL_ERROR "Install step of newlib failed with ${_newlib_error}.")
97endif()
98
99# libc
100add_library(c STATIC IMPORTED)
101set_property(TARGET c PROPERTY IMPORTED_LOCATION "${NEWLIB_INSTALL_PATH}/${COMPILER_PREFIX}/lib/libc.a")
102set_property(TARGET c PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${NEWLIB_INSTALL_PATH}/${COMPILER_PREFIX}/include")
103
104# libnosys
105add_library(nosys STATIC IMPORTED)
106set_property(TARGET nosys PROPERTY IMPORTED_LOCATION "${NEWLIB_INSTALL_PATH}/${COMPILER_PREFIX}/lib/libnosys.a")
107set_property(TARGET nosys PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${NEWLIB_INSTALL_PATH}/${COMPILER_PREFIX}/include")