Merge remote-tracking branch 'origin/use-fat-jars' into cy-fs-fat-jar

This commit is contained in:
abejgonzalez 2023-05-29 16:05:43 -07:00
commit c48caf3952
9 changed files with 71 additions and 84 deletions

View File

@ -2,6 +2,23 @@ import Tests._
val chiselVersion = "3.5.6"
// keep chisel/firrtl specific class files, drop other conflicts
val chiselFirrtlMergeStrategy = CustomMergeStrategy("cfmergestrategy") { deps =>
import sbtassembly.Assembly.{Project, Library}
val keepDeps = deps.filter { dep =>
val nm = dep match {
case p: Project => p.name
case l: Library => l.moduleCoord.name
}
Seq("firrtl", "chisel3").contains(nm.split("_")(0)) // split by _ to avoid checking on major/minor version
}
if (keepDeps.size <= 1) {
Right(keepDeps.map(dep => JarEntry(dep.target, dep.stream)))
} else {
Left(s"Unable to resolve conflict (${keepDeps.size}>1 conflicts):\n${keepDeps.mkString("\n")}")
}
}
// This is set by CI and should otherwise be unmodified
val apiDirectory = settingKey[String]("The site directory into which the published scaladoc should placed.")
apiDirectory := "latest"
@ -25,7 +42,15 @@ lazy val commonSettings = Seq(
resolvers ++= Seq(
Resolver.sonatypeRepo("snapshots"),
Resolver.sonatypeRepo("releases"),
Resolver.mavenLocal)
Resolver.mavenLocal),
assembly / test := {},
assembly / assemblyMergeStrategy := {
case PathList("chisel3", "stage", xs @ _*) => chiselFirrtlMergeStrategy
case PathList("firrtl", "stage", xs @ _*) => chiselFirrtlMergeStrategy
case x =>
val oldStrategy = (assembly / assemblyMergeStrategy).value
oldStrategy(x)
}
)
// Fork each scala test for now, to work around persistent mutable state

View File

