From bfef70f686503a3f7911f5501c05dd3b694dab07 Mon Sep 17 00:00:00 2001
From: Vinzenz Schroeter <vinzenz.f.s@gmail.com>
Date: Sat, 3 May 2025 19:15:20 +0200
Subject: [PATCH] fix many configurations

---
 example/Makefile                | 56 ++++++++++++++++++---------------
 example/src/announce.c          | 10 ++++--
 example/src/brightness_tester.c |  4 +--
 example/src/random_stuff.c      |  4 +--
 include/servicepoint.h          | 35 +++++++++------------
 src/lib.rs                      |  3 ++
 6 files changed, 59 insertions(+), 53 deletions(-)

diff --git a/example/Makefile b/example/Makefile
index 9e001e9..a35aa5c 100644
--- a/example/Makefile
+++ b/example/Makefile
@@ -1,7 +1,7 @@
-CARGO ?= rustup run nightly cargo
+CARGO ?= cargo
 STRIP ?= strip
 
-FEATURES := protocol_udp
+FEATURES :=
 
 THIS_DIR := $(dir $(realpath $(lastword $(MAKEFILE_LIST))))
 REPO_ROOT := $(realpath $(THIS_DIR)/..)
@@ -10,42 +10,31 @@ export SERVICEPOINT_HEADER_OUT := $(REPO_ROOT)/include
 override CFG_MUSL := $(if $(CFG_MUSL),$(CFG_MUSL),$(if $(MUSL),$(MUSL),0))
 override CFG_PROFILE := $(if $(CFG_PROFILE),$(CFG_PROFILE),$(if $(PROFILE),$(PROFILE),release))
 
-CCFLAGS += -ffunction-sections -fdata-sections -Wl,--gc-sections -Wall -fwhole-program
-
-RUSTFLAGS += -C link-arg=-s \
-	-C link-arg=-Wl,--gc-sections \
-	--crate-type=staticlib
+CCFLAGS += -Wall -fwhole-program
 
 STRIPFLAGS := -s --strip-unneeded -R .comment -R .gnu.version -R .note -R .note.gnu.build-id -R .note.ABI-tag
 
 ifeq ($(CFG_MUSL), 1)
 	TARGET ?= x86_64-unknown-linux-musl
 	CC ?= musl-gcc
-	CCFLAGS += -static
+	CCFLAGS += -static -lservicepoint_binding_c
+	RUSTFLAGS += --crate-type=staticlib
 else
 	TARGET ?= x86_64-unknown-linux-gnu
 	CC ?= gcc
-	CCFLAGS += -shared
+	#CCFLAGS += -shared
+	CCFLAGS += -Wl,-Bstatic -lservicepoint_binding_c -Wl,-Bdynamic
 endif
 
-RUSTFLAGS += -C linker=$(CC)
-
 #ifeq ($(CFG_PROFILE), size-optimized)
 #	CCFLAGS += -nodefaultlibs -lc
 #endif
 
-CCFLAGS += -lservicepoint_binding_c
 RUST_TARGET_DIR := $(REPO_ROOT)/target/$(TARGET)/$(CFG_PROFILE)
-OUT_BASE_DIR := $(realpath $(THIS_DIR)/out/)
-OUT_DIR := $(realpath $(OUT_BASE_DIR)/$(CFG_PROFILE)/)
-
-CARGOFLAGS += --manifest-path=$(REPO_ROOT)/Cargo.toml \
-	--profile=$(CFG_PROFILE) \
-	--no-default-features \
-	--features=$(FEATURES) \
-	--target=$(TARGET)
+OUT_DIR := $(realpath $(THIS_DIR)/out/)
 
 ifeq ($(CFG_PROFILE), size-optimized)
+	CARGO_PROFILE := size-optimized
 	CCFLAGS += -Oz \
 		-fwrapv -fomit-frame-pointer -fno-stack-protector\
 		-fno-unroll-loops \
@@ -63,16 +52,29 @@ ifeq ($(CFG_PROFILE), size-optimized)
 	RUSTFLAGS += -Zlocation-detail=none \
 		-Zfmt-debug=none \
 		-C link-arg=-z,norelro \
-		-C link-arg=--hash-style=gnu \
 		-C panic=abort
+		#-C link-arg=--hash-style=gnu
 else ifeq ($(CFG_PROFILE), release)
+	CARGO_PROFILE := release
 	CCFLAGS += -O2
 else ifeq ($(CFG_PROFILE), debug)
 	CCFLAGS += -Og
+	CARGO_PROFILE := dev
 else
 	CFG_PROFILE := $(error "PROFILE has to be set to one of: debug, release, size-optimized")
 endif
 
