1
0
Fork 0
mirror of https://github.com/iNavFlight/inav.git synced 2025-07-24 16:55:29 +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:
Alberto García Hierro 2018-05-25 11:00:12 +01:00
parent 46f0ca8e72
commit bf0f05af5f
6 changed files with 43 additions and 27 deletions

View file

@ -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
endif
TARGET_OBJ_DIR = $(OBJECT_DIR)/$(TARGET)
TARGET_ELF = $(OBJECT_DIR)/$(FORKNAME)_$(TARGET).elf
TARGET_OBJS = $(addsuffix .o,$(addprefix $(OBJECT_DIR)/$(TARGET)/,$(basename $(TARGET_SRC))))
TARGET_DEPS = $(addsuffix .d,$(addprefix $(OBJECT_DIR)/$(TARGET)/,$(basename $(TARGET_SRC))))
TARGET_OBJS = $(addsuffix .o,$(addprefix $(TARGET_OBJ_DIR)/,$(basename $(TARGET_SRC))))
TARGET_DEPS = $(addsuffix .d,$(addprefix $(TARGET_OBJ_DIR)/,$(basename $(TARGET_SRC))))
TARGET_MAP = $(OBJECT_DIR)/$(FORKNAME)_$(TARGET).map
@ -285,20 +286,23 @@ CLEAN_ARTIFACTS += $(TARGET_HEX)
CLEAN_ARTIFACTS += $(TARGET_ELF) $(TARGET_OBJS) $(TARGET_MAP)
# 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
.PHONY: .FORCE settings clean-settings
UTILS_DIR = $(ROOT)/src/utils
SETTINGS_GENERATOR = $(UTILS_DIR)/settings.rb
BUILD_STAMP = $(UTILS_DIR)/build_stamp.rb
STAMP = $(BIN_DIR)/build.stamp
UTILS_DIR = $(ROOT)/src/utils
SETTINGS_GENERATOR = $(UTILS_DIR)/settings.rb
BUILD_STAMP = $(UTILS_DIR)/build_stamp.rb
STAMP = $(TARGET_OBJ_DIR)/build.stamp
GENERATED_SETTINGS = $(SRC_DIR)/fc/settings_generated.h $(SRC_DIR)/fc/settings_generated.c
SETTINGS_FILE = $(SRC_DIR)/fc/settings.yaml
GENERATED_FILES = $(GENERATED_SETTINGS)
GENERATED_SETTINGS = $(TARGET_OBJ_DIR)/settings_generated.h $(TARGET_OBJ_DIR)/settings_generated.c
SETTINGS_FILE = $(SRC_DIR)/fc/settings.yaml
GENERATED_FILES = $(GENERATED_SETTINGS)
$(GENERATED_SETTINGS): $(SETTINGS_GENERATOR) $(SETTINGS_FILE) $(STAMP)
# Make sure the generated files are in the include path
CFLAGS += -I$(TARGET_OBJ_DIR)
$(STAMP): .FORCE
$(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
%generated.h %generated.c:
$(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:
$(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)
# Compile
$(OBJECT_DIR)/$(TARGET)/%.o: %.c
$(TARGET_OBJ_DIR)/%.o: %.c
$(V1) mkdir -p $(dir $@)
$(V1) echo %% $(notdir $<) "$(STDOUT)"
$(V1) $(CROSS_CC) -c -o $@ $(CFLAGS) $<
# Assemble
$(OBJECT_DIR)/$(TARGET)/%.o: %.s
$(TARGET_OBJ_DIR)/%.o: %.s
$(V1) mkdir -p $(dir $@)
$(V1) echo %% $(notdir $<) "$(STDOUT)"
$(V1) $(CROSS_CC) -c -o $@ $(ASFLAGS) $<
$(OBJECT_DIR)/$(TARGET)/%.o: %.S
$(TARGET_OBJ_DIR)/%.o: %.S
$(V1) mkdir -p $(dir $@)
$(V1) echo %% $(notdir $<) "$(STDOUT)"
$(V1) $(CROSS_CC) -c -o $@ $(ASFLAGS) $<
@ -377,8 +381,7 @@ $(VALID_TARGETS):
clean:
$(V0) echo "Cleaning $(TARGET)"
$(V0) rm -f $(CLEAN_ARTIFACTS)
$(V0) rm -rf $(OBJECT_DIR)/$(TARGET)
$(V0) rm -f $(GENERATED_SETTINGS)
$(V0) rm -rf $(TARGET_OBJ_DIR)
$(V0) echo "Cleaning $(TARGET) succeeded."
## clean_test : clean up all temporary / machine-generated files (tests)

View file

@ -4,10 +4,11 @@
#include "common/string_light.h"
#include "common/utils.h"
#include "fc/settings_generated.h"
#include "settings_generated.h"
#include "fc/settings.h"
#include "fc/settings_generated.c"
#include "settings_generated.c"
void setting_get_name(const setting_t *val, char *buf)
{

View file

@ -6,7 +6,7 @@
#include "config/parameter_group.h"
#include "fc/settings_generated.h"
#include "settings_generated.h"
typedef struct lookupTableEntry_s {
const char * const *values;

View file

@ -65,7 +65,9 @@ class Stamper
output = File.join(@stamp_dir, "stamp")
stdout, stderr = @compiler.run(input, output, ["-dM", "-E"])
File.delete(input)
File.delete(output)
if File.file?(output)
File.delete(output)
end
return Digest::SHA1.hexdigest(stdout)
end
end

View file

@ -80,7 +80,10 @@ class Compiler
if args
all_args.push(*args)
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))
raise "Compiler error:\n#{all_args.join(' ')}\n#{stderr}" if not options[:noerror] and not compile_status.success?
return stdout, stderr

View file

@ -260,10 +260,10 @@ end
OFF_ON_TABLE = Hash["name" => "off_on", "values" => ["OFF", "ON"]]
class Generator
def initialize(src_root, settings_file)
def initialize(src_root, settings_file, output_dir)
@src_root = src_root
@settings_file = settings_file
@output_dir = File.dirname(settings_file)
@output_dir = output_dir || File.dirname(settings_file)
@compiler = Compiler.new
@ -416,7 +416,7 @@ class Generator
}
add_header.call("platform.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|
(group["headers"] || []).each do |h|
@ -623,10 +623,12 @@ class Generator
# Use a temporary dir reachable by relative path
# since g++ in cygwin fails to open files
# with absolute paths
tmp = File.join("obj", "tmp")
tmp = File.join(@output_dir, "tmp")
FileUtils.mkdir_p(tmp) unless File.directory?(tmp)
value = yield(tmp)
FileUtils.remove_dir(tmp)
if File.directory?(tmp)
FileUtils.remove_dir(tmp)
end
value
end
@ -882,17 +884,20 @@ if __FILE__ == $0
exit(1)
end
gen = Generator.new(src_root, settings_file)
opts = GetoptLong.new(
[ "--output-dir", "-o", GetoptLong::REQUIRED_ARGUMENT ],
[ "--help", "-h", GetoptLong::NO_ARGUMENT ],
[ "--json", "-j", GetoptLong::REQUIRED_ARGUMENT ],
)
jsonFile = nil
output_dir = nil
opts.each do |opt, arg|
case opt
when "--output-dir"
output_dir = arg
when "--help"
usage()
exit(0)
@ -901,6 +906,8 @@ if __FILE__ == $0
end
end
gen = Generator.new(src_root, settings_file, output_dir)
if jsonFile
gen.write_json(jsonFile)
else