@ -1,6 +1,7 @@
# See LICENSE for license details.
ifdef FIRESIM_STANDALONE
base_dir := $(firesim_base_dir)
chipyard_dir := $(abspath ..)/target-design/chipyard
rocketchip_dir := $(chipyard_dir)/generators/rocket-chip
@ -16,41 +17,20 @@ export SBT_OPTS ?= -Dsbt.ivy.home=$(base_dir)/.ivy2 -Dsbt.global.base=$(base_dir
sbt_sources = $(shell find -L $(base_dir) -name target -prune -o -iname "*.sbt" -print 2> /dev/null)
SCALA_BUILDTOOL_DEPS ?= $(sbt_sources)
SBT_THIN_CLIENT_TIMESTAMP = $(base_dir)/project/target/active.json
ifdef ENABLE_SBT_THIN_CLIENT
override SCALA_BUILDTOOL_DEPS += $(SBT_THIN_CLIENT_TIMESTAMP)
# enabling speeds up sbt loading
SBT_CLIENT_FLAG = --client
endif
# Use java -jar approach by default so that SBT thin-client sees the JAVA flags
# Workaround for behavior reported here: https://github.com/sbt/sbt/issues/6468
SBT_BIN ?= java -jar $(rocketchip_dir)/sbt-launch.jar $(SBT_OPTS)
SBT = $(SBT_BIN) $(SBT_CLIENT_FLAG)
SBT ?= java -jar $(rocketchip_dir)/sbt-launch.jar $(SBT_OPTS)
# (1) - classpath of the fat jar
# (2) - main class
# (3) - main class arguments
define run_scala_main
cd $(base_dir) && $(SBT) ";project $(1); runMain $(2) $(3)"
cd $(base_dir) && java -cp $(1) $(2) $(3)
endef
##############################################################################
# SBT Server Setup (start server / rebuild proj. defs. if SBT_SOURCES change)
##############################################################################
$(SBT_THIN_CLIENT_TIMESTAMP): $(SBT_SOURCES)
ifneq (,$(wildcard $(SBT_THIN_CLIENT_TIMESTAMP)))
cd $(base_dir) && $(SBT) "reload"
touch $@
else
cd $(base_dir) && $(SBT) "exit"
endif
.PHONY: shutdown-sbt-server
shutdown-sbt-server:
cd $(base_dir) && $(SBT) "shutdown"
.PHONY: start-sbt-server
start-sbt-server:
cd $(base_dir) && $(SBT) "exit"
# (1) - sbt project to assemble
# (2) - classpath file(s) to create
define run_sbt_assembly
cd $(base_dir) && $(SBT) ";project $(1); set assembly / assemblyOutputPath := file(\"$(2)\"); assembly"
endef
else # FIRESIM_STANDALONE

View File

@ -28,17 +28,16 @@ $(simulator_verilog) $(simulator_xdc) $(header) $(fame_annos): $(simulator_veril
# Run the 1.3 version instead (checked-in). If dedup must be completely disabled,
# pass --no-legacy-dedup as well
$(simulator_verilog).intermediate: $(FIRRTL_FILE) $(ANNO_FILE) $(FIRESIM_MAIN_CP)
java -cp $$(cat $(FIRESIM_MAIN_CP)) midas.stage.GoldenGateMain \
$(call run_scala_main,$(FIRESIM_MAIN_CP),midas.stage.GoldenGateMain,\
-i $(FIRRTL_FILE) \
-td $(GENERATED_DIR) \
-faf $(ANNO_FILE) \
-ggcp $(PLATFORM_CONFIG_PACKAGE) \
-ggcs $(PLATFORM_CONFIG) \
--output-filename-base $(BASE_FILE_NAME) \
--no-dedup \
--no-dedup)
grep -sh ^ $(GENERATED_DIR)/firrtl_black_box_resource_files.f | \
xargs cat >> $(simulator_verilog) # Append blackboxes to FPGA wrapper, if any
xargs cat >> $(simulator_verilog) # Append blackboxes to FPGA wrapper, if any
####################################
# Runtime-Configuration Generation #
@ -49,10 +48,10 @@ $(simulator_verilog).intermediate: $(FIRRTL_FILE) $(ANNO_FILE) $(FIRESIM_MAIN_CP
# to generate a runtime configuration that is compatible with the generated
# hardware (BridgeModule). Useful for modelling a memory system that differs from the default.
.PHONY: conf
conf: $(fame_annos)
conf: $(fame_annos) $(FIRESIM_MAIN_CP)
mkdir -p $(GENERATED_DIR)
cd $(base_dir) && $(SBT) "project $(FIRESIM_SBT_PROJECT)" "runMain midas.stage.RuntimeConfigGeneratorMain \
$(call run_scala_main,$(FIRESIM_MAIN_CP),midas.stage.RuntimeConfigGeneratorMain,\
-td $(GENERATED_DIR) \
-faf $(fame_annos) \
-ggcp $(PLATFORM_CONFIG_PACKAGE) \
-ggcs $(PLATFORM_CONFIG)"
-ggcs $(PLATFORM_CONFIG))

View File

@ -30,10 +30,9 @@
################################################################################
SBT_COMMAND ?= shell
SBT_NON_THIN ?= $(subst $(SBT_CLIENT_FLAG),,$(SBT))
.PHONY: sbt
sbt:
cd $(base_dir) && $(SBT_NON_THIN) ";project $(FIRESIM_SBT_PROJECT); $(SBT_COMMAND)"
cd $(base_dir) && $(SBT) ";project $(FIRESIM_SBT_PROJECT); $(SBT_COMMAND)"
################################################################################
# Target Configuration
@ -50,19 +49,6 @@ TARGET_SOURCE_DIRS ?=
# Build jars using SBT assembly and cache them.
################################################################################
# Helper to build a classpath for a project. This first builds the project
# while showing error messages, then it runs sbt again with errors disabled to
# capture the classpath from the output (errors are dumped to stdout otherwise).
define build_classpath
bash -c '\
export TMP=$(shell mktemp); \
($(SBT_NON_THIN) \
--error \
"set showSuccess := false; project $(1); compile; package; export $(2):fullClasspath" \
> $$TMP || (cat $$TMP | head -n -1 && rm $$TMP && exit 1)) && \
((cat $$TMP | head -n 1 | tr -d "\n" > $@) 2> /dev/null || true; rm -f $$TMP)'
endef
# Helpers to identify all source files of the FireSim project.
find_sources_in_dir = $(shell \
find -L $(1)/ -name target -prune -o -iname "[!.]*.scala" -print \
@ -88,20 +74,15 @@ firesim_test_srcs = $(foreach dir, $(firesim_source_dirs), \
# FireSim project. This ensures that SBT is invoked once in parallel builds.
$(BUILD_DIR)/firesim.build: $(SCALA_BUILDTOOL_DEPS) $(firesim_main_srcs) $(firesim_test_srcs)
@mkdir -p $(@D)
$(SBT_NON_THIN) "set showSuccess := false; project $(FIRESIM_SBT_PROJECT); compile; package"
$(SBT) "set showSuccess := false; project $(FIRESIM_SBT_PROJECT); compile; package"
@touch $@
FIRESIM_MAIN_CP := $(BUILD_DIR)/firesim-main.classpath
FIRESIM_MAIN_CP := $(BUILD_DIR)/firesim-main.jar
# if *_CLASSPATH is a true java classpath, it can be colon-delimited list of paths (on *nix)
FIRESIM_MAIN_CP_TARGETS := $(subst :, ,$(FIRESIM_MAIN_CP))
$(FIRESIM_MAIN_CP): $(BUILD_DIR)/firesim.build
@mkdir -p $(@D)
cd $(base_dir) && $(call build_classpath,$(FIRESIM_SBT_PROJECT),runtime)
FIRESIM_TEST_CP := $(BUILD_DIR)/firesim-test.classpath
$(FIRESIM_TEST_CP): $(BUILD_DIR)/firesim.build
@mkdir -p $(@D)
cd $(base_dir) && $(call build_classpath,$(FIRESIM_SBT_PROJECT),test)
$(call run_sbt_assembly,$(FIRESIM_SBT_PROJECT),$(FIRESIM_MAIN_CP))
# If the target project is the main FireSim project, provide the test classpath
# as it defines the target configs and parameters for designs to elaborate.
@ -112,23 +93,24 @@ target_srcs = $(foreach dir,$(TARGET_SOURCE_DIRS), \
$(BUILD_DIR)/target.build: $(BUILD_DIR)/firesim.build $(target_srcs)
@mkdir -p $(@D)
$(SBT_NON_THIN) "set showSuccess := false; project $(TARGET_SBT_PROJECT); compile; package"
$(SBT) "set showSuccess := false; project $(TARGET_SBT_PROJECT); compile; package"
@touch $@
TARGET_CP := $(BUILD_DIR)/target.classpath
TARGET_CP := $(BUILD_DIR)/target.jar
# if *_CLASSPATH is a true java classpath, it can be colon-delimited list of paths (on *nix)
TARGET_CP_TARGETS ?= $(subst :, ,$(TARGET_CP))
$(TARGET_CP): $(BUILD_DIR)/target.build
@mkdir -p $(@D)
cd $(base_dir) && $(call build_classpath,$(TARGET_SBT_PROJECT),runtime)
$(call run_sbt_assembly,$(TARGET_SBT_PROJECT),$(TARGET_CP))
else
TARGET_CP := $(FIRESIM_TEST_CP)
TARGET_CP :=
endif
.PHONY: firesim-main-classpath firesim-test-classpath target-classpath
.PHONY: firesim-main-classpath target-classpath
firesim-main-classpath: $(FIRESIM_MAIN_CP)
firesim-test-classpath: $(FIRESIM_TEST_CP)
target-classpath: $(TARGET_CP)
################################################################################
@ -136,12 +118,12 @@ target-classpath: $(TARGET_CP)
################################################################################
.PHONY: test
test: $(FIRESIM_MAIN_CP) $(FIRESIM_TEST_CP) $(TARGET_CP)
cd $(base_dir) && $(SBT_NON_THIN) ";project $(FIRESIM_SBT_PROJECT); test"
test: $(FIRESIM_MAIN_CP) $(TARGET_CP)
cd $(base_dir) && $(SBT) ";project $(FIRESIM_SBT_PROJECT); test"
.PHONY: testOnly
testOnly: $(FIRESIM_MAIN_CP) $(FIRESIM_TEST_CP) $(TARGET_CP)
cd $(base_dir) && java -cp $$(cat $(FIRESIM_TEST_CP)) org.scalatest.run $(SCALA_TEST)
testOnly: $(FIRESIM_MAIN_CP) $(TARGET_CP)
$(call run_scala_main,$(FIRESIM_MAIN_CP),org.scalatest.run,$(SCALA_TEST))
################################################################################
# ScalaDoc
@ -149,4 +131,4 @@ testOnly: $(FIRESIM_MAIN_CP) $(FIRESIM_TEST_CP) $(TARGET_CP)
.PHONY: scaladoc
scaladoc:
cd $(base_dir) && $(SBT) "project {file:$(firesim_base_dir)}firesim" "unidoc"
cd $(base_dir) && $(SBT) ";project $(FIRESIM_SBT_PROJECT); unidoc"

View File

@ -2,5 +2,6 @@ addSbtPlugin("com.typesafe.sbt" % "sbt-ghpages" % "0.6.3")
addSbtPlugin("com.typesafe.sbt" % "sbt-site" % "1.3.1")
addSbtPlugin("com.eed3si9n" % "sbt-unidoc" % "0.4.1")
addSbtPlugin("ch.epfl.scala" % "sbt-scalafix" % "0.10.4")
addSbtPlugin("ch.epfl.scala" % "sbt-bloop" % "1.5.3")
addSbtPlugin("ch.epfl.scala" % "sbt-bloop" % "1.5.6")
addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.6")
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "2.1.1")

View File

@ -4,8 +4,8 @@ vcs_args = +vcs+initreg+0 +vcs+initmem+0
$(FIRRTL_FILE) $(ANNO_FILE): $(TARGET_CP)
@mkdir -p $(@D)
java -cp $$(cat $(TARGET_CP)) freechips.rocketchip.system.Generator \
$(call run_scala_main,$(TARGET_CP),freechips.rocketchip.system.Generator,\
--target-dir $(GENERATED_DIR) \
--name $(long_name) \
--top-module $(DESIGN_PACKAGE).$(DESIGN) \
--configs $(TARGET_CONFIG_QUALIFIED)
--configs $(TARGET_CONFIG_QUALIFIED))

View File

@ -2,8 +2,8 @@
$(FIRRTL_FILE) $(ANNO_FILE): $(TARGET_CP)
@mkdir -p $(@D)
java -cp $$(cat $(TARGET_CP)) freechips.rocketchip.system.Generator \
$(call run_scala_main,$(TARGET_CP),freechips.rocketchip.system.Generator,\
--target-dir $(GENERATED_DIR) \
--name $(long_name) \
--top-module $(DESIGN_PACKAGE).$(DESIGN) \
--configs $(TARGET_CONFIG_QUALIFIED)
--configs $(TARGET_CONFIG_QUALIFIED))

View File

@ -2,11 +2,11 @@
$(FIRRTL_FILE) $(ANNO_FILE): $(TARGET_CP)
@mkdir -p $(@D)
cd $(base_dir) && java -cp $$(cat $(TARGET_CP)) chipyard.Generator \
$(call run_scala_main,$(TARGET_CP),chipyard.Generator,\
--target-dir $(GENERATED_DIR) \
--name $(long_name) \
--top-module $(DESIGN_PACKAGE).$(DESIGN) \
--legacy-configs $(TARGET_CONFIG_PACKAGE):$(TARGET_CONFIG)
--legacy-configs $(TARGET_CONFIG_PACKAGE):$(TARGET_CONFIG))
#######################################
# Setup Extra Verilator Compile Flags #

View File

@ -2,8 +2,8 @@
$(FIRRTL_FILE) $(ANNO_FILE): $(TARGET_CP)
@mkdir -p $(@D)
java -cp $$(cat $(TARGET_CP)) freechips.rocketchip.system.Generator \
$(call run_scala_main,$(TARGET_CP),freechips.rocketchip.system.Generator,\
--target-dir $(GENERATED_DIR) \
--name $(long_name) \
--top-module $(DESIGN_PACKAGE).$(DESIGN) \
--configs $(TARGET_CONFIG_QUALIFIED)
--configs $(TARGET_CONFIG_QUALIFIED))