+CARGOFLAGS += --manifest-path=$(REPO_ROOT)/Cargo.toml \
+	--profile=$(CARGO_PROFILE) \
+	--no-default-features \
+	--features=$(FEATURES) \
+	--target=$(TARGET)
+
+ifneq ($(CFG_PROFILE), debug)
+	CCFLAGS += -ffunction-sections -fdata-sections -Wl,--gc-sections
+	RUSTFLAGS += -C link-arg=-s -C link-arg=-Wl,--gc-sections
+endif
+
 ifeq ($(LTO), 1)
 	CCFLAGS += -flto
 endif
@@ -87,12 +89,16 @@ _sp_artifacts := $(SERVICEPOINT_HEADER_OUT)/servicepoint.h $(RUST_TARGET_DIR)/li
 
 all: $(_bins)
 
-clean:
-	echo rm -r $(OUT_DIR) || true
+clean: clean-c clean-rust
+
+clean-c:
+	rm -r $(OUT_DIR) || true
+
+clean-rust:
 	rm $(SERVICEPOINT_HEADER_OUT)/servicepoint.h || true
 	cargo clean
 
-.PHONY: all clean sizes $(_run_programs)
+.PHONY: all clean sizes $(_run_programs) clean-c clean-rust
 
 $(_unstripped_bins): out/%_unstripped: src/%.c $(SERVICEPOINT_HEADER_OUT)/servicepoint.h $(_sp_artifacts)
 	mkdir -p out || true
@@ -116,7 +122,7 @@ $(_run_programs): run_%: out/% FORCE
 sizes: $(_bins)
 	ls -lB out
 
-analyze-size: $(OUT_DIR)/$(BIN)_unstripped
+analyze-size: out/$(BIN)_unstripped
 	nm --print-size --size-sort --reverse-sort --radix=d --demangle $(OUT_DIR)/$(BIN)_unstripped \
 		| awk '{size=$$2+0; print size "\t" $$4}' \
 		| less
diff --git a/example/src/announce.c b/example/src/announce.c
index 737eff5..d256cff 100644
--- a/example/src/announce.c
+++ b/example/src/announce.c
@@ -1,8 +1,12 @@
+#include <stdio.h>
 #include "servicepoint.h"
 
