initial yap conversion

This commit is contained in:
Conor Hughes 2020-06-28 21:39:27 -07:00
parent 7da759f5f2
commit 5af552888d
7 changed files with 303 additions and 139 deletions

View File

@ -1,75 +1,5 @@
# -*- mode: makefile-gmake -*-
INSTALLER:=./install_wrapper.sh
MODULES = .
ifeq ($(shell uname),SunOS)
CC=gcc
endif
IS_GCC := $(shell ($(CC) --version | grep 'Copyright.*Free Software Foundation') > /dev/null && echo "YES")
ifeq ($(IS_GCC),YES)
CFLAGS += -std=c11
endif
include configuration.mk
CFLAGS += -I. -Wall
CXXFLAGS += -I. -Wall
CSRC :=
CPPSRC :=
MODULES := .
CFLAGS += $(patsubst %,-I%,$(MODULES))
CXXFLAGS += $(patsubst %,-I%,$(MODULES))
CFLAGS += $(patsubst %,-I%/public_headers,$(MODULES))
CXXFLAGS += $(patsubst %,-I%/public_headers,$(MODULES))
TESTS :=
PRODUCTS :=
MODULE_CLEANS :=
GENERATED_HEADERS :=
include $(patsubst %,%/module.mk,$(MODULES))
ALLOBJ := $(patsubst %.c,%.o,$(filter %.c,$(CSRC)))
ALLOBJ += $(patsubst %.cc,%.o,$(filter %.cc,$(CPPSRC)))
include $(ALLOBJ:.o=.d)
OBJ := $(filter-out $(TESTOBJ),$(ALLOBJ))
$(ALLOBJ:.o=.d): $(GENERATED_HEADERS)
%.d: %.cc
./depend.sh `dirname $*.cc` $(CXXFLAGS) $*.cc > $@
%.d: %.c
./depend.sh `dirname $*.c` $(CFLAGS) $*.c > $@
test: $(TESTS)
clean: $(MODULE_CLEANS)
rm -f $(ALLOBJ)
rm -f $(TESTS)
rm -f $(ALLOBJ:.o=.d)
rm -f $(PRODUCTS)
.PHONY:debugmk
debugmk:
echo $(ALLOBJ)
all: $(PRODUCTS)
$(PREFIX)/lib:
$(INSTALLER) -d $(PREFIX)/lib
$(PREFIX)/include:
$(INSTALLER) -d $(PREFIX)/include
install: all
.DEFAULT_GOAL := all
include yap/prelude.mk

View File

@ -18,9 +18,7 @@ $(LIBYACHTROCK_DIR)public_headers/yachtrock/config.h: $(LIBYACHTROCK_DIR)write_c
YACHTROCK_GENERATED_HEADERS := $(LIBYACHTROCK_DIR)public_headers/yachtrock/config.h
GENERATED_HEADERS += $(YACHTROCK_GENERATED_HEADERS)
UNAME_S := $(shell uname -s)
ifeq ($(UNAME_S),Darwin)
ifeq ($(YAP_UNAME_S),Darwin)
LIBYACHTROCK_DYLIBNAME := libyachtrock.dylib
else
LIBYACHTROCK_DYLIBNAME := libyachtrock.so
@ -28,13 +26,14 @@ endif
YR_RUNTESTS := yr_runtests
PRODUCTS += $(LIBYACHTROCK_DYLIBNAME)
all: $(LIBYACHTROCK_DYLIBNAME)
ifeq ($(YACHTROCK_DLOPEN),1)
PRODUCTS += $(YR_RUNTESTS)
all: $(YR_RUNTESTS)
install: install_yr_runtests
endif
MODULE_CLEANS += clean_libyachtrock
clean: clean_libyachtrock
LIBYACHTROCK_GENERATED_SRC :=
LIBYACHTROCK_GENERATED_SRC := $(patsubst %,$(LIBYACHTROCK_DIR)src/%,$(LIBYACHTROCK_GENERATED_SRC))
@ -52,22 +51,7 @@ LIBYACHTROCK_HEADER_INSTALLED_FILES := $(subst $(LIBYACHTROCK_DIR)public_headers
CSRC += $(LIBYACHTROCK_SRC) $(YR_RUNTESTS_SRC)
LIBYACHTROCK_OBJ = $(patsubst %.c,%.o,$(filter %.c,$(LIBYACHTROCK_SRC)))
LIBYACHTROCK_LINKS = -lpthread
YR_RUNTESTS_LINKS =
ifeq ($(UNAME_S),Linux)
LIBYACHTROCK_LINKS += -ldl
YR_RUNTESTS_LINKS += -ldl
else ifeq ($(UNAME_S),SunOS)
LIBYACHTROCK_LINKS += -lsocket -lnsl
else ifeq ($(UNAME_S),FreeBSD)
LIBYACHTROCK_LINKS += -lstdthreads
endif
ifneq ($(UNAME_S),Darwin)
YR_RUNTESTS_LINKS += -Wl,-rpath,$(PREFIX)/lib
endif
LIBYACHTROCK_YAP_LINK_OPTIONS = --stdthreads --sockets --dl
YR_RUNTESTS_OBJ := $(patsubst %.c,%.o,$(filter %.c,$(YR_RUNTESTS_SRC)))
@ -79,16 +63,11 @@ $(LIBYACHTROCK_STATIC_SRC): $(LIBYACHTROCK_GENERATED_SRC)
$(LIBYACHTROCK_OBJ): CFLAGS += -fPIC -D_POSIX_C_SOURCE=200809L -Wmissing-prototypes
ifeq ($(UNAME_S),Darwin)
$(LIBYACHTROCK_DYLIBNAME): $(LIBYACHTROCK_OBJ)
$(CC) -dynamiclib $(LIBYACHTROCK_OBJ) -install_name $(PREFIX)/lib/$@ $(LIBYACHTROCK_LINKS) -o $@
else
$(LIBYACHTROCK_DYLIBNAME): $(LIBYACHTROCK_OBJ)
$(CC) -shared $(LIBYACHTROCK_OBJ) $(LIBYACHTROCK_LINKS) -Wl,-rpath,$(PREFIX)/lib/$@ -o $@
endif
$(YAP_LINK) --driver $(CC) --dynamic_install_name $(PREFIX)/lib/$@ $(LIBYACHTROCK_YAP_LINK_OPTIONS) -- $(LIBYACHTROCK_OBJ) $(LIBYACHTROCK_LINKS) -o $@
$(YR_RUNTESTS): $(YR_RUNTESTS_OBJ) $(LIBYACHTROCK_DYLIBNAME)
$(CC) $^ -o $@ $(YR_RUNTESTS_LINKS)
$(YAP_LINK) --driver $(CC) --links_self_using_prefix "$(PREFIX)" --dl -- $^ -o $@
clean_libyachtrock:
rm -f $(LIBYACHTROCK_DYLIBNAME)
@ -99,38 +78,27 @@ clean_libyachtrock:
install: install_libyachtrock_dylib install_libyachtrock_headers
ifneq ($(filter $(YR_RUNTESTS),$(PRODUCTS)),)
install: install_yr_runtests
else
install: uninstall_yr_runtests
endif
uninstall_yr_runtests:
ifneq ($(shell [ -f $(PREFIX)/bin/$(YR_RUNTESTS) ] && echo "do it"),)
rm -f $(PREFIX)/bin/$(YR_RUNTESTS)
endif
install_yr_runtests: $(PREFIX)/bin/$(YR_RUNTESTS)
$(PREFIX)/bin/$(YR_RUNTESTS): $(YR_RUNTESTS) $(PREFIX)/bin
$(INSTALLER) -m 0755 -vc $< $(PREFIX)/bin
$(YAP_INSTALL) -m 0755 -vc $< $(PREFIX)/bin
install_libyachtrock_dylib: $(PREFIX)/lib/$(LIBYACHTROCK_DYLIBNAME)
$(PREFIX)/lib/$(LIBYACHTROCK_DYLIBNAME): $(LIBYACHTROCK_DYLIBNAME) $(PREFIX)/lib
$(INSTALLER) -vc $< $(PREFIX)/lib
$(YAP_INSTALL) -vc $< $(PREFIX)/lib
install_libyachtrock_headers: libyachtrock_headers_installation_dir libyachtrock_installed_headers
libyachtrock_headers_installation_dir: $(PREFIX)/include/yachtrock
$(PREFIX)/include/yachtrock:
$(INSTALLER) -dv $(PREFIX)/include/yachtrock
$(YAP_INSTALL) -dv $(PREFIX)/include/yachtrock
libyachtrock_installed_headers: $(LIBYACHTROCK_HEADER_INSTALLED_FILES)
$(PREFIX)/include/yachtrock/%.h: $(LIBYACHTROCK_DIR)public_headers/yachtrock/%.h
$(INSTALLER) -m 0644 -vc $< $(PREFIX)/include/yachtrock
$(YAP_INSTALL) -m 0644 -vc $< $(PREFIX)/include/yachtrock
libyachtrock_install_dev_dylib_links: $(PREFIX)/lib
ln -s `pwd`/$(LIBYACHTROCK $(PREFIX)/lib/$(LIBYACHTROCK_DYLIBNAME)

View File

@ -1,6 +1,6 @@
# -*- mode: makefile-gmake -*-
TESTS += test_libyachtrock
test: test_libyachtrock
LIBYACHTROCK_TESTSRC := selftests_collection.c basic_tests.c result_store_tests.c assertion_tests.c testcase_tests.c run_under_store_tests.c selector_tests.c
ifeq ($(YACHTROCK_MULTIPROCESS),1)
@ -17,7 +17,11 @@ LIBYACHTROCK_TESTSUPPORT_OBJ =
YR_SIMPLE_RUNNER = $(LIBYACHTROCK_DIR)test/yachtrock_test_runner
ifeq ($(YAP_UNAME_S), Darwin)
YR_TEST_DYLIB = $(LIBYACHTROCK_DIR)test/libyachtrock_test.dylib
else
YR_TEST_DYLIB = $(LIBYACHTROCK_DIR)test/libyachtrock_test.so
endif
YR_SELFTESTS_DYLIB = $(LIBYACHTROCK_DIR)test/libyachtrock_selftests.dylib
YR_RUNTESTS_TEST = $(LIBYACHTROCK_DIR)test/yr_runtests_test
@ -39,35 +43,26 @@ clean_libyachtrock: clean_libyachtrock_tests
YACHTROCK_TEST_INVOCATION_ENVIRON =
ifeq ($(UNAME_S), Darwin)
$(YR_TEST_DYLIB): $(LIBYACHTROCK_OBJ)
$(CC) -dynamiclib $(LIBYACHTROCK_OBJ) -install_name `pwd`/$@ $(LIBYACHTROCK_LINKS) -o $@
else
YR_TEST_INVOCATION_ENVIRON += LD_LIBRARY_PATH=$(LIBYACHTROCK_DIR)test
$(YR_TEST_DYLIB): $(LIBYACHTROCK_OBJ)
$(CC) -shared $(LIBYACHTROCK_OBJ) $(LIBYACHTROCK_LINKS) -Wl,-rpath,`pwd`/$(LIBYACHTROCK_DIR)test -o $@
endif
$(YAP_LINK) --driver $(CC) --dynamic_install_name `pwd`/$@ $(LIBYACHTROCK_YAP_LINK_OPTIONS) -- $(LIBYACHTROCK_OBJ) $(LIBYACHTROCK_LINKS) -o $@
YR_TEST_DYLIB_LDFLAGS = -L$(LIBYACHTROCK_DIR)test -lyachtrock_test
ifeq ($(UNAME_S), Darwin)
$(YR_SELFTESTS_DYLIB): $(LIBYACHTROCK_TESTOBJ) $(YR_TEST_DYLIB)
$(CC) -dynamiclib $(LIBYACHTROCK_TESTOBJ) -install_name `pwd`/$@ $(YR_TEST_DYLIB) -o $@
else
$(YR_SELFTESTS_DYLIB): $(LIBYACHTROCK_TESTOBJ) $(YR_TEST_DYLIB)
$(CC) -shared $(LIBYACHTROCK_TESTOBJ) $(YR_TEST_DYLIB) -Wl,-rpath,`pwd`/$(LIBYACHTROCK_DIR)test -o $@
endif
$(YAP_LINK) --driver $(CC) --dynamic_install_name `pwd`/$@ -- $(LIBYACHTROCK_TESTOBJ) $(YR_TEST_DYLIB_LDFLAGS) -o $@
$(YR_RUNTESTS_TEST): $(YR_RUNTESTS_OBJ) $(YR_TEST_DYLIB)
$(CC) $^ -o $@ $(YR_RUNTESTS_LINKS)
$(YAP_LINK) --driver $(CC) $(LIBYACHTROCK_YAP_LINK_OPTIONS) -- $(YR_TEST_DYLIB_LDFLAGS) $(YR_RUNTESTS_OBJ) -o $@
$(YR_MULTIPROCESS_TEST_TRAMPOLINE): $(LIBYACHTROCK_DIR)test/multiprocess_basic_tests.o $(LIBYACHTROCK_DIR)test/multiprocess_test_trampoline.o $(YR_TEST_DYLIB)
$(CC) $^ $(LIBYACHTROCK_LINKS) -o $@
$(YAP_LINK) --driver $(CC) -- $(LIBYACHTROCK_DIR)test/multiprocess_basic_tests.o $(LIBYACHTROCK_DIR)test/multiprocess_test_trampoline.o $(YR_TEST_DYLIB_LDFLAGS) $(LIBYACHTROCK_LINKS) -o $@
_yr_clean_trampoline:
rm -f $(YR_MULTIPROCESS_TEST_TRAMPOLINE) $(LIBYACHTROCK_DIR)test/multiprocess_test_trampoline.o
clean_libyachtrock: _yr_clean_trampoline
$(YR_SIMPLE_RUNNER): $(LIBYACHTROCK_TESTMAIN_OBJ) $(LIBYACHTROCK_TESTOBJ) $(YR_TEST_DYLIB)
$(CC) $^ $(LIBYACHTROCK_LINKS) -o $@
$(YAP_LINK) --driver $(CC) -- $(LIBYACHTROCK_TESTMAIN_OBJ) $(LIBYACHTROCK_TESTOBJ) $(YR_TEST_DYLIB_LDFLAGS) $(LIBYACHTROCK_LINKS) -o $@
YR_TEST_CONDITIONAL_DEPENDENCIES :=
@ -81,13 +76,8 @@ $(LIBYACHTROCK_TESTOBJ): CFLAGS += -fpic
YACHTROCK_TEST_INVOCATION_ENVIRON += YRTEST_DUMMY_MODULE=$(LIBYACHTROCK_DIR)test/dummy_module.dylib
$(LIBYACHTROCK_DIR)test/dummy_module.o: CFLAGS += -fPIC -D_POSIX_C_SOURCE=200809L
ifeq ($(UNAME_S),Darwin)
$(LIBYACHTROCK_DIR)test/dummy_module.dylib: $(LIBYACHTROCK_DIR)test/dummy_module.o $(YR_TEST_DYLIB)
$(CC) -dynamiclib $^ -o $@
else
$(LIBYACHTROCK_DIR)test/dummy_module.dylib: $(LIBYACHTROCK_DIR)test/dummy_module.o $(YR_TEST_DYLIB)
$(CC) -shared $^ -o $@
endif
$(YAP_LINK) --driver $(CC) --dynamic_install_name `pwd`/$@ -- $(LIBYACHTROCK_DIR)test/dummy_module.o $(YR_TEST_DYLIB_LDFLAGS) -o $@
YR_TEST_CONDITIONAL_DEPENDENCIES += $(LIBYACHTROCK_DIR)test/dummy_module.dylib
test_libyachtrock: test_libyachtrock_via_selftest_dylib

197
yap/link.sh Executable file
View File

@ -0,0 +1,197 @@
#!/bin/sh
uname_s=`uname -s`
usage()
{
echo "usage: $0 -o output_filename -d driver [driveropt…]" >&2
}
invalid_usage()
{
usage
exit 1
}
# http://www.etalabs.net/sh_tricks.html
save ()
{
for i; do
printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ;
done
echo " "
}
quote ()
{
printf %s\\n "$1" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/'/"
}
append_element_to_quoted_array()
{
var=$1
saved_args=$(save "$@")
eval "set -- $2 $(quote "$3")"
retv=$(save "$@")
eval "$var=\${retv}"
eval "set -- $saved_args"
unset retv
}
add_linkage_rpath_to_array()
{
if [ $uname_s = Darwin ]; then
eval "$1=\$2"
else
append_element_to_quoted_array "$1" "$2" "-Wl,-rpath,${3}"
fi
}
add_install_name_arguments_to_array()
{
if [ $uname_s = Darwin ]; then
temp="$2"
append_element_to_quoted_array temp "$temp" "-dynamiclib"
append_element_to_quoted_array temp "$temp" "-install_name"
append_element_to_quoted_array "$1" "$temp" "${3}"
unset temp
else
append_element_to_quoted_array "$1" "$2" "-shared"
fi
}
add_link_prefix_to_array()
{
if [ $uname_s = Darwin ]; then
eval "$1=\$2"
else
add_linkage_rpath_to_array "$1" "$2" "$3"
fi
}
add_stdthreads_links()
{
if [ $uname_s = FreeBSD ]; then
append_element_to_quoted_array "$1" "$2" "-lstdthreads"
else
eval "$1=\$2"
fi
}
add_sockets_links()
{
if [ $uname_s = SunOS ]; then
temp="$2"
append_element_to_quoted_array temp "$temp" -lsocket
append_element_to_quoted_array "$1" "$temp" -lnsl
unset temp
else
eval "$1=\$2"
fi
}
add_dl_links()
{
if [ $uname_s = Linux ]; then
append_element_to_quoted_array "$1" "$2" "-ldl"
else
eval "$1=\$2"
fi
}
driver=cc
dynamic_install_name=""
link_prefix=""
uses_stdthreads=false
uses_sockets=false
uses_dl=false
#parse script options.
while true; do
case "$1" in
--driver)
driver="$2"; shift
;;
--dynamic_install_name)
dynamic_install_name="$2"; shift
;;
--links_self_using_prefix)
link_prefix="$2"; shift
;;
--stdthreads)
uses_stdthreads=true
;;
--sockets)
uses_sockets=true
;;
--dl)
uses_dl=true
;;
--)
shift
break
;;
*)
echo "$0: unknown argument $1" >&2
invalid_usage
;;
esac
shift
done
# remaining argument list is the base of linker arglist.
linker_arglist=$(save "$@")
# process script options that add links.
if [ ${dynamic_install_name}x != x ]; then
# linking a shared library.
add_install_name_arguments_to_array linker_arglist "${linker_arglist}" "${dynamic_install_name}"
fi
if [ ${link_prefix}x != x ]; then
# asked to add the prefix to the rpath and lib search paths.
append_element_to_quoted_array linker_arglist "${linker_arglist}" "-L."
add_link_prefix_to_array linker_arglist "${linker_arglist}" "${link_prefix}/lib"
fi
if $uses_stdthreads; then
add_stdthreads_links linker_arglist "${linker_arglist}"
fi
if $uses_sockets; then
add_sockets_links linker_arglist "${linker_arglist}"
fi
if $uses_dl; then
add_dl_links linker_arglist "${linker_arglist}"
fi
# iterate argument list looking for -L flags.
while true; do
link=""
case "$1" in
-L)
link=$2; shift
;;
-L*)
link=${1##-L}
;;
*)
;;
esac
if [ ${link}x != x ] ; then
# do a shuffle to add -Wl,-rpath,<libdir>
add_linkage_rpath_to_array linker_arglist "${linker_arglist}" "${link}"
fi
shift
if [ $# -eq 0 ] ; then
break
fi
done
eval "set -- $linker_arglist"
set -x
$driver "$@"

79
yap/prelude.mk Normal file
View File

@ -0,0 +1,79 @@
# -*- mode: makefile-gmake -*-
# define toplevel actions first.
all:
clean:
test:
# set helper variables.
YAP_INSTALL := ./yap/install.sh
YAP_LINK := ./yap/link.sh
YAP_UNAME_S := $(shell uname -s)
ifeq ($(shell uname),SunOS)
CC=gcc
endif
YAP_IS_GCC := $(shell ($(CC) --version | grep 'Copyright.*Free Software Foundation') > /dev/null && echo "YES")
# set default flags.
CXXFLAGS += -std=c++17 -Wall
CFLAGS += -std=c11 -Wall
CFLAGS += $(patsubst %,-I%,$(MODULES))
CXXFLAGS += $(patsubst %,-I%,$(MODULES))
CFLAGS += $(patsubst %,-I%/public_headers,$(MODULES))
CXXFLAGS += $(patsubst %,-I%/public_headers,$(MODULES))
# define recipes for depend files.
%.d: %.c
./yap/depend.sh `dirname $*.c` $(CFLAGS) $*.c > $@
%.d: %.cc
./yap/depend.sh `dirname $*.cc` $(CXXFLAGS) $*.cc > $@
# define filelist variables for modules to add to.
ALLOBJ = $(patsubst %.c,%.o,$(filter %.c,$(CSRC)))
ALLOBJ += $(patsubst %.cc,%.o,$(filter %.cc,$(CPPSRC)))
ALLDEPEND = $(ALLOBJ:.o=.d)
# include configuration.
-include configuration.mk
ifndef PREFIX
$(error PREFIX must be set via configuration.mk, even if to /)
endif
# include the project's modules, and then the defined depend files.
include $(MODULES:=/module.mk)
# hack: we need to add the dependency on generated headers now. If attempted before including modules,
# the variables aren't defined yet so the dependencies don't take.
$(ALLDEPEND): $(GENERATED_HEADERS)
include $(ALLDEPEND)
# help out with some basic action prerequisites.
clean_allobj:
rm -f $(ALLOBJ)
clean_alldepend:
rm -f $(ALLDEPEND)
clean: clean_allobj clean_alldepend
$(PREFIX)/lib:
$(YAP_INSTALL) -d $(PREFIX)/lib
$(PREFIX)/include:
$(YAP_INSTALL) -d $(PREFIX)/include
.DEFAULT_GOAL := all