summaryrefslogtreecommitdiff
path: root/llbuild
diff options
context:
space:
mode:
Diffstat (limited to 'llbuild')
-rw-r--r--llbuild/Makefile12
-rw-r--r--llbuild/Makefile.build3
-rw-r--r--llbuild/Makefile.include141
-rw-r--r--llbuild/Makefile.subdir-sample9
-rw-r--r--llbuild/Makefile.toplevel-sample35
-rw-r--r--llbuild/README38
-rw-r--r--llbuild/llflock.c116
7 files changed, 116 insertions, 238 deletions
diff --git a/llbuild/Makefile b/llbuild/Makefile
deleted file mode 100644
index 480fd54..0000000
--- a/llbuild/Makefile
+++ /dev/null
@@ -1,12 +0,0 @@
-HOSTCC ?= gcc
-
-targets = llflock
-
-all: $(targets)
-
-llflock: llflock.c
- @$(HOSTCC) -o llflock llflock.c
-
-clean:
- @rm -f *.o $(targets)
-
diff --git a/llbuild/Makefile.build b/llbuild/Makefile.build
deleted file mode 100644
index 7b7aeaa..0000000
--- a/llbuild/Makefile.build
+++ /dev/null
@@ -1,3 +0,0 @@
-# This is used to kick the build around double inclusion of local Makefile
-
-
diff --git a/llbuild/Makefile.include b/llbuild/Makefile.include
index effb768..eb68b45 100644
--- a/llbuild/Makefile.include
+++ b/llbuild/Makefile.include
@@ -24,86 +24,80 @@
ifndef _LL_BUILD_MAKEFILE_INCLUDE
_LL_BUILD_MAKEFILE_INCLUDE=1
-#$(warning Hello, from $(CURDIR))
--include $(TOPDIR)/.config
+# this is here to enforce a sensible default target
+__kicker_target: all
-LLBUILD ?= $(TOPDIR)/llbuild
-
-built_in_target := built-in.o
-
-all_objects := $(obj-builtin)
-all_objects += $(foreach t,$(extra_targets),$($(t)))
-
-filter_subdirs := $(shell for d in $(subdirs) $(all_objects) ; do if [ -d $$d ]; then echo $$d; fi; done)
+TOPDIR := $(CURDIR)
-filter_objects := $(shell for f in $(all_objects) ; do if [ -d $$f ]; then echo $$f/built-in.o; else echo $$f; fi; done)
-builtin_filter_objects := $(shell for f in $(obj-builtin) ; do if [ -d $$f ]; then echo $$f/built-in.o; else echo $$f; fi; done)
+# import all the subdir Makefiles recursively
-real_subdirs := $(foreach dir,$(filter_subdirs),$(shell readlink -f $(CURDIR)/$(dir)))
-subdir_deps := $(foreach path,$(real_subdirs),$(dir $(path)).$(notdir $(path).subdir.d))
+define import_dir
+ subdirs :=
+ objects :=
+ targets :=
+ LLPWD := $(1)
+ include $(1)/Makefile
+ dep_files := $$(wildcard $(1)/.*.d)
+ifneq ($$(dep_files),)
+ include $$(dep_files)
+endif
+ all-targets := $$(all-targets) $$(targets)
+ all-objects := $$(all-objects) $$(patsubst %,$(1)/%,$$(objects))
+ tmp := $$(patsubst %,$(1)/%,$$(subdirs))
+ perkele := $$(foreach dir,$$(tmp),$$(eval $$(call import_dir,$$(dir))))
+endef
-.PRECIOUS: $(filter_objects)
+$(foreach dir,$(subdirs),$(eval $(call import_dir,$(dir))))
-LOCK ?= $(LLBUILD)/llflock $@.lock
-%.subdir.d:
- @if [ ! -e $@.lock ]; then touch $@.lock; fi
- @$(LOCK) /bin/sh -c "if [ ! -e $@ ]; then $(MAKE) --no-print-directory -C $(dir $@)$(patsubst .%,%,$(patsubst %.subdir.d,%,$(notdir $@))) -f $(LLBUILD)/Makefile.build ll_subdir && touch $@; fi;"
+built_in_target := built-in.o
+all_objects := $(obj-builtin)
+all_objects += $(foreach t,$(extra_targets),$($(t)))
-# these are for handling extra_targets
-bin-%: $(filter_objects)
- @run_sources="$($@)"; \
- run_target="$(patsubst bin-%,%,$@)"; \
- run_cmd="$(CC) $(CCFLAGS) $(LDFLAGS) -o $(patsubst bin-%,%,$@) $(shell for f in $($@) ; do if [ -d $$f ]; then echo $$f/built-in.o; else echo $$f; fi; done) $(LIBS)"; \
+define llbuild_link_shbin
+ @run_sources="$^"; \
+ run_target="$@"; \
+ run_cmd="$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LIBS)"; \
run_alias="BIN"; \
$(ll_pretty_run)
+endef
-cxxbin-%: $(filter_objects)
- @run_sources="$($@)"; \
- run_target="$(patsubst cxxbin-%,%,$@)"; \
- run_cmd="$(CXX) $(CFLAGS) $(LDFLAGS) $(CXXFLAGS) -o $(patsubst cxxbin-%,%,$@) $(shell for f in $($@) ; do if [ -d $$f ]; then echo $$f/built-in.o; else echo $$f; fi; done) $(LIBS)"; \
+define llbuild_link_shcxxbin
+ @run_sources="$^"; \
+ run_target="$@"; \
+ run_cmd="$(CXX) $(CFLAGS) $(LDFLAGS) $(CXXFLAGS) -o $@ $^ $(LIBS)"; \
run_alias="CXXBIN"; \
$(ll_pretty_run)
+endef
-shlib-%: $(filter_objects)
- @run_sources="$($@)"; \
- run_target="$(patsubst shlib-%,%,$@)"; \
- run_cmd="$(CC) $(CFLAGS) $(LDFLAGS) -shared -o $(patsubst shlib-%,%,$@) $(shell for f in $($@) ; do if [ -d $$f ]; then echo $$f/built-in.o; else echo $$f; fi; done) $(LIBS)"; \
+define llbuild_link_shlib
+ @run_sources="$^"; \
+ run_target="$@"; \
+ run_cmd="$(CC) $(CFLAGS) $(LDFLAGS) -shared -o $@ $^ $(LIBS)"; \
run_alias="SHLIB"; \
$(ll_pretty_run)
+endef
-ll_mainlevel:
- @find $(TOPDIR) -name "*.subdir.d.lock" -o -name "*.subdir.d" | xargs rm -f
- @$(MAKE) --no-print-directory -f $(LLBUILD)/Makefile.build ll_subdir
-
-
-ll_subdir: $(subdir_deps)
- @$(MAKE) --no-print-directory -f $(LLBUILD)/Makefile.build $(built_in_target) $(extra_targets)
-
-ifeq ("$(strip $(builtin_filter_objects))", "")
-$(built_in_target):
- @true
-else
-$(built_in_target): $(builtin_filter_objects)
- $(ll_pretty_link_builtin)
-endif
+define llbuild_link_archive
+ @run_sources=""; \
+ run_target="$@"; \
+ run_cmd="$(CC) -Wl,-r -nostdlib -nodefaultlibs -nostartfiles -o $@ $^"; \
+ run_alias="ARCHIVE"; \
+ $(ll_pretty_run)
+endef
-OPT_CURDIR = $(patsubst /%,%,$(strip $(subst $(TOPDIR), , $(CURDIR))))
-ifeq ("$(OPT_CURDIR)","")
-OPT_CURDIR="."
-endif
ifndef ll_verbose
define ll_pretty_run
run_output="$$($$run_cmd 2>&1)"; \
if [ $$? -ne 0 ]; then \
- echo "$$run_cmd"; echo $(OPT_CURDIR)/"$$run_output"; \
+ echo "$$run_cmd"; echo "$$run_output"; \
false; \
else \
- echo "[$$run_alias] [$(OPT_CURDIR)/$$run_target] $$run_sources"; \
+ echo "[$$run_alias] [$$run_target] $$run_sources"; \
echo "$$run_output" | grep " warning: "; \
true ; \
fi
@@ -134,59 +128,34 @@ endef
define ll_pretty_link_builtin
@run_sources="$^"; \
run_target="$@"; \
- run_cmd="$(LD) -r -nostartfiles -o $@ $^"; \
+ run_cmd="$(CC) -Wl,-r -nostdlib -nodefaultlibs -nostartfiles -o $@ $^"; \
run_alias="LD"; \
$(ll_pretty_run)
endef
-define ll_pretty_link_shared_library
- @run_sources="$^"; \
- run_target="$@"; \
- run_cmd="$(CC) $(CFLAGS) $(LDFLAGS) -shared -o $@ $^ $(LIBS)"; \
- run_alias="SHLIB"; \
- $(ll_pretty_run)
-endef
-
-define ll_pretty_link_shared_binary
- @run_sources="$^"; \
- run_target="$@"; \
- run_cmd="$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LIBS)"; \
- run_alias="BIN";\
- $(ll_pretty_run)
- echo "after linking shared binary"
-endef
-
-%.o: %.S
+%.o:: %.S
$(ll_pretty_build_c)
-%.o: %.c
+%.o:: %.c
$(ll_pretty_build_c)
-%.o: %.cc
+%.o:: %.cc
$(ll_pretty_build_cc)
-%.o: %.cpp
+%.o:: %.cpp
$(ll_pretty_build_cc)
+%:: %.cc
-dep_files = $(wildcard .*.d)
+%:: %.c
-ifneq ("$(dep_files)", "")
- include $(dep_files)
-endif
+%:: %.o
-.PHONY: build $(subdirs)
define ll_clean
- +@$(MAKE) --no-print-directory -C $(LLBUILD) MAKEFLAGS= MAKEFILES= clean
rm -rf $(CLEAN_FILES)
find . -name "*.[oasd]" -o -name ".*.d" -o -name "*.*~" -o -name "*~" -o -name "*.lock" | xargs rm -rf
endef
-define ll_toplevel_build
- +@$(MAKE) --no-print-directory -C $(LLBUILD) MAKEFLAGS= MAKEFILES=
- +@$(MAKE) --no-print-directory -f $(LLBUILD)/Makefile.build ll_mainlevel
-endef
-
endif
diff --git a/llbuild/Makefile.subdir-sample b/llbuild/Makefile.subdir-sample
index 43c8caa..9a81d86 100644
--- a/llbuild/Makefile.subdir-sample
+++ b/llbuild/Makefile.subdir-sample
@@ -1,10 +1,11 @@
CFLAGS += -Wall -W -fPIC
LIBS = -ldl -lm
-obj-default = ../lua libsb2.o libsb_env.o sb_alien.o
+export CFLAGS LIBS
-extra_targets = libsb2.so
+obj-builtin = ../lua libsb2.o libsb_env.o sb_alien.o
+shlib-libsb2.so = built-in.o
+
+extra_targets = shlib-libsb2.so
-libsb2.so: built-in.o
- $(ll_pretty_link_shared_library)
diff --git a/llbuild/Makefile.toplevel-sample b/llbuild/Makefile.toplevel-sample
index ad7ce88..3ef9cef 100644
--- a/llbuild/Makefile.toplevel-sample
+++ b/llbuild/Makefile.toplevel-sample
@@ -1,17 +1,24 @@
+# mandatory llbuild variables
+
+TOPDIR = $(CURDIR)
+LLBUILD = $(TOPDIR)/llbuild
+MAKEFILES = Makefile $(LLBUILD)/Makefile.include
+
+export TOPDIR LLBUILD MAKEFILES
+
+# user customizable variables
+
CC = gcc
LD = ld
-PACKAGE_VERSION = "1.99b"
-PACKAGE = "SB2"
CFLAGS = -Wall -W -I$(TOPDIR)/include -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE
-TOPDIR = $(CURDIR)
-MAKEFILES = Makefile $(TOPDIR)/llbuild/Makefile.include
+export CC CFLAGS LD
-export CC CFLAGS MAKEFILES TOPDIR
+# define a shared C language binary target
-obj-default = lua preload utils
-targets = utils/sb2init
+bin-sample = main.o sample.o
+extra_targets = bin-sample
all: build
@@ -25,22 +32,16 @@ build: configure
@echo Build completed successfully!
install: build
- install -d -m 755 $(prefix)/scratchbox/bin
- install -d -m 755 $(prefix)/scratchbox/lib
- install -d -m 755 $(prefix)/scratchbox/redir_scripts
- install -c -m 755 preload/libsb2.so $(prefix)/scratchbox/lib/libsb2.so
- install -c -m 755 utils/sb2init $(prefix)/scratchbox/bin/sb2init
- install -c -m 755 scripts/login.sh $(prefix)/login.sh
- install -c -m 755 scripts/sb2rc $(prefix)/scratchbox/sb2rc
- install -c -m 644 redir_scripts/main.lua $(prefix)/scratchbox/redir_scripts/main.lua
+ install -d -m 755 $(prefix)/bin
+ install -c -m 755 sample $(prefix)/bin/
-CLEAN_FILES = $(targets)
+CLEAN_FILES = $(extra_targets)
clean:
$(ll_clean)
-include .config
-include $(TOPDIR)/llbuild/Makefile.include
+include $(LLBUILD)/Makefile.include
diff --git a/llbuild/README b/llbuild/README
new file mode 100644
index 0000000..46f44f4
--- /dev/null
+++ b/llbuild/README
@@ -0,0 +1,38 @@
+llbuild guide
+*************
+
+Let's assume you have following directory structure:
+
+project/
+ include/
+ src/
+ src/subsystem1
+ src/sybsystem2
+
+
+* install the llbuild directory to project/llbuild
+* copy project/llbuild/Makefile.toplevel-sample to project/Makefile
+* create subdir Makefiles like this:
+
+project/src/Makefile:
+
+obj-builtin = subsystem1 subsystem2
+
+
+project/src/subsystem1/Makefile:
+
+obj-builtin = file1.o file2.o file3.o
+
+
+project/src/subsystem2/Makefile:
+
+obj-builtin = file3.o file4.o
+
+
+* Edit the target name in the toplevel Makefile to suit your needs, for example:
+
+project/Makefile:
+
+bin-project = src
+extra_targets = bin-project
+
diff --git a/llbuild/llflock.c b/llbuild/llflock.c
deleted file mode 100644
index b1bd746..0000000
--- a/llbuild/llflock.c
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- flock - acquires a file lock and executes a command with the lock held.
- Usage: flock [--shared | --timeout=seconds] lockfile program [args...]
-
- Written by Adam J. Richter
- Copyright (C) 2004 Yggdrasil Computing, Inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-*/
-
-/*
- * lle: Removed the localisation support to cut off unnecessary dependencies
- */
-
-#include <sys/file.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <getopt.h>
-#include <unistd.h>
-#include <stdlib.h> /* exit */
-#include <signal.h> /* kill */
-#include <stdio.h>
-
-static int non_blocking = 0;
-static int shared = LOCK_EX;
-
-static const struct option options[] = {
- {"shared", no_argument, &shared, LOCK_SH },
- {"timeout", required_argument, NULL, 't' },
- {NULL, 0, NULL, 0 },
-};
-
-int main(int argc, char **argv)
-{
- int fd;
- int opt;
- int pid;
- int child_status;
- int option_index;
- int timeout = 0;
-
- do {
- opt = getopt_long(argc, argv, "+", options, &option_index);
- switch(opt) {
- case '?':
- fprintf (stderr,
- "flock: unknown option, aborting.\n");
- exit(1);
- break;
- case 't':
- timeout = atoi(optarg);
- if (timeout == 0)
- non_blocking |= LOCK_NB;
- break;
- default:
- break;
- }
- } while (opt != -1);
-
- argc -= optind;
- argv += optind;
-
- if (argc < 2) {
- fprintf(stderr,
- "Usage flock [--shared | --timeout=seconds] "
- "filename command {arg arg...}\n");
- exit(2);
- }
-
- fd = open(argv[0], O_RDONLY);
- if (fd < 0) {
- perror(argv[0]);
- exit(3);
- }
-
- alarm(timeout);
- if (flock(fd, shared | non_blocking) != 0) {
- perror("flock");
- exit(4);
- }
- alarm(0);
-
- pid = fork();
- if (pid < 0) {
- perror("fork");
- exit(5);
- }
- if (pid == 0) {
- execvp(argv[1], argv+1);
- perror(argv[1]);
- exit(6);
- }
- waitpid(pid, &child_status, 0);
-
- /* flock(fd, LOCK_UN); */
- /* No need to explicitly release the flock, since we are just
- going to exit now anyhow. */
-
- /* Lame attempt to simulate child's mode of death. */
- if (WIFSIGNALED(child_status))
- kill(0, WTERMSIG(child_status));
-
- return WEXITSTATUS(child_status);
-}