diff --git a/.gitea/workflows/build.yaml b/.gitea/workflows/build.yaml index 1b9a55d..05a769e 100644 --- a/.gitea/workflows/build.yaml +++ b/.gitea/workflows/build.yaml @@ -57,7 +57,9 @@ jobs: hash -r csc -version - # Eggs are pinned in eggs.lock and installed by the Makefile into .eggs/. + - name: Install dependencies + run: make deps + - name: Build sexc run: make && ./sexc --help diff --git a/Makefile b/Makefile index 0d5eebf..8b15de0 100644 --- a/Makefile +++ b/Makefile @@ -34,24 +34,27 @@ DEPSLOCK = eggs.lock EGGS_DIR := $(abspath .eggs) # Compiler's own repository (types.db, chicken.*), ignoring ambient venv vars. -SYSTEM_CHICKEN_REPO := $(shell env -u CHICKEN_INSTALL_REPOSITORY -u CHICKEN_REPOSITORY_PATH -u CHICKEN_EGG_CACHE -u CHICKEN_INSTALL_PREFIX $(CHICKEN_INSTALL) -repository 2>/dev/null) +SYSTEM_CHICKEN_REPO := $(shell env \ + -u CHICKEN_INSTALL_REPOSITORY -u CHICKEN_REPOSITORY_PATH \ + -u CHICKEN_EGG_CACHE -u CHICKEN_INSTALL_PREFIX \ + $(CHICKEN_INSTALL) -repository 2>/dev/null) CHICKEN_ABI := $(notdir $(SYSTEM_CHICKEN_REPO)) EGGS_STAMP := $(EGGS_DIR)/.installed-$(CHICKEN_ABI) -export CHICKEN_EGG_CACHE := $(EGGS_DIR)/cache -export CHICKEN_INSTALL_REPOSITORY := $(EGGS_DIR) -export CHICKEN_INSTALL_PREFIX := $(EGGS_DIR) +# Try project-local chicken repository first. In case it doesn't exist (packaging for distros), +# system-wide repository will be used. +unexport CHICKEN_INSTALL_REPOSITORY +unexport CHICKEN_EGG_CACHE +unexport CHICKEN_INSTALL_PREFIX export CHICKEN_REPOSITORY_PATH := $(EGGS_DIR):$(SYSTEM_CHICKEN_REPO) all: sexc -sexc: $(EGGS_STAMP) $(OBJ) main.scm +sexc: $(OBJ) main.scm $(CHICKEN_C) $(CSC_FLAGS) main.scm -o sexc-tmp -link sexc # otherwise csc hangs, probably because it tries to compile to sexc.o first mv sexc-tmp sexc -$(OBJ): $(EGGS_STAMP) - #------------------------------------------------------------------ utils.o: utils.module.scm utils.scm @@ -82,11 +85,11 @@ sexc.o: sexc.module.scm types.o sexc.scm fmt-c-writer.o sex-macros.o sex-modules $(CHICKEN_C) $(CSC_FLAGS) $(MODULE_FLAGS) sexc.module.scm -o sexc.o -unit sexc -link fmt-c-writer,sex-macros,sex-modules,reader,semen,types,utils # Unit testing -sex-tests: $(EGGS_STAMP) +sex-tests: $(MAKE) -C ./tests sex-tests cp ./tests/sex-tests ./ -sextest: $(EGGS_STAMP) +sextest: $(MAKE) -C ./tools/sextest sextest cp ./tools/sextest/sextest . @@ -116,9 +119,11 @@ installdirs: uninstall: rm -f $(DESTDIR)$(bindir)/sexc -# eggs.lock is the pin file (chicken-status -list). Install from it; -# do not float versions on a normal build. Regenerating the lock: -# make deps-update +$(EGGS_STAMP) deps-update: export CHICKEN_EGG_CACHE := $(EGGS_DIR)/cache +$(EGGS_STAMP) deps-update: export CHICKEN_INSTALL_REPOSITORY := $(EGGS_DIR) +$(EGGS_STAMP) deps-update: export CHICKEN_INSTALL_PREFIX := $(EGGS_DIR) +$(EGGS_STAMP) deps-update: export CHICKEN_REPOSITORY_PATH := $(EGGS_DIR):$(SYSTEM_CHICKEN_REPO) + $(EGGS_STAMP): $(DEPSLOCK) mkdir -p $(CHICKEN_EGG_CACHE) $(CHICKEN_INSTALL) -force -from-list $(DEPSLOCK) @@ -126,10 +131,10 @@ $(EGGS_STAMP): $(DEPSLOCK) deps: $(EGGS_STAMP) -deps-update: $(DEPSFILE) - rm -rf $(EGGS_DIR) +deps-update: $(DEPSFILE) deps-clean mkdir -p $(CHICKEN_EGG_CACHE) $(CHICKEN_INSTALL) -force $$(cat $(DEPSFILE)) + # Local repo only: a system path here would leak distro eggs into the lock. CHICKEN_REPOSITORY_PATH=$(EGGS_DIR) $(CHICKEN_STATUS) -list | sort > $(DEPSLOCK).tmp mv $(DEPSLOCK).tmp $(DEPSLOCK) touch $(EGGS_STAMP) diff --git a/Readme.org b/Readme.org index e335085..11e4efa 100644 --- a/Readme.org +++ b/Readme.org @@ -12,22 +12,25 @@ Sex is statically typed, compiled general purpose language. First, get yourself a Chicken, then, some Chicken deps. You also will need a C compiler. -Eggs are installed into a project-local ~.eggs/~ repository; they do not -touch the Chicken system repository. - -** Compilation +** Development #+begin_src sh + make deps make #+end_src -That installs pinned eggs from ~eggs.lock~ into ~.eggs/~ if needed, then -builds ~sexc~. ~dependencies.txt~ is the unpinned request list. To -refresh ~eggs.lock~ after changing it: +~make deps~ installs pinned eggs from ~eggs.lock~ into a project-local +~.eggs/~ repository. ~dependencies.txt~ is the unpinned request list. +To refresh ~eggs.lock~ after changing it: #+begin_src sh make deps-update #+end_src +** Packaging for system package managers +- Depend ~sex~ package on Chicken-6 (with ~libchicken.a~) and all eggs from ~dependencies.txt~. +- Compile and install with ~make~ (usually no other arguments required). +- Move resulting ~sexc~ binary to the appropriate place. + ** Static compilation The default ~CSC_FLAGS~ include ~-static~, so ~sexc~ does not need ~.eggs~ at runtime and ~make install~ stays relocatable. Chicken must