mirror of
https://github.com/iNavFlight/inav.git
synced 2025-07-23 16:25:26 +03:00
Move build-stamp and generatic files to obj/main/$(TARGET)
This allows target level parallel builds, since now there are no shared files between targets. Fixes #3261
This commit is contained in:
parent
46f0ca8e72
commit
bf0f05af5f
6 changed files with 43 additions and 27 deletions
35
Makefile
35
Makefile
|
@ -274,9 +274,10 @@ TARGET_BIN = $(BIN_DIR)/$(FORKNAME)_$(FC_VER)_$(TARGET)_$(BUILD_SUFFIX).bin
|
||||||
TARGET_HEX = $(BIN_DIR)/$(FORKNAME)_$(FC_VER)_$(TARGET)_$(BUILD_SUFFIX).hex
|
TARGET_HEX = $(BIN_DIR)/$(FORKNAME)_$(FC_VER)_$(TARGET)_$(BUILD_SUFFIX).hex
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
TARGET_OBJ_DIR = $(OBJECT_DIR)/$(TARGET)
|
||||||
TARGET_ELF = $(OBJECT_DIR)/$(FORKNAME)_$(TARGET).elf
|
TARGET_ELF = $(OBJECT_DIR)/$(FORKNAME)_$(TARGET).elf
|
||||||
TARGET_OBJS = $(addsuffix .o,$(addprefix $(OBJECT_DIR)/$(TARGET)/,$(basename $(TARGET_SRC))))
|
TARGET_OBJS = $(addsuffix .o,$(addprefix $(TARGET_OBJ_DIR)/,$(basename $(TARGET_SRC))))
|
||||||
TARGET_DEPS = $(addsuffix .d,$(addprefix $(OBJECT_DIR)/$(TARGET)/,$(basename $(TARGET_SRC))))
|
TARGET_DEPS = $(addsuffix .d,$(addprefix $(TARGET_OBJ_DIR)/,$(basename $(TARGET_SRC))))
|
||||||
TARGET_MAP = $(OBJECT_DIR)/$(FORKNAME)_$(TARGET).map
|
TARGET_MAP = $(OBJECT_DIR)/$(FORKNAME)_$(TARGET).map
|
||||||
|
|
||||||
|
|
||||||
|
@ -285,20 +286,23 @@ CLEAN_ARTIFACTS += $(TARGET_HEX)
|
||||||
CLEAN_ARTIFACTS += $(TARGET_ELF) $(TARGET_OBJS) $(TARGET_MAP)
|
CLEAN_ARTIFACTS += $(TARGET_ELF) $(TARGET_OBJS) $(TARGET_MAP)
|
||||||
|
|
||||||
# Make sure build date and revision is updated on every incremental build
|
# Make sure build date and revision is updated on every incremental build
|
||||||
$(OBJECT_DIR)/$(TARGET)/build/version.o : $(TARGET_SRC)
|
$(TARGET_OBJ_DIR)/build/version.o : $(TARGET_SRC)
|
||||||
|
|
||||||
# Settings generator
|
# Settings generator
|
||||||
.PHONY: .FORCE settings clean-settings
|
.PHONY: .FORCE settings clean-settings
|
||||||
UTILS_DIR = $(ROOT)/src/utils
|
UTILS_DIR = $(ROOT)/src/utils
|
||||||
SETTINGS_GENERATOR = $(UTILS_DIR)/settings.rb
|
SETTINGS_GENERATOR = $(UTILS_DIR)/settings.rb
|
||||||
BUILD_STAMP = $(UTILS_DIR)/build_stamp.rb
|
BUILD_STAMP = $(UTILS_DIR)/build_stamp.rb
|
||||||
STAMP = $(BIN_DIR)/build.stamp
|
STAMP = $(TARGET_OBJ_DIR)/build.stamp
|
||||||
|
|
||||||
GENERATED_SETTINGS = $(SRC_DIR)/fc/settings_generated.h $(SRC_DIR)/fc/settings_generated.c
|
GENERATED_SETTINGS = $(TARGET_OBJ_DIR)/settings_generated.h $(TARGET_OBJ_DIR)/settings_generated.c
|
||||||
SETTINGS_FILE = $(SRC_DIR)/fc/settings.yaml
|
SETTINGS_FILE = $(SRC_DIR)/fc/settings.yaml
|
||||||
GENERATED_FILES = $(GENERATED_SETTINGS)
|
GENERATED_FILES = $(GENERATED_SETTINGS)
|
||||||
$(GENERATED_SETTINGS): $(SETTINGS_GENERATOR) $(SETTINGS_FILE) $(STAMP)
|
$(GENERATED_SETTINGS): $(SETTINGS_GENERATOR) $(SETTINGS_FILE) $(STAMP)
|
||||||
|
|
||||||
|
# Make sure the generated files are in the include path
|
||||||
|
CFLAGS += -I$(TARGET_OBJ_DIR)
|
||||||
|
|
||||||
$(STAMP): .FORCE
|
$(STAMP): .FORCE
|
||||||
$(V1) CFLAGS="$(CFLAGS)" TARGET=$(TARGET) ruby $(BUILD_STAMP) $(SETTINGS_FILE) $(STAMP)
|
$(V1) CFLAGS="$(CFLAGS)" TARGET=$(TARGET) ruby $(BUILD_STAMP) $(SETTINGS_FILE) $(STAMP)
|
||||||
|
|
||||||
|
@ -306,7 +310,7 @@ $(STAMP): .FORCE
|
||||||
# See https://www.gnu.org/software/make/manual/make.html#Pattern-Examples
|
# See https://www.gnu.org/software/make/manual/make.html#Pattern-Examples
|
||||||
%generated.h %generated.c:
|
%generated.h %generated.c:
|
||||||
$(V1) echo "settings.yaml -> settings_generated.h, settings_generated.c" "$(STDOUT)"
|
$(V1) echo "settings.yaml -> settings_generated.h, settings_generated.c" "$(STDOUT)"
|
||||||
$(V1) CFLAGS="$(CFLAGS)" TARGET=$(TARGET) ruby $(SETTINGS_GENERATOR) . $(SETTINGS_FILE)
|
$(V1) CFLAGS="$(CFLAGS)" TARGET=$(TARGET) ruby $(SETTINGS_GENERATOR) . $(SETTINGS_FILE) -o $(TARGET_OBJ_DIR)
|
||||||
|
|
||||||
settings-json:
|
settings-json:
|
||||||
$(V0) CFLAGS="$(CFLAGS)" TARGET=$(TARGET) ruby $(SETTINGS_GENERATOR) . $(SETTINGS_FILE) --json settings.json
|
$(V0) CFLAGS="$(CFLAGS)" TARGET=$(TARGET) ruby $(SETTINGS_GENERATOR) . $(SETTINGS_FILE) --json settings.json
|
||||||
|
@ -329,18 +333,18 @@ $(TARGET_ELF): $(TARGET_OBJS)
|
||||||
$(V0) $(SIZE) $(TARGET_ELF)
|
$(V0) $(SIZE) $(TARGET_ELF)
|
||||||
|
|
||||||
# Compile
|
# Compile
|
||||||
$(OBJECT_DIR)/$(TARGET)/%.o: %.c
|
$(TARGET_OBJ_DIR)/%.o: %.c
|
||||||
$(V1) mkdir -p $(dir $@)
|
$(V1) mkdir -p $(dir $@)
|
||||||
$(V1) echo %% $(notdir $<) "$(STDOUT)"
|
$(V1) echo %% $(notdir $<) "$(STDOUT)"
|
||||||
$(V1) $(CROSS_CC) -c -o $@ $(CFLAGS) $<
|
$(V1) $(CROSS_CC) -c -o $@ $(CFLAGS) $<
|
||||||
|
|
||||||
# Assemble
|
# Assemble
|
||||||
$(OBJECT_DIR)/$(TARGET)/%.o: %.s
|
$(TARGET_OBJ_DIR)/%.o: %.s
|
||||||
$(V1) mkdir -p $(dir $@)
|
$(V1) mkdir -p $(dir $@)
|
||||||
$(V1) echo %% $(notdir $<) "$(STDOUT)"
|
$(V1) echo %% $(notdir $<) "$(STDOUT)"
|
||||||
$(V1) $(CROSS_CC) -c -o $@ $(ASFLAGS) $<
|
$(V1) $(CROSS_CC) -c -o $@ $(ASFLAGS) $<
|
||||||
|
|
||||||
$(OBJECT_DIR)/$(TARGET)/%.o: %.S
|
$(TARGET_OBJ_DIR)/%.o: %.S
|
||||||
$(V1) mkdir -p $(dir $@)
|
$(V1) mkdir -p $(dir $@)
|
||||||
$(V1) echo %% $(notdir $<) "$(STDOUT)"
|
$(V1) echo %% $(notdir $<) "$(STDOUT)"
|
||||||
$(V1) $(CROSS_CC) -c -o $@ $(ASFLAGS) $<
|
$(V1) $(CROSS_CC) -c -o $@ $(ASFLAGS) $<
|
||||||
|
@ -377,8 +381,7 @@ $(VALID_TARGETS):
|
||||||
clean:
|
clean:
|
||||||
$(V0) echo "Cleaning $(TARGET)"
|
$(V0) echo "Cleaning $(TARGET)"
|
||||||
$(V0) rm -f $(CLEAN_ARTIFACTS)
|
$(V0) rm -f $(CLEAN_ARTIFACTS)
|
||||||
$(V0) rm -rf $(OBJECT_DIR)/$(TARGET)
|
$(V0) rm -rf $(TARGET_OBJ_DIR)
|
||||||
$(V0) rm -f $(GENERATED_SETTINGS)
|
|
||||||
$(V0) echo "Cleaning $(TARGET) succeeded."
|
$(V0) echo "Cleaning $(TARGET) succeeded."
|
||||||
|
|
||||||
## clean_test : clean up all temporary / machine-generated files (tests)
|
## clean_test : clean up all temporary / machine-generated files (tests)
|
||||||
|
|
|
@ -4,10 +4,11 @@
|
||||||
#include "common/string_light.h"
|
#include "common/string_light.h"
|
||||||
#include "common/utils.h"
|
#include "common/utils.h"
|
||||||
|
|
||||||
#include "fc/settings_generated.h"
|
#include "settings_generated.h"
|
||||||
|
|
||||||
#include "fc/settings.h"
|
#include "fc/settings.h"
|
||||||
|
|
||||||
#include "fc/settings_generated.c"
|
#include "settings_generated.c"
|
||||||
|
|
||||||
void setting_get_name(const setting_t *val, char *buf)
|
void setting_get_name(const setting_t *val, char *buf)
|
||||||
{
|
{
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
#include "config/parameter_group.h"
|
#include "config/parameter_group.h"
|
||||||
|
|
||||||
#include "fc/settings_generated.h"
|
#include "settings_generated.h"
|
||||||
|
|
||||||
typedef struct lookupTableEntry_s {
|
typedef struct lookupTableEntry_s {
|
||||||
const char * const *values;
|
const char * const *values;
|
||||||
|
|
|
@ -65,7 +65,9 @@ class Stamper
|
||||||
output = File.join(@stamp_dir, "stamp")
|
output = File.join(@stamp_dir, "stamp")
|
||||||
stdout, stderr = @compiler.run(input, output, ["-dM", "-E"])
|
stdout, stderr = @compiler.run(input, output, ["-dM", "-E"])
|
||||||
File.delete(input)
|
File.delete(input)
|
||||||
File.delete(output)
|
if File.file?(output)
|
||||||
|
File.delete(output)
|
||||||
|
end
|
||||||
return Digest::SHA1.hexdigest(stdout)
|
return Digest::SHA1.hexdigest(stdout)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -80,7 +80,10 @@ class Compiler
|
||||||
if args
|
if args
|
||||||
all_args.push(*args)
|
all_args.push(*args)
|
||||||
end
|
end
|
||||||
all_args << "-o" << output << input
|
if output
|
||||||
|
all_args << "-o" << output
|
||||||
|
end
|
||||||
|
all_args << input
|
||||||
stdout, stderr, compile_status = Open3.capture3(join_args(all_args))
|
stdout, stderr, compile_status = Open3.capture3(join_args(all_args))
|
||||||
raise "Compiler error:\n#{all_args.join(' ')}\n#{stderr}" if not options[:noerror] and not compile_status.success?
|
raise "Compiler error:\n#{all_args.join(' ')}\n#{stderr}" if not options[:noerror] and not compile_status.success?
|
||||||
return stdout, stderr
|
return stdout, stderr
|
||||||
|
|
|
@ -260,10 +260,10 @@ end
|
||||||
OFF_ON_TABLE = Hash["name" => "off_on", "values" => ["OFF", "ON"]]
|
OFF_ON_TABLE = Hash["name" => "off_on", "values" => ["OFF", "ON"]]
|
||||||
|
|
||||||
class Generator
|
class Generator
|
||||||
def initialize(src_root, settings_file)
|
def initialize(src_root, settings_file, output_dir)
|
||||||
@src_root = src_root
|
@src_root = src_root
|
||||||
@settings_file = settings_file
|
@settings_file = settings_file
|
||||||
@output_dir = File.dirname(settings_file)
|
@output_dir = output_dir || File.dirname(settings_file)
|
||||||
|
|
||||||
@compiler = Compiler.new
|
@compiler = Compiler.new
|
||||||
|
|
||||||
|
@ -416,7 +416,7 @@ class Generator
|
||||||
}
|
}
|
||||||
add_header.call("platform.h")
|
add_header.call("platform.h")
|
||||||
add_header.call("config/parameter_group_ids.h")
|
add_header.call("config/parameter_group_ids.h")
|
||||||
add_header.call("settings.h")
|
add_header.call("fc/settings.h")
|
||||||
|
|
||||||
foreach_enabled_group do |group|
|
foreach_enabled_group do |group|
|
||||||
(group["headers"] || []).each do |h|
|
(group["headers"] || []).each do |h|
|
||||||
|
@ -623,10 +623,12 @@ class Generator
|
||||||
# Use a temporary dir reachable by relative path
|
# Use a temporary dir reachable by relative path
|
||||||
# since g++ in cygwin fails to open files
|
# since g++ in cygwin fails to open files
|
||||||
# with absolute paths
|
# with absolute paths
|
||||||
tmp = File.join("obj", "tmp")
|
tmp = File.join(@output_dir, "tmp")
|
||||||
FileUtils.mkdir_p(tmp) unless File.directory?(tmp)
|
FileUtils.mkdir_p(tmp) unless File.directory?(tmp)
|
||||||
value = yield(tmp)
|
value = yield(tmp)
|
||||||
FileUtils.remove_dir(tmp)
|
if File.directory?(tmp)
|
||||||
|
FileUtils.remove_dir(tmp)
|
||||||
|
end
|
||||||
value
|
value
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -882,17 +884,20 @@ if __FILE__ == $0
|
||||||
exit(1)
|
exit(1)
|
||||||
end
|
end
|
||||||
|
|
||||||
gen = Generator.new(src_root, settings_file)
|
|
||||||
|
|
||||||
opts = GetoptLong.new(
|
opts = GetoptLong.new(
|
||||||
|
[ "--output-dir", "-o", GetoptLong::REQUIRED_ARGUMENT ],
|
||||||
[ "--help", "-h", GetoptLong::NO_ARGUMENT ],
|
[ "--help", "-h", GetoptLong::NO_ARGUMENT ],
|
||||||
[ "--json", "-j", GetoptLong::REQUIRED_ARGUMENT ],
|
[ "--json", "-j", GetoptLong::REQUIRED_ARGUMENT ],
|
||||||
)
|
)
|
||||||
|
|
||||||
jsonFile = nil
|
jsonFile = nil
|
||||||
|
output_dir = nil
|
||||||
|
|
||||||
opts.each do |opt, arg|
|
opts.each do |opt, arg|
|
||||||
case opt
|
case opt
|
||||||
|
when "--output-dir"
|
||||||
|
output_dir = arg
|
||||||
when "--help"
|
when "--help"
|
||||||
usage()
|
usage()
|
||||||
exit(0)
|
exit(0)
|
||||||
|
@ -901,6 +906,8 @@ if __FILE__ == $0
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
gen = Generator.new(src_root, settings_file, output_dir)
|
||||||
|
|
||||||
if jsonFile
|
if jsonFile
|
||||||
gen.write_json(jsonFile)
|
gen.write_json(jsonFile)
|
||||||
else
|
else
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue