From 366ec7f23502c5fcb21f60cacaadfee5d0ffd6c8 Mon Sep 17 00:00:00 2001 From: Avril Date: Fri, 19 Mar 2021 18:34:07 +0000 Subject: [PATCH] builds as library --- .gitignore | 3 +++ Makefile | 38 +++++++++++++++++++++++++------------- include/gen.h | 18 ++++++++++-------- src/gen.cpp | 8 +++++--- 4 files changed, 43 insertions(+), 24 deletions(-) diff --git a/.gitignore b/.gitignore index bfd271f..9e7deb9 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,6 @@ sm-* old-examples/ obj/ + +*.so +*.a diff --git a/Makefile b/Makefile index 83503bb..4fa4724 100644 --- a/Makefile +++ b/Makefile @@ -37,10 +37,10 @@ OBJ = $(OBJ_C) $(OBJ_CXX) # Phonies .PHONY: release -release: | dirs $(PROJECT)-release +release: | dirs $(PROJECT).so $(PROJECT).a .PHONY: debug -debug: | dirs $(PROJECT)-debug +debug: | dirs $(PROJECT)-debug.so $(PROJECT)-debug.a # Targets @@ -53,22 +53,34 @@ obj/c/%.o: %.c obj/cxx/%.o: %.cpp $(CXX) -c $< $(CXXFLAGS) -o $@ $(LDFLAGS) -$(PROJECT)-release: CFLAGS+= $(RELEASE_CFLAGS) -$(PROJECT)-release: CXXFLAGS += $(RELEASE_CXXFLAGS) -$(PROJECT)-release: LDFLAGS += $(RELEASE_LDFLAGS) -$(PROJECT)-release: $(OBJ) - $(CXX) $^ $(CXXFLAGS) -o $@ $(LDFLAGS) +$(PROJECT).a: CFLAGS+= $(RELEASE_CFLAGS) +$(PROJECT).a: CXXFLAGS += $(RELEASE_CXXFLAGS) +$(PROJECT).a: $(OBJ) + ar -rcs $@ $^ $(STRIP) $@ -$(PROJECT)-debug: CFLAGS+= $(DEBUG_CFLAGS) -$(PROJECT)-debug: CXXFLAGS += $(DEBUG_CXXFLAGS) -$(PROJECT)-debug: LDFLAGS += $(DEBUG_LDFLAGS) -$(PROJECT)-debug: $(OBJ) - $(CXX) $^ $(CXXFLAGS) -o $@ $(LDFLAGS) + +$(PROJECT).so: CFLAGS+= -fPIC $(RELEASE_CFLAGS) +$(PROJECT).so: CXXFLAGS += -fPIC $(RELEASE_CXXFLAGS) +$(PROJECT).so: LDFLAGS += $(RELEASE_LDFLAGS) +$(PROJECT).so: $(OBJ) + gcc -shared $^ -o $@ + $(STRIP) $@ + +$(PROJECT)-debug.a: CFLAGS+= $(DEBUG_CFLAGS) +$(PROJECT)-debug.a: CXXFLAGS += $(DEBUG_CXXFLAGS) +$(PROJECT)-debug.a: $(OBJ) + ar -rcs $@ $^ + +$(PROJECT)-debug.so: CFLAGS+= -fPIC $(DEBUG_CFLAGS) +$(PROJECT)-debug.so: CXXFLAGS += -fPIC $(DEBUG_CXXFLAGS) +$(PROJECT)-debug.so: LDFLAGS += $(DEBUG_LDFLAGS) +$(PROJECT)-debug.so: $(OBJ) + gcc -shared $^ -o $@ clean-rebuild: rm -rf obj clean: clean-rebuild - rm -f $(PROJECT)-{release,debug,pgo} + rm -f $(PROJECT){-debug,}.{so,a} diff --git a/include/gen.h b/include/gen.h index 25c4b14..1c76458 100644 --- a/include/gen.h +++ b/include/gen.h @@ -35,11 +35,13 @@ inline T sm_output_assume_value(const sm_output& data) // A generator method struct sm_generator; -/// Create a generator method with this function. -sm_generator* sm_generate(sm_gen_fun function); -/// Free a generator method -void sm_free_generator(sm_generator* generator); -/// Run this generator until the next yield. -/// Returns false if the generator ends. -/// Any output value yielded from the generator is returned in the output pointer, unless the pointer is NULL, in which case the output is discarded. -bool sm_next(sm_generator** gen, sm_state* state, sm_output* output); +extern "C" { + /// Create a generator method with this function. + sm_generator* sm_generate(sm_gen_fun function); + /// Free a generator method + void sm_free_generator(sm_generator* generator); + /// Run this generator until the next yield. + /// Returns false if the generator ends. + /// Any output value yielded from the generator is returned in the output pointer, unless the pointer is NULL, in which case the output is discarded. + bool sm_next(sm_generator** gen, sm_state* state, sm_output* output); +} diff --git a/src/gen.cpp b/src/gen.cpp index 25677dd..61b5f8e 100644 --- a/src/gen.cpp +++ b/src/gen.cpp @@ -1,12 +1,14 @@ #include +#define EX_C extern "C" + struct sm_generator { sm_generator* prev; sm_gen_fun current; }; -sm_generator* sm_generate(sm_gen_fun function) +EX_C sm_generator* sm_generate(sm_gen_fun function) { auto gen = box(); gen->prev = nullptr; @@ -14,7 +16,7 @@ sm_generator* sm_generate(sm_gen_fun function) return gen; } -void sm_free_generator(sm_generator* gen) +EX_C void sm_free_generator(sm_generator* gen) { auto g = unbox(gen); if(g.prev) @@ -22,7 +24,7 @@ void sm_free_generator(sm_generator* gen) } // Returns false if the generator ends. -bool sm_next(sm_generator** gen, sm_state* state, _sm_user* output) +EX_C bool sm_next(sm_generator** gen, sm_state* state, _sm_user* output) { if( !(*gen)->current) return false;