From 6636df643eb43c4e6fcc4ab216d016d897002652 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?P=C5=99emysl=20Janouch?=
Date: Tue, 18 Oct 2016 16:09:35 +0200
Subject: [PATCH] Make Vala builds efficient with Ninja
---
cmake/ValaPrecompile.cmake | 37 +++++++++++++++++++++++++++----------
1 file changed, 27 insertions(+), 10 deletions(-)
diff --git a/cmake/ValaPrecompile.cmake b/cmake/ValaPrecompile.cmake
index 3cb6a4d..2a6c3a5 100644
--- a/cmake/ValaPrecompile.cmake
+++ b/cmake/ValaPrecompile.cmake
@@ -40,18 +40,25 @@ macro (_vala_parse_source_path)
set (output_c "${directory}/${without_extension}.c")
endmacro ()
-# XXX: it would be best to have it working without touching the vapi (which
-# forces rebuilds even if the API doesn't change) but it appears this cannot
-# be done in CMake (at least with make, with ninja it seems to be possible
-# via stamps and BYPRODUCTS)
-# TODO: check ${CMAKE_GENERATOR} and try to do better -> OUTPUT and "touch"
-# a stamp, use BYPRODUCTS instead, ... maybe make a target for all stamps,
-# then DEPEND on that target when precompiling. This should be enough.
function (_vala_make_fast file)
_vala_parse_source_path ()
- add_custom_command (OUTPUT "${output_vapi}"
+
+ # See `cmake --help-policy CMP0058` for a rather nice explanation.
+ # TODO: it says we can fix this situation even for non-Ninja
+ # (rebuilds are forced even when the external API doesn't change),
+ # just make sure to only use BYPRODUCTS when it's supported by CMake
+ set (stamp "${output_vapi}")
+ set (byproducts)
+ if ("${CMAKE_GENERATOR}" STREQUAL Ninja)
+ set (stamp "${output_vapi}.stamp")
+ set (byproducts BYPRODUCTS "${output_vapi}")
+ set (stamp_target ${stamp_target} "${stamp}" PARENT_SCOPE)
+ endif ()
+
+ add_custom_command (OUTPUT "${stamp}"
+ ${byproducts}
COMMAND ${VALA_COMPILER} "${file}" "--fast-vapi=${output_vapi}"
- COMMAND ${CMAKE_COMMAND} -E touch "${output_vapi}"
+ COMMAND ${CMAKE_COMMAND} -E touch "${stamp}"
DEPENDS "${file}"
COMMENT "Generating a fast vapi for ${basename}" VERBATIM)
set (fast_vapi_deps ${fast_vapi_deps} "${output_vapi}" PARENT_SCOPE)
@@ -69,13 +76,18 @@ function (_vala_make_c file)
add_custom_command (OUTPUT "${output_c}"
COMMAND ${VALA_COMPILER} "${file}" -C ${compiler_args} ${fast_vapis}
COMMAND ${CMAKE_COMMAND} -E touch "${output_c}"
- DEPENDS "${file}" ${fast_vapi_deps} ${vapis}
+ DEPENDS "${file}" ${fast_vapi_deps} ${vapis} ${stamp_target}
WORKING_DIRECTORY "${directory}"
COMMENT "Precompiling ${basename}" VERBATIM)
set (c_outputs ${c_outputs} "${output_c}" PARENT_SCOPE)
endfunction ()
+set (_vala_counter 0)
function (vala_precompile)
+ # So that the user doesn't need to name any targets, we can do it ourselves
+ math (EXPR counter "${_vala_counter} + 1")
+ set (_vala_counter "${counter}" PARENT_SCOPE)
+
set (_single_value DIRECTORY OUTPUTS HEADER VAPI SYMBOLS)
set (_multi_value PACKAGES OPTIONS)
cmake_parse_arguments (arg "" "${_single_value}" "${_multi_value}" ${ARGN})
@@ -105,9 +117,14 @@ function (vala_precompile)
set (fast_vapi_deps)
set (fast_vapi_args)
+ set (stamp_target)
foreach (_source ${sources})
_vala_make_fast ("${_source}")
endforeach ()
+ if (stamp_target)
+ add_custom_target ("vala_fast_vapis_${counter}" DEPENDS ${stamp_target})
+ set (stamp_target "vala_fast_vapis_${counter}")
+ endif ()
set (compiler_args)
foreach (_pkg ${arg_PACKAGES})