Skip to content

Commit 9b12516

Browse files
committed
Build system changes to allow compiler toolchain override
E.g., works with Clang as ``` make clean && make debug.linux CC=clang-3.5 CXX=clang++-3.5 AR=/usr/bin/ar RANLIB=/usr/bin/ranlib \ EXTRA_CFLAGS="-Wno-unknown-warning-option -Wno-sign-conversion -Wno-sign-compare -Wno-nested-anon-types -Wno-c99-extensions -Wno-float-conversion -Wno-null-conversion -Wno-invalid-noreturn" \ LTO=OFF ``` (Works on x86_64/linux at least.) JerryScript-DCO-1.0-Signed-off-by: Akos Kiss [email protected]
1 parent 41aef56 commit 9b12516

File tree

3 files changed

+54
-13
lines changed

3 files changed

+54
-13
lines changed

CMakeLists.txt

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ project (Jerry CXX C ASM)
1717

1818
# Require g++ of version >= 4.7.0
1919
if(NOT CMAKE_COMPILER_IS_GNUCXX)
20-
message(FATAL_ERROR "g++ compiler is required")
20+
message(WARNING "g++ compiler is required")
2121
else()
2222
execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpversion
2323
OUTPUT_VARIABLE GNU_CXX_VERSION
@@ -32,10 +32,14 @@ project (Jerry CXX C ASM)
3232
get_filename_component(PATH_TO_GCC ${CMAKE_C_COMPILER} REALPATH)
3333
get_filename_component(DIRECTORY_GCC ${PATH_TO_GCC} DIRECTORY)
3434
get_filename_component(FILE_NAME_GCC ${PATH_TO_GCC} NAME)
35-
string(REPLACE "gcc" "gcc-ar" CMAKE_AR ${FILE_NAME_GCC})
36-
string(REPLACE "gcc" "gcc-ranlib" CMAKE_RANLIB ${FILE_NAME_GCC})
37-
set(CMAKE_AR ${DIRECTORY_GCC}/${CMAKE_AR})
38-
set(CMAKE_RANLIB ${DIRECTORY_GCC}/${CMAKE_RANLIB})
35+
if(NOT DEFINED CMAKE_AR)
36+
string(REPLACE "gcc" "gcc-ar" CMAKE_AR ${FILE_NAME_GCC})
37+
set(CMAKE_AR ${DIRECTORY_GCC}/${CMAKE_AR})
38+
endif()
39+
if(NOT DEFINED CMAKE_RANLIB)
40+
string(REPLACE "gcc" "gcc-ranlib" CMAKE_RANLIB ${FILE_NAME_GCC})
41+
set(CMAKE_RANLIB ${DIRECTORY_GCC}/${CMAKE_RANLIB})
42+
endif()
3943

4044
# Imported and third-party targets prefix
4145
set(PREFIX_IMPORTED_LIB imported_)
@@ -202,8 +206,12 @@ project (Jerry CXX C ASM)
202206

203207
# LTO
204208
if("${ENABLE_LTO}" STREQUAL "ON")
205-
set(COMPILE_FLAGS_JERRY "${COMPILE_FLAGS_JERRY} -flto -fno-fat-lto-objects")
206-
set(LINKER_FLAGS_COMMON "${LINKER_FLAGS_COMMON} -flto")
209+
if(CMAKE_COMPILER_IS_GNUCC AND CMAKE_COMPILER_IS_GNUCXX)
210+
set(COMPILE_FLAGS_JERRY "${COMPILE_FLAGS_JERRY} -flto -fno-fat-lto-objects")
211+
set(LINKER_FLAGS_COMMON "${LINKER_FLAGS_COMMON} -flto")
212+
else()
213+
message(FATAL_ERROR "LTO is only supported for g++ (consider using LTO=OFF)")
214+
endif()
207215
endif()
208216

209217
# Turn off stack protector
@@ -213,11 +221,17 @@ project (Jerry CXX C ASM)
213221
set(COMPILE_FLAGS_JERRY "${COMPILE_FLAGS_JERRY} -g -gdwarf-4")
214222

215223
# Warnings
216-
set(COMPILE_FLAGS_JERRY "${COMPILE_FLAGS_JERRY} -Wall -Wextra -pedantic -Wlogical-op")
224+
set(COMPILE_FLAGS_JERRY "${COMPILE_FLAGS_JERRY} -Wall -Wextra -pedantic")
217225
set(COMPILE_FLAGS_JERRY "${COMPILE_FLAGS_JERRY} -Wformat-nonliteral -Winit-self -Wno-stack-protector")
218226
set(COMPILE_FLAGS_JERRY "${COMPILE_FLAGS_JERRY} -Wconversion -Wsign-conversion -Wformat-security")
219227
set(COMPILE_FLAGS_JERRY "${COMPILE_FLAGS_JERRY} -Wmissing-declarations -Wno-attributes")
220228
set(COMPILE_FLAGS_JERRY "${COMPILE_FLAGS_JERRY} -Werror -Wfatal-errors")
229+
if(CMAKE_COMPILER_IS_GNUCC AND CMAKE_COMPILER_IS_GNUCXX)
230+
set(COMPILE_FLAGS_JERRY "${COMPILE_FLAGS_JERRY} -Wlogical-op")
231+
endif()
232+
233+
# Extra flags
234+
set(COMPILE_FLAGS_JERRY "${COMPILE_FLAGS_JERRY} ${EXTRA_COMPILE_FLAGS}")
221235

