299 lines
9.4 KiB
CMake
299 lines
9.4 KiB
CMake
# Copyright JS Foundation and other contributors, http://js.foundation
|
|
#
|
|
# 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)
|
|
|
|
# Determining version
|
|
execute_process(COMMAND python ${CMAKE_SOURCE_DIR}/tools/version.py
|
|
OUTPUT_VARIABLE JERRY_VERSION
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
|
|
# Determining platform
|
|
set(PLATFORM "${CMAKE_SYSTEM_NAME}")
|
|
string(TOUPPER "${PLATFORM}" PLATFORM)
|
|
|
|
# Determining compiler
|
|
if(CMAKE_C_COMPILER_ID MATCHES "GNU")
|
|
set(USING_GCC 1)
|
|
endif()
|
|
|
|
if(CMAKE_C_COMPILER_ID MATCHES "Clang")
|
|
set(USING_CLANG 1)
|
|
endif()
|
|
|
|
if(CMAKE_C_COMPILER_ID MATCHES "TI")
|
|
set(USING_TI 1)
|
|
endif()
|
|
|
|
if(CMAKE_C_COMPILER_ID MATCHES "MSVC")
|
|
set(USING_MSVC 1)
|
|
endif()
|
|
|
|
# Determining build type
|
|
if(NOT CMAKE_BUILD_TYPE)
|
|
set(CMAKE_BUILD_TYPE "MinSizeRel")
|
|
endif()
|
|
|
|
# Optional components
|
|
set(JERRY_CMDLINE ON CACHE BOOL "Build jerry command line tool?")
|
|
set(JERRY_CMDLINE_TEST OFF CACHE BOOL "Build jerry test command line tool?")
|
|
set(JERRY_CMDLINE_SNAPSHOT OFF CACHE BOOL "Build jerry snapshot command line tool?")
|
|
set(JERRY_LIBFUZZER OFF CACHE BOOL "Build jerry with libfuzzer support?")
|
|
set(JERRY_PORT_DEFAULT ON CACHE BOOL "Build default jerry port implementation?")
|
|
set(JERRY_EXT ON CACHE BOOL "Build jerry-ext?")
|
|
set(JERRY_MATH OFF CACHE BOOL "Build and use jerry-math?")
|
|
set(UNITTESTS OFF CACHE BOOL "Build unit tests?")
|
|
set(DOCTESTS OFF CACHE BOOL "Build doc tests?")
|
|
|
|
# Optional build settings
|
|
set(BUILD_SHARED_LIBS OFF CACHE BOOL "Build shared libraries?")
|
|
set(ENABLE_AMALGAM OFF CACHE BOOL "Enable amalgamated build?")
|
|
set(ENABLE_LTO ON CACHE BOOL "Enable LTO build?")
|
|
set(ENABLE_STRIP ON CACHE BOOL "Enable stripping all symbols from release binary?")
|
|
set(ENABLE_COMPILE_COMMANDS ON CACHE BOOL "Enable generating compile_commands.json?")
|
|
|
|
# Option overrides
|
|
if(NOT USING_CLANG)
|
|
set(JERRY_LIBFUZZER OFF)
|
|
|
|
set(JERRY_LIBFUZZER_MESSAGE " (FORCED BY COMPILER)")
|
|
endif()
|
|
|
|
if(JERRY_CMDLINE OR JERRY_CMDLINE_TEST OR JERRY_CMDLINE_SNAPSHOT OR JERRY_LIBFUZZER OR UNITTESTS OR DOCTESTS)
|
|
set(JERRY_PORT_DEFAULT ON)
|
|
|
|
set(JERRY_PORT_DEFAULT_MESSAGE " (FORCED BY CMDLINE OR LIBFUZZER OR TESTS)")
|
|
endif()
|
|
|
|
if(JERRY_CMDLINE OR DOCTESTS)
|
|
set(JERRY_EXT ON)
|
|
|
|
set(JERRY_EXT_MESSAGE " (FORCED BY CMDLINE OR TESTS)")
|
|
endif()
|
|
|
|
if("${PLATFORM}" STREQUAL "DARWIN")
|
|
set(ENABLE_LTO OFF)
|
|
set(ENABLE_STRIP OFF)
|
|
|
|
set(ENABLE_LTO_MESSAGE " (FORCED BY PLATFORM)")
|
|
set(ENABLE_STRIP_MESSAGE " (FORCED BY PLATFORM)")
|
|
endif()
|
|
|
|
if("${PLATFORM}" STREQUAL "ESP-IDF")
|
|
set(ENABLE_LTO OFF)
|
|
set(ENABLE_STRIP OFF)
|
|
|
|
set(ENABLE_LTO_MESSAGE " (FORCED BY PLATFORM)")
|
|
set(ENABLE_STRIP_MESSAGE " (FORCED BY PLATFORM)")
|
|
endif()
|
|
|
|
if(USING_TI)
|
|
set(ENABLE_STRIP OFF)
|
|
|
|
set(ENABLE_STRIP_MESSAGE " (FORCED BY COMPILER)")
|
|
endif()
|
|
|
|
if(USING_MSVC)
|
|
set(ENABLE_STRIP OFF)
|
|
|
|
set(ENABLE_STRIP_MESSAGE " (FORCED BY COMPILER)")
|
|
endif()
|
|
|
|
if(CYGWIN OR MINGW OR MSYS)
|
|
set(ENABLE_LTO OFF)
|
|
|
|
set(ENABLE_LTO_MESSAGE " (FORCED BY PLATFORM)")
|
|
endif()
|
|
|
|
# Generate compile_commands.json
|
|
set(CMAKE_EXPORT_COMPILE_COMMANDS ${ENABLE_COMPILE_COMMANDS})
|
|
|
|
# Status messages
|
|
message(STATUS "CMAKE_BUILD_TYPE " ${CMAKE_BUILD_TYPE})
|
|
message(STATUS "CMAKE_C_COMPILER_ID " ${CMAKE_C_COMPILER_ID})
|
|
message(STATUS "CMAKE_SYSTEM_NAME " ${CMAKE_SYSTEM_NAME})
|
|
message(STATUS "CMAKE_SYSTEM_PROCESSOR " ${CMAKE_SYSTEM_PROCESSOR})
|
|
message(STATUS "BUILD_SHARED_LIBS " ${BUILD_SHARED_LIBS})
|
|
message(STATUS "ENABLE_AMALGAM " ${ENABLE_AMALGAM} ${ENABLE_AMALGAM_MESSAGE})
|
|
message(STATUS "ENABLE_LTO " ${ENABLE_LTO} ${ENABLE_LTO_MESSAGE})
|
|
message(STATUS "ENABLE_STRIP " ${ENABLE_STRIP} ${ENABLE_STRIP_MESSAGE})
|
|
message(STATUS "ENABLE_COMPILE_COMMANDS " ${ENABLE_COMPILE_COMMANDS})
|
|
message(STATUS "JERRY_VERSION " ${JERRY_VERSION})
|
|
message(STATUS "JERRY_CMDLINE " ${JERRY_CMDLINE} ${JERRY_CMDLINE_MESSAGE})
|
|
message(STATUS "JERRY_CMDLINE_TEST " ${JERRY_CMDLINE_TEST} ${JERRY_CMDLINE_TEST_MESSAGE})
|
|
message(STATUS "JERRY_CMDLINE_SNAPSHOT " ${JERRY_CMDLINE_SNAPSHOT} ${JERRY_CMDLINE_SNAPSHOT_MESSAGE})
|
|
message(STATUS "JERRY_LIBFUZZER " ${JERRY_LIBFUZZER} ${JERRY_LIBFUZZER_MESSAGE})
|
|
message(STATUS "JERRY_PORT_DEFAULT " ${JERRY_PORT_DEFAULT} ${JERRY_PORT_DEFAULT_MESSAGE})
|
|
message(STATUS "JERRY_EXT " ${JERRY_EXT} ${JERRY_EXT_MESSAGE})
|
|
message(STATUS "JERRY_MATH " ${JERRY_MATH} ${JERRY_MATH_MESSAGE})
|
|
message(STATUS "UNITTESTS " ${UNITTESTS})
|
|
message(STATUS "DOCTESTS " ${DOCTESTS})
|
|
|
|
# Setup directories
|
|
# Note: This mimics a conventional file system layout in the build directory for
|
|
# the sake of convenient location of build artefacts. Proper installation to
|
|
# traditional locations is also supported, e.g., to /usr/local.
|
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin/")
|
|
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib/")
|
|
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib/")
|
|
|
|
# Remove rdynamic option
|
|
set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS )
|
|
|
|
# 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})
|
|
jerry_add_compile_flags(-Werror=${_warning})
|
|
endforeach()
|
|
endmacro()
|
|
|
|
macro(jerry_add_link_flags)
|
|
jerry_add_flags(LINKER_FLAGS_COMMON ${ARGV})
|
|
endmacro()
|
|
|
|
# Architecture-specific compile/link flags
|
|
jerry_add_compile_flags(${FLAGS_COMMON_ARCH})
|
|
jerry_add_flags(CMAKE_EXE_LINKER_FLAGS ${FLAGS_COMMON_ARCH})
|
|
|
|
# LTO
|
|
if(ENABLE_LTO)
|
|
if(USING_GCC OR USING_CLANG)
|
|
jerry_add_compile_flags(-flto)
|
|
jerry_add_link_flags(-flto)
|
|
endif()
|
|
if(USING_GCC)
|
|
jerry_add_compile_flags(-fno-fat-lto-objects)
|
|
# Use gcc-ar and gcc-ranlib to support LTO
|
|
set(CMAKE_AR "gcc-ar")
|
|
set(CMAKE_RANLIB "gcc-ranlib")
|
|
endif()
|
|
if(USING_TI)
|
|
jerry_add_link_flags(-lto)
|
|
endif()
|
|
endif()
|
|
|
|
# Compiler / Linker flags
|
|
if("${PLATFORM}" STREQUAL "DARWIN")
|
|
jerry_add_link_flags(-lSystem)
|
|
set(CMAKE_C_ARCHIVE_CREATE "<CMAKE_AR> Sqc <TARGET> <LINK_FLAGS> <OBJECTS>")
|
|
set(CMAKE_C_ARCHIVE_FINISH "<CMAKE_RANLIB> -no_warning_for_no_symbols -c <TARGET>")
|
|
set(CMAKE_SHARED_LINKER_FLAGS "-undefined dynamic_lookup")
|
|
elseif((NOT CYGWIN AND NOT MINGW AND NOT MSYS) AND (USING_GCC OR USING_CLANG))
|
|
jerry_add_link_flags(-Wl,-z,noexecstack)
|
|
endif()
|
|
|
|
if(USING_GCC OR USING_CLANG)
|
|
jerry_add_compile_flags(-std=c99 -pedantic)
|
|
if(JERRY_MATH)
|
|
jerry_add_compile_flags(-fno-builtin)
|
|
endif()
|
|
jerry_add_compile_warnings(all extra format-nonliteral init-self conversion sign-conversion format-security missing-declarations shadow strict-prototypes undef old-style-definition)
|
|
jerry_add_compile_flags(-Wno-stack-protector -Wno-attributes -Werror)
|
|
endif()
|
|
|
|
if(USING_GCC)
|
|
jerry_add_compile_warnings(logical-op)
|
|
# TODO: Remove workaround for gcc 7 bug if the fallthrough comment detection is fixed.
|
|
if(CMAKE_C_COMPILER_VERSION VERSION_GREATER 7.0)
|
|
jerry_add_compile_flags(-Wno-implicit-fallthrough)
|
|
endif()
|
|
endif()
|
|
|
|
if(USING_CLANG)
|
|
jerry_add_compile_flags(-Wno-nested-anon-types -Wno-static-in-inline)
|
|
endif()
|
|
|
|
if(USING_TI)
|
|
jerry_add_compile_flags(--c99)
|
|
endif()
|
|
|
|
if(USING_MSVC)
|
|
jerry_add_link_flags(/OPT:NOREF)
|
|
# Disable MSVC warning 4996 globally because it stops us from using standard C functions.
|
|
jerry_add_compile_flags(/wd4996)
|
|
endif()
|
|
|
|
if(JERRY_LIBFUZZER)
|
|
jerry_add_compile_flags(-fsanitize=fuzzer-no-link)
|
|
endif()
|
|
|
|
# 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()
|
|
|
|
# Used as placeholder to attach amalgamated build targets to
|
|
add_custom_target(amalgam)
|
|
|
|
# Jerry's libm
|
|
if(JERRY_MATH)
|
|
add_subdirectory(jerry-math)
|
|
endif()
|
|
|
|
# Jerry's core
|
|
add_subdirectory(jerry-core)
|
|
|
|
# Jerry's extension tools
|
|
if(JERRY_EXT)
|
|
add_subdirectory(jerry-ext)
|
|
endif()
|
|
|
|
# Jerry's default port implementation
|
|
if(JERRY_PORT_DEFAULT)
|
|
add_subdirectory(jerry-port/default)
|
|
endif()
|
|
|
|
# Jerry command line tool
|
|
if(JERRY_CMDLINE OR JERRY_CMDLINE_TEST OR JERRY_CMDLINE_SNAPSHOT OR JERRY_LIBFUZZER)
|
|
add_subdirectory(jerry-main)
|
|
endif()
|
|
|
|
# Unittests
|
|
if(UNITTESTS)
|
|
add_subdirectory(tests/unit-core)
|
|
if(JERRY_MATH)
|
|
add_subdirectory(tests/unit-math)
|
|
endif()
|
|
if(JERRY_EXT)
|
|
add_subdirectory(tests/unit-ext)
|
|
endif()
|
|
endif()
|
|
|
|
# Doctests
|
|
if(DOCTESTS)
|
|
add_subdirectory(tests/unit-doc)
|
|
endif()
|