diff --git a/lib/default.nix b/lib/default.nix index 4894cae..981fe24 100644 --- a/lib/default.nix +++ b/lib/default.nix @@ -124,7 +124,7 @@ in rec { let f = head: input: if hasAttr "manifest" input then - "${head},${input.pname}=${input.manifest}" + "${head},${nixpkgs.lib.getName input}=${input.manifest}" else abort "${input.pname} does not have a manifest"; in (foldl' f "{" inputs) + "}"; diff --git a/overlay/libc/default.nix b/overlay/libc/default.nix index c8d23b0..423ff9c 100644 --- a/overlay/libc/default.nix +++ b/overlay/libc/default.nix @@ -1,27 +1,31 @@ # SPDX-License-Identifier: CC0-1.0 -{ genodeSources, genodeBase }: +{ genodeSources, genodeBase, writeText }: -genodeSources.buildUpstream { - name = "libc"; - outputs = [ "out" "dev" ]; - targets = [ "LIB=libm" ]; - portInputs = [ genodeSources.ports.libc ]; +genodeSources.buildDepot { + name = "posix"; propagatedBuildInputs = [ genodeBase ]; - - LIBC_PORT = genodeSources.ports.libc; + portInputs = [ genodeSources.ports.libc ]; + preInstall = + # Take the libc ABI stubs rather than the actual libc. + # The libc needs a lot of work and we can't afford to + # rebuild the toolchain for every fix. + '' + find depot -name libc.abi.so -exec install -D {} "''${!outputLib}/libc.so" \; + ''; postInstall = '' - mkdir -p $dev/include - pushd $LIBC_PORT/* + local headerDir="''${!outputDev}/include" + mkdir -p "$headerDir" + pushd ${genodeSources.ports.libc}/* cp -r \ include/libc/* \ include/openlibm/* \ $GENODE_DIR/repos/libports/include/libc \ - $dev/include/ + "$headerDir" for spec in ${toString genodeSources.specs}; do dir=include/spec/$spec/libc if [ -d $dir ]; then - cp -r $dir/* $dev/include/ + cp -r $dir/* "$headerDir" fi done popd diff --git a/packages/genodelabs/LIB.patch b/packages/genodelabs/LIB.patch new file mode 100644 index 0000000..9348270 --- /dev/null +++ b/packages/genodelabs/LIB.patch @@ -0,0 +1,125 @@ +commit 91ad094b581afde72199de1029fdd0ff3103d731 +Author: Emery Hemingway +Date: Tue May 5 21:39:21 2020 +0530 + + Produce libraries with conventional names + +diff --git a/repos/base/mk/dep_lib.mk b/repos/base/mk/dep_lib.mk +index b3c980c906..385318bd46 100644 +--- a/repos/base/mk/dep_lib.mk ++++ b/repos/base/mk/dep_lib.mk +@@ -142,8 +142,8 @@ endif + echo " DEBUG_DIR=\$$(DEBUG_DIR)"; \ + echo "") >> $(LIB_DEP_FILE) + ifdef SHARED_LIB +- @(echo "SO_NAME($(LIB)) := $(LIB).lib.so"; \ +- echo "") >> $(LIB_DEP_FILE) ++ @(echo "SO_NAME($(LIB)) := lib$(LIB).so"; \ ++ echo "") | sed -e 's/libld.so/ld.lib.so/' -e 's/liblib/lib/' >> $(LIB_DEP_FILE) + else + @(echo "ARCHIVE_NAME($(LIB)) := $(LIB).lib.a"; \ + echo "") >> $(LIB_DEP_FILE) +diff --git a/repos/base/mk/dep_prg.mk b/repos/base/mk/dep_prg.mk +index 190dd92aa1..6611d05d2a 100644 +--- a/repos/base/mk/dep_prg.mk ++++ b/repos/base/mk/dep_prg.mk +@@ -93,7 +93,7 @@ endif + # if the target does not depend on any library with unsatisfied build + # requirements. In such a case, the target cannot be linked anyway. + # +- @(echo "ifeq (\$$(filter \$$(DEP_A_$(TARGET).prg:.lib.a=) \$$(DEP_SO_$(TARGET).prg:.lib.so=) $(LIBS),\$$(INVALID_DEPS)),)"; \ ++ @(echo "ifeq (\$$(filter \$$(DEP_A_$(TARGET).prg:.lib.a=) \$$(patsubst lib%.lib.so,%,$(DEP_SO_$(TARGET).prg)) $(LIBS),\$$(INVALID_DEPS)),)"; \ + echo "all: $(TARGET).prg"; \ + echo "endif") >> $(LIB_DEP_FILE) + # +diff --git a/repos/base/mk/generic.mk b/repos/base/mk/generic.mk +index d551ac205b..e23fade62f 100644 +--- a/repos/base/mk/generic.mk ++++ b/repos/base/mk/generic.mk +@@ -129,7 +129,7 @@ binary_%.o: % + # This is a problem in situations where the undefined symbol is resolved by an + # archive rather than the target. I.e., when linking posix.lib.a (which + # provides 'Libc::Component::construct'), the 'construct' function is merely +-# referenced by the libc.lib.so's 'Component::construct' function. But this ++# referenced by the libc.so's 'Component::construct' function. But this + # reference apparently does not suffice to keep the posix.lib.a's symbol. By + # adding a hard dependency, we force the linker to resolve the symbol and don't + # drop posix.lib.a. +@@ -164,12 +164,17 @@ endif + # time a user of the library is linked, the ABI stub should be used instead of + # the library. + # +-select_so = $(firstword $(wildcard $(LIB_CACHE_DIR)/$(1:.lib.so=)/$(1:.lib.so=).abi.so \ +- $(LIB_CACHE_DIR)/$(1:.lib.so=)/$(1:.lib.so=).lib.so)) ++select_so = $(firstword $(wildcard \ ++ $(LIB_CACHE_DIR)/$(patsubst lib%.so,%,$1)/$(patsubst lib%.so,%,$1).abi.so \ ++ $(LIB_CACHE_DIR)/$(patsubst lib%.so,%,$1)/$(1) \ ++ $(LIB_CACHE_DIR)/$(patsubst %.so,%,$1)/$(1) \ ++ $(LIB_CACHE_DIR)/$(1:.lib.so=)/$(1:.lib.so=).abi.so \ ++ $(LIB_CACHE_DIR)/$(1:.lib.so=)/$(1:.lib.so=).lib.so \ ++ $(LIB_CACHE_DIR)/$(1:.so=)/$(1:.so=).abi.so )) + + ifneq ($(filter-out $(foreach s,$(SHARED_LIBS),$(realpath $s)), \ + $(foreach s,$(SHARED_LIBS),$(call select_so,$s))),) + .PHONY: $(SHARED_LIBS) + endif + $(SHARED_LIBS): +- $(VERBOSE)ln -sf $(call select_so,$@) $@ ++ $(VERBOSE)ln -sf $(call select_so,$@) $(patsubst liblib%,lib%,$@) +diff --git a/repos/base/mk/lib.mk b/repos/base/mk/lib.mk +index c482457af6..7abae9ecdc 100644 +--- a/repos/base/mk/lib.mk ++++ b/repos/base/mk/lib.mk +@@ -123,14 +123,20 @@ message: + include $(BASE_DIR)/mk/generic.mk + + # +-# Name of .lib.a or .lib.so file to create ++# Name of .lib.a or lib.so file to create + # + # Skip the creation and installation of an .so file if there are no + # ingredients. This is the case if the library is present as ABI only. + # + ifdef SHARED_LIB + ifneq ($(sort $(OBJECTS) $(LIBS)),) +- LIB_SO := $(addsuffix .lib.so,$(LIB)) ++ ifeq ($(LIB),ld) ++ LIB_SO := ld.lib.so ++ else ifeq ($(patsubst ld-%,ld-,$(LIB)),ld-) ++ LIB_SO := $(LIB).lib.so ++ else ++ LIB_SO := $(patsubst liblib%,lib%,$(patsubst %,lib%.so,$(LIB))) ++ endif + INSTALL_SO := $(INSTALL_DIR)/$(LIB_SO) + DEBUG_SO := $(DEBUG_DIR)/$(LIB_SO) + endif +@@ -150,7 +156,7 @@ ifneq ($(LIB_SO),) + endif + + # +-# Trigger the creation of the .lib.a or .lib.so file ++# Trigger the creation of the .lib.a or lib.so file + # + LIB_TAG := $(addsuffix .lib.tag,$(LIB)) + all: $(LIB_TAG) +@@ -202,7 +208,7 @@ STATIC_LIBS := $(sort $(foreach l,$(ARCHIVES:.lib.a=),$(LIB_CACHE_DIR)/$l/ + STATIC_LIBS_BRIEF := $(subst $(LIB_CACHE_DIR),$$libs,$(STATIC_LIBS)) + + # +-# Rule to build the .lib.so file ++# Rule to build the lib.so file + # + # When linking the shared library, we have to link all shared sub libraries + # (LIB_SO_DEPS) to the library to store the library-dependency information in +diff --git a/repos/base/mk/prg.mk b/repos/base/mk/prg.mk +index 04caae01b2..8d64b0d34e 100644 +--- a/repos/base/mk/prg.mk ++++ b/repos/base/mk/prg.mk +@@ -235,6 +235,6 @@ endif + clean_prg_objects: + $(MSG_CLEAN)$(PRG_REL_DIR) + $(VERBOSE)$(RM) -f $(OBJECTS) $(OBJECTS:.o=.d) $(TARGET) $(TARGET).stripped $(BINDER_SRC) +- $(VERBOSE)$(RM) -f *.d *.i *.ii *.s *.ali *.lib.so ++ $(VERBOSE)$(RM) -f *.d *.i *.ii *.s *.ali *.lib.so lib*.so + + clean: clean_prg_objects diff --git a/packages/genodelabs/default.nix b/packages/genodelabs/default.nix index 7ca6c99..d8efec6 100644 --- a/packages/genodelabs/default.nix +++ b/packages/genodelabs/default.nix @@ -25,8 +25,8 @@ let url = "https://github.com/genodelabs/genode/archive/${version}.tar.gz"; hash = "sha256-ZY9ND6vDA9u127TAv87uOjPuLzRzBPyp5PzD6iM7uNI="; }; - nativeBuildInputs = [ expect gnumake tcl ]; + patches = [ ./LIB.patch ]; configurePhase = '' patchShebangs ./tool substituteInPlace repos/base/etc/tools.conf \ @@ -151,13 +151,13 @@ let ''; }); - buildDepot = { name, portInputs ? [ ], nativeBuildInputs ? [ ] - , enableParallelBuilding ? true, ... }@extraAttrs: + buildDepot = { name, apiOnly ? false, portInputs ? [ ] + , nativeBuildInputs ? [ ], ... }@extraAttrs: stdenv'.mkDerivation (extraAttrs // { pname = name; inherit (genodeSources) version; - inherit enableParallelBuilding; + enableParallelBuilding = true; nativeBuildInputs = [ binutils bison flex stdenv.cc tcl which ] ++ nativeBuildInputs; @@ -181,6 +181,7 @@ let ''; STRIP_TARGET_CMD = "cp $< $@"; + # defer strip until fixup phase makefile = "tool/depot/create"; makeFlags = [ @@ -188,13 +189,16 @@ let # by default the build system will refuse to be useful "FORCE=1" + "KEEP_BUILD_DIR=1" "UPDATE_VERSIONS=1" "VERBOSE=" ]; installPhase = '' runHook preInstall - find depot/genodelabs/bin -type f -exec install -Dt $out {} \; + rm -r depot/genodelabs/bin/${arch}/${name}/*\.build + find depot/genodelabs/bin/${arch}/${name} -type f -exec install -Dt "''${!outputBin}" {} \; + moveToOutput "lib*.so" "''${!outputLib}/lib" runHook postInstall ''; diff --git a/packages/genodelabs/targets.nix b/packages/genodelabs/targets.nix index 168be19..287bce2 100644 --- a/packages/genodelabs/targets.nix +++ b/packages/genodelabs/targets.nix @@ -44,6 +44,8 @@ with ports; { vesa_drv.portInputs = [ libc x86emu ]; + vfs.outputs = [ "out" "lib" ]; + vfs_jitterentropy.portInputs = [ jitterentropy libc ]; vfs_lwip.portInputs = [ lwip ]; vfs_ttf.portInputs = [ libc stb ]; diff --git a/tests/default.nix b/tests/default.nix index 9176c62..ba399b7 100644 --- a/tests/default.nix +++ b/tests/default.nix @@ -13,6 +13,11 @@ let set -eu echo -n '[' >> $out find $drv/ -type f -printf ',{mapKey= "%f",mapValue="%p"}' >> $out + ${if builtins.elem "lib" drv.outputs then + '' + find ${drv.lib}/ -type f -printf ',{mapKey= "%f",mapValue="%p"}' >> $out'' + else + ""} echo -n ']' >> $out ''; };