diff --git a/CMakeLists.txt b/CMakeLists.txt index 8ba477b03..ab1a3834d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,7 +10,7 @@ # @TAG(DATA61_GPL) # -cmake_minimum_required(VERSION 3.7.2) +cmake_minimum_required(VERSION 3.8.2) include(CheckCCompilerFlag) project(seL4 C ASM) @@ -354,16 +354,17 @@ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -T ${linker_lds_path}") # Need a custom build command as we need to not have our already pre-processed file get # processed again, which means either using a .ii file or explicitly saying -x cpp-output. # Unfortunately and cmake doesn't understand .ii files directly so we do the latter approach +separate_arguments(args NATIVE_COMMAND "${custom_command_c_flags} ${CMAKE_C_FLAGS}") add_custom_command(OUTPUT kernel_all.o # Take the opportunity to check for circular includes COMMAND ${CIRCULAR_INCLUDES} < kernel_all_pp.c - COMMAND echo "${custom_command_c_flags}" "${CMAKE_C_FLAGS}" -x cpp-output kernel_all_pp.c | - xargs ${ccache} ${CMAKE_C_COMPILER} -ffreestanding -c -o kernel_all.o + COMMAND ${ccache} ${CMAKE_C_COMPILER} -ffreestanding -c -o kernel_all.o "${args}" -x cpp-output kernel_all_pp.c # Cannot make the kernel.elf executable properly depend upon the linker script so depend upon it # here DEPENDS kernel_all_pp.c kernel_all_pp_wrapper ${c_arguments_deps} linker_ld_wrapper "${linker_lds_path}" VERBATIM COMMENT "Compiling concatenated kernel sources" + COMMAND_EXPAND_LISTS ) add_custom_target(kernel_all_wrapper diff --git a/tools/helpers.cmake b/tools/helpers.cmake index 05fb4c340..e2abf63c5 100644 --- a/tools/helpers.cmake +++ b/tools/helpers.cmake @@ -10,7 +10,7 @@ # @TAG(DATA61_GPL) # -cmake_minimum_required(VERSION 3.7.2) +cmake_minimum_required(VERSION 3.8.2) include(CMakeDependentOption) @@ -56,19 +56,18 @@ function(GenCPPCommand output input) get_filename_component(output_absolute "${output}" ABSOLUTE BASE_DIR "${CMAKE_CURRENT_BINARY_DIR}") get_absolute_source_or_binary(input_absolute "${input}") file(RELATIVE_PATH rel_target_path "${CMAKE_BINARY_DIR}" "${output_absolute}") + # The flags are stored as regular space separated command line. As we use COMMAND_EXPAND_LISTS + # in the COMMAND we need to first turn our arguments into a proper list for re-expansion + separate_arguments(args NATIVE_COMMAND "${CPP_EXTRA_FLAGS} ${CMAKE_C_FLAGS}") add_custom_command(OUTPUT "${output_absolute}" OUTPUT "${output_absolute}.d" - # Pipe are arguments through sed to turn lists from generator expressions into - # proper space separated argument lists. Note that lists from generator expressions - # will *not* be separated by the separate_arguments cmake command since separate_arguments - # is invoke during generation, not during building and hence generator expressions will - # not yet be filled in - COMMAND echo "${CPP_EXTRA_FLAGS}" "${CMAKE_C_FLAGS}" -x c ${input_absolute} - | xargs "${CMAKE_C_COMPILER}" -MMD -MT "${rel_target_path}" - -MF "${output_absolute}.d" -E -o "${output_absolute}" + COMMAND "${CMAKE_C_COMPILER}" -MMD -MT "${rel_target_path}" + -MF "${output_absolute}.d" -E -o "${output_absolute}" "${args}" + -x c "${input_absolute}" DEPENDS "${input_absolute}" ${CPP_EXTRA_DEPS} COMMENT "Preprocessing ${input} into ${output}" DEPFILE "${output_absolute}.d" VERBATIM + COMMAND_EXPAND_LISTS ) if(NOT "${CPP_TARGET}" STREQUAL "") add_custom_target(${CPP_TARGET}