mirror of
https://github.com/jerryscript-project/jerryscript.git
synced 2025-12-15 16:29:21 +00:00
Although both jerry-libc and jerry-libm have configuration options that enable/disable their build, in practice, only jerry-libc can be replaced with the system (compiler-default) libc. If jerry-libm is disabled, the build of jerry-main fails, as there is no way to instruct the linker to link the system libm to the binary. (The build system does have a way to pass flags to the linker, but those flags are listed before the linked objects. For the references to get resolved correctly, the libraries to be linked have to be specified _after_ the objects.) This patch adds the EXTERNAL_LINK_LIBS configuration option to CMakeLists, which ensures that the specified libraries get correctly passed to the linker. (E.g, replacing jerry-libm with system libm becomes possible with `JERRY_LIBM=OFF EXTERNAL_LINK_LIBS='-lm'`.) Additionally, the patch also makes the following related changes: * Removes the COMPILER_DEFAULT_LIBC configuration option, as it is (almost) always the opposite of JERRY_LIBC. Moreover, its name is misleading: its only role is to add `-nostdlib` to the linker flags. * Makes use of transitive library dependencies: if a library has another library as dependency, and it is linked to a binary, its dependency is linked as well. Thus, jerry-libc, jerry-libm, and any external libraries are added to jerry-core as dependency, and then only jerry-core is linked to executables (cmake will take care of the rest). * build.py and run-tests.py follow up the changes, along with some minor syntax changes. * Moves static linking option to global CMakeLists, as unit test binaries should be linked the same way as jerry-main. * Adds EXTERNAL_COMPILER_FLAGS and EXTERNAL_LINKER_FLAGS as last to the flag list, to allow user override of (nearly) anything. The patch speculatively follows up the build system changes in the mbed, riot-stm32f4, and zephyr targets. JerryScript-DCO-1.0-Signed-off-by: Akos Kiss akiss@inf.u-szeged.hu
230 lines
7.1 KiB
CMake
230 lines
7.1 KiB
CMake
# Copyright 2015-2016 Samsung Electronics Co., Ltd.
|
|
# Copyright 2016 University of Szeged.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
cmake_minimum_required (VERSION 2.8.12)
|
|
project (Jerry C ASM)
|
|
|
|
# Determining platform
|
|
set(PLATFORM "${CMAKE_SYSTEM_NAME}")
|
|
string(TOUPPER "${PLATFORM}" PLATFORM)
|
|
|
|
# Remove rdynamic option
|
|
set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS )
|
|
|
|
# Components
|
|
set(JERRY_LIBC ON CACHE BOOL "Build and use jerry-libc?")
|
|
set(JERRY_LIBM ON CACHE BOOL "Build and use jerry-libm?")
|
|
set(JERRY_CMDLINE ON CACHE BOOL "Build jerry command line tool?")
|
|
set(UNITTESTS OFF CACHE BOOL "Build unit tests?")
|
|
|
|
# Optional build settings
|
|
set(PORT_DIR "${CMAKE_SOURCE_DIR}/targets/default" CACHE STRING "Use default or external port?")
|
|
set(ENABLE_LTO OFF CACHE BOOL "Enable LTO build?")
|
|
set(ENABLE_ALL_IN_ONE ON CACHE BOOL "Enable all-in-one build?")
|
|
set(ENABLE_STRIP ON CACHE BOOL "Enable stripping all symbols from release binary?")
|
|
set(ENABLE_STATIC_LINK ON CACHE BOOL "Enable static linking?")
|
|
|
|
if(NOT CMAKE_BUILD_TYPE)
|
|
set(CMAKE_BUILD_TYPE "Release")
|
|
endif()
|
|
|
|
if("${PLATFORM}" STREQUAL "DARWIN")
|
|
set(ENABLE_LTO "OFF")
|
|
set(ENABLE_ALL_IN_ONE "ON")
|
|
set(JERRY_LIBC "OFF")
|
|
set(JERRY_LIBM "OFF")
|
|
set(ENABLE_STATIC_LINK "OFF")
|
|
endif()
|
|
|
|
# Status messages
|
|
message(STATUS "CMAKE_SYSTEM_NAME " ${CMAKE_SYSTEM_NAME})
|
|
message(STATUS "CMAKE_SYSTEM_PROCESSOR " ${CMAKE_SYSTEM_PROCESSOR})
|
|
message(STATUS "CMAKE_BUILD_TYPE " ${CMAKE_BUILD_TYPE})
|
|
message(STATUS "JERRY_LIBC " ${JERRY_LIBC})
|
|
message(STATUS "JERRY_LIBM " ${JERRY_LIBM})
|
|
message(STATUS "JERRY_CMDLINE " ${JERRY_CMDLINE})
|
|
message(STATUS "UNITTESTS " ${UNITTESTS})
|
|
message(STATUS "PORT_DIR " ${PORT_DIR})
|
|
message(STATUS "ENABLE_LTO " ${ENABLE_LTO})
|
|
message(STATUS "ENABLE_ALL_IN_ONE " ${ENABLE_ALL_IN_ONE})
|
|
message(STATUS "ENABLE_STRIP " ${ENABLE_STRIP})
|
|
message(STATUS "ENABLE_STATIC_LINK " ${ENABLE_STATIC_LINK})
|
|
|
|
# Setup directories
|
|
# Project binary dir
|
|
set(PROJECT_BINARY_DIR "${CMAKE_BINARY_DIR}")
|
|
|
|
# Library output directory
|
|
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib/")
|
|
|
|
# Executable output directory
|
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin/")
|
|
|
|
# Archive targets output Directory
|
|
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib/")
|
|
|
|
# Compile/link flags
|
|
# Helper macros
|
|
macro(jerry_add_flags VAR)
|
|
foreach(_flag ${ARGN})
|
|
set(${VAR} "${${VAR}} ${_flag}")
|
|
endforeach()
|
|
endmacro()
|
|
|
|
macro(jerry_add_compile_flags)
|
|
jerry_add_flags(CMAKE_C_FLAGS ${ARGV})
|
|
endmacro()
|
|
|
|
macro(jerry_add_compile_warnings)
|
|
foreach(_warning ${ARGV})
|
|
jerry_add_compile_flags(-W${_warning})
|
|
if(CMAKE_COMPILER_IS_GNUCC)
|
|
jerry_add_compile_flags(-Werror=${_warning})
|
|
endif()
|
|
endforeach()
|
|
endmacro()
|
|
|
|
macro(jerry_add_link_flags)
|
|
jerry_add_flags(LINKER_FLAGS_COMMON ${ARGV})
|
|
endmacro()
|
|
|
|
# build mode specific compile/link flags
|
|
set(CMAKE_C_FLAGS_RELEASE "-Os")
|
|
|
|
# Architecture-specific compile/link flags
|
|
jerry_add_compile_flags(${FLAGS_COMMON_ARCH})
|
|
jerry_add_flags(CMAKE_EXE_LINKER_FLAGS ${FLAGS_COMMON_ARCH})
|
|
|
|
# Enable static build
|
|
if(ENABLE_STATIC_LINK)
|
|
jerry_add_link_flags("-static")
|
|
endif()
|
|
|
|
# LTO
|
|
if(ENABLE_LTO)
|
|
jerry_add_compile_flags(-flto)
|
|
jerry_add_link_flags(-flto)
|
|
if(CMAKE_COMPILER_IS_GNUCC)
|
|
if(NOT "${PLATFORM}" STREQUAL "DARWIN")
|
|
jerry_add_compile_flags(-fno-fat-lto-objects)
|
|
endif()
|
|
# Use gcc-ar and gcc-ranlib to support LTO
|
|
set(CMAKE_AR "gcc-ar")
|
|
set(CMAKE_RANLIB "gcc-ranlib")
|
|
endif()
|
|
endif()
|
|
|
|
# Define _BSD_SOURCE if we use default port and compiler default libc
|
|
if(${PORT_DIR} STREQUAL "${CMAKE_SOURCE_DIR}/targets/default" AND NOT JERRY_LIBC)
|
|
set(DEFINES_JERRY ${DEFINES_JERRY} _BSD_SOURCE)
|
|
endif()
|
|
|
|
# Imported targets prefix
|
|
set(PREFIX_IMPORTED_LIB imported_)
|
|
|
|
# Imported libraries
|
|
if(("${PLATFORM}" STREQUAL "DARWIN") AND (NOT CMAKE_COMPILER_IS_GNUCC))
|
|
# libclang_rt.osx
|
|
set(IMPORTED_LIB "${PREFIX_IMPORTED_LIB}libclang_rt.osx")
|
|
add_library(${IMPORTED_LIB} STATIC IMPORTED)
|
|
execute_process(COMMAND ${CMAKE_C_COMPILER} ${FLAGS_COMMON_ARCH} -print-file-name=
|
|
OUTPUT_VARIABLE IMPORTED_LIBCLANG_RT_LOCATION
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
set(IMPORTED_LIBCLANG_RT_LOCATION "${IMPORTED_LIBCLANG_RT_LOCATION}/lib/darwin/libclang_rt.osx.a")
|
|
set_property(TARGET ${IMPORTED_LIB}
|
|
PROPERTY IMPORTED_LOCATION ${IMPORTED_LIBCLANG_RT_LOCATION})
|
|
else()
|
|
# libgcc
|
|
set(IMPORTED_LIB "${PREFIX_IMPORTED_LIB}libgcc")
|
|
add_library(${IMPORTED_LIB} STATIC IMPORTED)
|
|
execute_process(COMMAND ${CMAKE_C_COMPILER} ${FLAGS_COMMON_ARCH} -print-file-name=libgcc.a
|
|
OUTPUT_VARIABLE IMPORTED_LIBGCC_LOCATION
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
set_property(TARGET ${IMPORTED_LIB}
|
|
PROPERTY IMPORTED_LOCATION ${IMPORTED_LIBGCC_LOCATION})
|
|
endif()
|
|
|
|
# Compiler / Linker flags
|
|
jerry_add_compile_flags(-fno-builtin)
|
|
if(("${PLATFORM}" STREQUAL "DARWIN"))
|
|
jerry_add_link_flags(-lSystem)
|
|
else()
|
|
jerry_add_link_flags(-Wl,-z,noexecstack)
|
|
endif()
|
|
|
|
# Turn off linking to compiler's default libc, in case jerry-libc is used
|
|
if(JERRY_LIBC)
|
|
jerry_add_link_flags(-nostdlib)
|
|
endif()
|
|
|
|
# Turn off stack protector
|
|
jerry_add_compile_flags(-fno-stack-protector)
|
|
|
|
# Debug information
|
|
jerry_add_compile_flags(-g -gdwarf-4)
|
|
|
|
jerry_add_compile_warnings(all extra format-nonliteral init-self conversion sign-conversion format-security missing-declarations)
|
|
jerry_add_compile_flags(-Wno-stack-protector -Wno-attributes)
|
|
|
|
if(CMAKE_COMPILER_IS_GNUCC)
|
|
jerry_add_compile_warnings(logical-op)
|
|
else()
|
|
jerry_add_compile_flags(-Wno-nested-anon-types -Wno-static-in-inline)
|
|
endif()
|
|
|
|
if(JERRY_LIBC)
|
|
jerry_add_compile_flags(-Werror)
|
|
endif()
|
|
|
|
# C
|
|
jerry_add_compile_flags(-std=c99 -pedantic)
|
|
|
|
# Strip binary
|
|
if(ENABLE_STRIP AND NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
|
|
jerry_add_link_flags(-s)
|
|
endif()
|
|
|
|
# External compiler & linker flags
|
|
if(DEFINED EXTERNAL_COMPILE_FLAGS)
|
|
jerry_add_compile_flags(${EXTERNAL_COMPILE_FLAGS})
|
|
endif()
|
|
|
|
if(DEFINED EXTERNAL_LINKER_FLAGS)
|
|
jerry_add_link_flags(${EXTERNAL_LINKER_FLAGS})
|
|
endif()
|
|
|
|
# Jerry's libc
|
|
if(JERRY_LIBC)
|
|
add_subdirectory(jerry-libc)
|
|
endif()
|
|
|
|
# Jerry's libm
|
|
if(JERRY_LIBM)
|
|
add_subdirectory(jerry-libm)
|
|
endif()
|
|
|
|
# Jerry's core
|
|
add_subdirectory(jerry-core)
|
|
|
|
# Jerry command line tool
|
|
if(JERRY_CMDLINE)
|
|
add_subdirectory(jerry-main)
|
|
endif()
|
|
|
|
# Unittests
|
|
if(UNITTESTS)
|
|
add_subdirectory(tests/unit)
|
|
endif()
|