222236
# Static build
223237
set(LINKER_FLAGS_STATIC "-static")
@@ -226,7 +240,9 @@ project (Jerry CXX C ASM)
226240
set(CXX_FLAGS_JERRY "-std=c++11 -fno-exceptions -fno-rtti")
227241

228242
# Turn off implicit template instantiation
229-
set(CXX_FLAGS_JERRY "${CXX_FLAGS_JERRY} -fno-implicit-templates -fno-implicit-inline-templates")
243+
if(CMAKE_COMPILER_IS_GNUCXX)
244+
set(CXX_FLAGS_JERRY "${CXX_FLAGS_JERRY} -fno-implicit-templates -fno-implicit-inline-templates")
245+
endif()
230246

231247
# C
232248
set(C_FLAGS_JERRY "-std=c99")

Makefile

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,24 @@
7777
QLOG := >/dev/null
7878
endif
7979

80+
# Toolchain overrride
81+
CMAKE_TOOLCHAIN_OPTIONS :=
82+
ifdef CC
83+
CMAKE_TOOLCHAIN_OPTIONS += -DCMAKE_C_COMPILER=$(CC)
84+
endif
85+
ifdef CXX
86+
CMAKE_TOOLCHAIN_OPTIONS += -DCMAKE_CXX_COMPILER=$(CXX)
87+
endif
88+
ifdef EXTRA_CFLAGS
89+
CMAKE_TOOLCHAIN_OPTIONS += -DEXTRA_COMPILE_FLAGS="$(EXTRA_CFLAGS)"
90+
endif
91+
ifdef AR
92+
CMAKE_TOOLCHAIN_OPTIONS += -DCMAKE_AR=$(AR)
93+
endif
94+
ifdef RANLIB
95+
CMAKE_TOOLCHAIN_OPTIONS += -DCMAKE_RANLIB=$(RANLIB)
96+
endif
97+
8098
# External build configuration
8199
# Flag, indicating whether to use compiler's default libc (YES / NO)
82100
USE_COMPILER_DEFAULT_LIBC ?= NO
@@ -91,6 +109,7 @@
91109
# Compiler to use for external build
92110
EXTERNAL_C_COMPILER ?= arm-none-eabi-gcc
93111
EXTERNAL_CXX_COMPILER ?= arm-none-eabi-g++
112+
CMAKE_TOOLCHAIN_OPTIONS += -DUSE_COMPILER_DEFAULT_LIBC=$(USE_COMPILER_DEFAULT_LIBC)
94113

95114
export TARGET_DEBUG_MODES = debug
96115
export TARGET_RELEASE_MODES = release
@@ -176,7 +195,7 @@ $(BUILD_DIRS_NATIVE): prerequisites
176195
mkdir -p $@; \
177196
echo "$$TOOLCHAIN" > $@/toolchain.config
178197
$(Q) cd $@ && \
179-
(cmake -DENABLE_VALGRIND=$(VALGRIND) -DENABLE_LOG=$(LOG) -DENABLE_LTO=$(LTO) -DCMAKE_TOOLCHAIN_FILE=`cat toolchain.config` ../../.. 2>&1 | tee cmake.log $(QLOG) ; ( exit $${PIPESTATUS[0]} ) ) || \
198+
(cmake $(CMAKE_TOOLCHAIN_OPTIONS) -DENABLE_VALGRIND=$(VALGRIND) -DENABLE_LOG=$(LOG) -DENABLE_LTO=$(LTO) -DCMAKE_TOOLCHAIN_FILE=`cat toolchain.config` ../../.. 2>&1 | tee cmake.log $(QLOG) ; ( exit $${PIPESTATUS[0]} ) ) || \
180199
(echo "CMake run failed. See "`pwd`"/cmake.log for details."; exit 1;); \
181200

182201
.PHONY: $(BUILD_DIRS_STM32F3)

build/configs/toolchain_linux_x86_64.cmake

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,15 @@
1515
set(CMAKE_SYSTEM_NAME Linux)
1616
set(CMAKE_SYSTEM_PROCESSOR x86_64)
1717

18-
find_program(CMAKE_C_COMPILER NAMES x86_64-linux-gnu-gcc x86_64-unknown-linux-gnu-gcc)
19-
find_program(CMAKE_CXX_COMPILER NAMES x86_64-linux-gnu-g++ x86_64-unknown-linux-gnu-g++)
18+
if(NOT DEFINED CMAKE_C_COMPILER)
19+
find_program(CMAKE_C_COMPILER NAMES x86_64-linux-gnu-gcc x86_64-unknown-linux-gnu-gcc)
20+
endif()
21+
if(NOT DEFINED CMAKE_CXX_COMPILER)
22+
find_program(CMAKE_CXX_COMPILER NAMES x86_64-linux-gnu-g++ x86_64-unknown-linux-gnu-g++)
23+
endif()
2024
# FIXME: This could break cross compilation, when the strip is not for the target architecture
2125
find_program(CMAKE_STRIP NAMES x86_64-linux-gnu-strip x86_64-unknown-linux-gnu-strip strip)
2226

23-
set(FLAGS_COMMON_ARCH -ffixed-rbp)
27+
if(CMAKE_COMPILER_IS_GNUCC AND CMAKE_COMPILER_IS_GNUCXX)
28+
set(FLAGS_COMMON_ARCH -ffixed-rbp)
29+
endif()

0 commit comments

Comments
 (0)