rework Preprocess builder to consider deep dependencies - fix #21
This commit is contained in:
1 parent
d28722a4bb
commit
0ea842fffe
7 files changed
+89
-14
No files matched your search
@@ -1,7 +1,10 @@
|
||||
require "fileutils"
|
||||
|
||||
module Rscons
|
||||
module Builders
|
||||
# The Preprocess builder invokes the C preprocessor
|
||||
class Preprocess < Builder
|
||||
|
||||
# Return default construction variables for the builder.
|
||||
#
|
||||
# @param env [Environment] The Environment using the builder.
|
||||
@@ -9,7 +12,9 @@ module Rscons
|
||||
# @return [Hash] Default construction variables for the builder.
|
||||
def default_variables(env)
|
||||
{
|
||||
"CPP_CMD" => ["${_PREPROCESS_CC}", "-E", "-o", "${_TARGET}", "-I${CPPPATH}", "${CPPFLAGS}", "${CFLAGS}", "${_SOURCES}"],
|
||||
"CPP_CMD" => %w[
|
||||
${_PREPROCESS_CC} -E ${_PREPROCESS_DEPGEN}
|
||||
-o ${_TARGET} -I${CPPPATH} ${CPPFLAGS} ${_SOURCES}],
|
||||
}
|
||||
end
|
||||
|
||||
@@ -24,17 +29,32 @@ module Rscons
|
||||
# @return [String,false]
|
||||
# Name of the target file on success or false on failure.
|
||||
def run(target, sources, cache, env, vars)
|
||||
pp_cc = if sources.find {|s| s.end_with?(*env.expand_varref("${CXXSUFFIX}", vars))}
|
||||
"${CXX}"
|
||||
else
|
||||
"${CC}"
|
||||
end
|
||||
if sources.find {|s| s.end_with?(*env.expand_varref("${CXXSUFFIX}", vars))}
|
||||
pp_cc = "${CXX}"
|
||||
depgen = "${CXXDEPGEN}"
|
||||
else
|
||||
pp_cc = "${CC}"
|
||||
depgen = "${CCDEPGEN}"
|
||||
end
|
||||
vars = vars.merge("_PREPROCESS_CC" => pp_cc,
|
||||
"_PREPROCESS_DEPGEN" => depgen,
|
||||
"_TARGET" => target,
|
||||
"_SOURCES" => sources)
|
||||
"_SOURCES" => sources,
|
||||
"_DEPFILE" => Rscons.set_suffix(target, env.expand_varref("${DEPFILESUFFIX}", vars)))
|
||||
command = env.build_command("${CPP_CMD}", vars)
|
||||
standard_build("Preprocess #{target}", target, command, sources, env, cache)
|
||||
unless cache.up_to_date?(target, command, sources, env)
|
||||
cache.mkdir_p(File.dirname(target))
|
||||
return false unless env.execute("Preprocess #{target}", command)
|
||||
deps = sources
|
||||
if File.exists?(vars["_DEPFILE"])
|
||||
deps += Environment.parse_makefile_deps(vars["_DEPFILE"], nil)
|
||||
FileUtils.rm_f(vars["_DEPFILE"])
|
||||
end
|
||||
cache.register_build(target, command, deps.uniq, env)
|
||||
end
|
||||
target
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -696,7 +696,8 @@ module Rscons
|
||||
# This method is used internally by Rscons builders.
|
||||
#
|
||||
# @param mf_fname [String] File name of the Makefile to read.
|
||||
# @param target [String] Name of the target to gather dependencies for.
|
||||
# @param target [String, nil]
|
||||
# Name of the target to gather dependencies for, nil for any/all.
|
||||
#
|
||||
# @return [Array<String>] Paths of dependency files.
|
||||
def self.parse_makefile_deps(mf_fname, target)
|
||||
@@ -709,7 +710,7 @@ module Rscons
|
||||
buildup += ' ' + line
|
||||
if buildup =~ /^(.*): (.*)$/
|
||||
mf_target, mf_deps = $1.strip, $2
|
||||
if mf_target == target
|
||||
if target.nil? or mf_target == target
|
||||
deps += mf_deps.split(' ').map(&:strip)
|
||||
end
|
||||
end
|
||||
|
||||
Reference in new issue
Block a user