+
 int main(void) {
-    //UdpConnection *connection = sp_udp_open_ipv4(172, 23, 42, 29, 2342);
-    UdpConnection *connection = sp_udp_open_ipv4(127, 0, 0, 1, 2342);
+    printf("test\n");
+
+    UdpSocket *connection = sp_udp_open_ipv4(172, 23, 42, 29, 2342);
+    //UdpSocket *connection = sp_udp_open_ipv4(127, 0, 0, 1, 2342);
     if (connection == NULL)
         return 1;
 
@@ -11,7 +15,7 @@ int main(void) {
     CharGrid *grid = sp_char_grid_new(5, 2);
     if (grid == NULL)
         return 1;
-    
+
     sp_char_grid_set(grid, 0, 0, 'H');
     sp_char_grid_set(grid, 1, 0, 'e');
     sp_char_grid_set(grid, 2, 0, 'l');
diff --git a/example/src/brightness_tester.c b/example/src/brightness_tester.c
index d06d30d..c3e42ba 100644
--- a/example/src/brightness_tester.c
+++ b/example/src/brightness_tester.c
@@ -1,8 +1,8 @@
 #include "servicepoint.h"
 
 int main(void) {
-    // UdpConnection *connection = sp_udp_open_ipv4(172, 23, 42, 29, 2342);
-    UdpConnection *connection = sp_udp_open_ipv4(127, 0, 0, 1, 2342);
+    UdpSocket *connection = sp_udp_open_ipv4(172, 23, 42, 29, 2342);
+    //UdpSocket *connection = sp_udp_open_ipv4(127, 0, 0, 1, 2342);
     if (connection == NULL)
         return -1;
 
diff --git a/example/src/random_stuff.c b/example/src/random_stuff.c
index 2bf722e..96beefb 100644
--- a/example/src/random_stuff.c
+++ b/example/src/random_stuff.c
@@ -1,9 +1,7 @@
-//#include <stdarg.h>
 #include "servicepoint.h"
-//#include <stdio.h>
 
 int main(void) {
-    UdpConnection *connection = sp_udp_open_ipv4(127, 0, 0, 1, 2342);
+    UdpSocket *connection = sp_udp_open_ipv4(127, 0, 0, 1, 2342);
     if (connection == NULL)
         return 1;
 
diff --git a/include/servicepoint.h b/include/servicepoint.h
index 77d2e36..5863ef5 100644
--- a/include/servicepoint.h
+++ b/include/servicepoint.h
@@ -226,13 +226,9 @@ typedef struct SPBitVec SPBitVec;
 typedef struct TypedCommand TypedCommand;
 
 /**
- * A connection using the UDP protocol.
- *
- * Use this when sending commands directly to the display.
- *
- * Requires the feature "`protocol_udp`" which is enabled by default.
+ * This is a type only used by cbindgen to have a type for pointers.
  */
-typedef struct UdpConnection UdpConnection;
+typedef struct UdpSocket UdpSocket;
 
 /**
  * A 2D grid of values.
@@ -298,7 +294,7 @@ typedef struct {
  * grid.set(1, 1, Brightness::MIN);
  *
  * # let connection = FakeConnection;
- * connection.send(BrightnessGridCommand {
+ * connection.send_command(BrightnessGridCommand {
  *     origin: Origin::new(3, 7),
  *     grid
  * }).unwrap()
@@ -318,7 +314,7 @@ typedef ValueGrid_Brightness BrightnessGrid;
  *
  * let b = Brightness::try_from(7).unwrap();
  * # let connection = FakeConnection;
- * let result = connection.send(GlobalBrightnessCommand::from(b));
+ * let result = connection.send_command(GlobalBrightnessCommand::from(b));
  * ```
  */
 typedef uint8_t Brightness;
@@ -347,7 +343,7 @@ typedef uint8_t Brightness;
  *
  * # let connection = FakeConnection;
  * let command = CharGridCommand { origin: Origin::ZERO, grid };
- * connection.send(command).unwrap()
+ * connection.send_command(command).unwrap()
  * ```
  */
 typedef ValueGrid_char CharGrid;
@@ -1220,7 +1216,7 @@ bool sp_u16_to_command_code(uint16_t code,
 /**
  * Closes and deallocates a [UdpConnection].
  */
-void sp_udp_free(UdpConnection */*notnull*/ connection);
+void sp_udp_free(UdpSocket */*notnull*/ connection);
 
 /**
  * Creates a new instance of [UdpConnection].
@@ -1235,7 +1231,7 @@ void sp_udp_free(UdpConnection */*notnull*/ connection);
  *     sp_udp_send_command(connection, sp_command_clear());
  * ```
  */
-UdpConnection *sp_udp_open(char */*notnull*/ host);
+UdpSocket *sp_udp_open(char */*notnull*/ host);
 
 /**
  * Creates a new instance of [UdpConnection].
@@ -1250,11 +1246,11 @@ UdpConnection *sp_udp_open(char */*notnull*/ host);
  *     sp_udp_send_command(connection, sp_command_clear());
  * ```
  */
-UdpConnection *sp_udp_open_ipv4(uint8_t ip1,
-                                uint8_t ip2,
-                                uint8_t ip3,
-                                uint8_t ip4,
-                                uint16_t port);
+UdpSocket *sp_udp_open_ipv4(uint8_t ip1,
+                            uint8_t ip2,
+                            uint8_t ip3,
+                            uint8_t ip4,
+                            uint16_t port);
 
 /**
  * Sends a [TypedCommand] to the display using the [UdpConnection].
@@ -1269,7 +1265,7 @@ UdpConnection *sp_udp_open_ipv4(uint8_t ip1,
  * sp_udp_send_command(connection, sp_command_brightness(5));
  * ```
  */
-bool sp_udp_send_command(UdpConnection */*notnull*/ connection,
+bool sp_udp_send_command(UdpSocket */*notnull*/ connection,
                          TypedCommand */*notnull*/ command);
 
 /**
@@ -1283,8 +1279,7 @@ bool sp_udp_send_command(UdpConnection */*notnull*/ connection,
  * sp_udp_send_header(connection, sp_command_brightness(5));
  * ```
  */
-bool sp_udp_send_header(UdpConnection */*notnull*/ udp_connection,
-                        Header header);
+bool sp_udp_send_header(UdpSocket */*notnull*/ udp_connection, Header header);
 
 /**
  * Sends a [Packet] to the display using the [UdpConnection].
@@ -1293,7 +1288,7 @@ bool sp_udp_send_header(UdpConnection */*notnull*/ udp_connection,
  *
  * returns: true in case of success
  */
-bool sp_udp_send_packet(UdpConnection */*notnull*/ connection,
+bool sp_udp_send_packet(UdpSocket */*notnull*/ connection,
                         Packet */*notnull*/ packet);
 
 #ifdef __cplusplus
diff --git a/src/lib.rs b/src/lib.rs
index db6361b..47b21d5 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -67,3 +67,6 @@ pub(crate) unsafe fn heap_drop<T>(x: NonNull<T>) {
 pub(crate) unsafe fn heap_remove<T>(x: NonNull<T>) -> T {
     unsafe { *Box::from_raw(x.as_ptr()) }
 }
+
+/// This is a type only used by cbindgen to have a type for pointers.
+pub struct UdpSocket;
\ No newline at end of file