diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index d6e58ca..9089694 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -40,15 +40,5 @@ jobs: - name: build run: cargo build - - name: build example -- glibc release - run: cd example && make clean && make PROFILE=release - - name: build example -- glibc debug - run: cd example && make clean && make PROFILE=debug - - name: build example -- glibc size-optimized - run: cd example && make clean && make PROFILE=size-optimized - - name: build example -- musl release - run: cd example && make clean && make PROFILE=release MUSL=1 - - name: build example -- musl debug - run: cd example && make clean && make PROFILE=debug MUSL=1 - - name: build example -- musl size-optimized - run: cd example && make clean && make PROFILE=size-optimized MUSL=1 + - name: build example + run: cd example && make diff --git a/Cargo.toml b/Cargo.toml index cc7b596..e92ceb2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,9 +26,8 @@ git = "https://git.berlin.ccc.de/servicepoint/servicepoint/" branch = "next" [features] -protocol_udp = ["servicepoint/protocol_udp"] -all_compressions = ["servicepoint/all_compressions"] -default = ["all_compressions", "servicepoint/default", "protocol_udp"] +full = ["servicepoint/all_compressions", "servicepoint/default"] +default = ["full"] [lints.rust] missing-docs = "warn" diff --git a/example/Makefile b/example/Makefile index 9e001e9..f69f385 100644 --- a/example/Makefile +++ b/example/Makefile @@ -1,113 +1,83 @@ -CARGO ?= rustup run nightly cargo -STRIP ?= strip +CC := gcc +CARGO := rustup run nightly cargo -FEATURES := protocol_udp +TARGET := x86_64-unknown-linux-musl +PROFILE := size-optimized THIS_DIR := $(dir $(realpath $(lastword $(MAKEFILE_LIST)))) -REPO_ROOT := $(realpath $(THIS_DIR)/..) +REPO_ROOT := $(THIS_DIR)/.. +RUST_TARGET_DIR := $(REPO_ROOT)/target/$(TARGET)/$(PROFILE) 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)) +RUSTFLAGS := -Zlocation-detail=none \ + -Zfmt-debug=none \ + -C linker=musl-gcc \ + -C link-arg=-s \ + -C link-arg=--gc-sections \ + -C link-arg=-z,norelro \ + -C link-arg=--hash-style=gnu \ + --crate-type=staticlib \ + -C panic=abort -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 - -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 -else - TARGET ?= x86_64-unknown-linux-gnu - CC ?= gcc - CCFLAGS += -shared -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) \ +CARGOFLAGS := --manifest-path=$(REPO_ROOT)/Cargo.toml \ + --profile=$(PROFILE) \ --no-default-features \ - --features=$(FEATURES) \ - --target=$(TARGET) + --target=$(TARGET) \ + -Zbuild-std="core,std,alloc,proc_macro,panic_abort" \ + -Zbuild-std-features="panic_immediate_abort" \ -ifeq ($(CFG_PROFILE), size-optimized) - CCFLAGS += -Oz \ - -fwrapv -fomit-frame-pointer -fno-stack-protector\ - -fno-unroll-loops \ - -fno-unwind-tables -fno-asynchronous-unwind-tables \ - -fmerge-all-constants \ - -Wl,-z,norelro \ - -Wl,--hash-style=gnu \ - -fvisibility=hidden \ - -Bsymbolic \ - -Wl,--exclude-libs,ALL \ - -fno-ident \ - -fno-exceptions - CARGOFLAGS += -Zbuild-std="core,std,alloc,proc_macro,panic_abort" \ - -Zbuild-std-features="panic_immediate_abort" - RUSTFLAGS += -Zlocation-detail=none \ - -Zfmt-debug=none \ - -C link-arg=-z,norelro \ - -C link-arg=--hash-style=gnu \ - -C panic=abort -else ifeq ($(CFG_PROFILE), release) - CCFLAGS += -O2 -else ifeq ($(CFG_PROFILE), debug) - CCFLAGS += -Og -else - CFG_PROFILE := $(error "PROFILE has to be set to one of: debug, release, size-optimized") -endif +CCFLAGS := -static -Os \ + -ffunction-sections -fdata-sections \ + -fwrapv -fomit-frame-pointer -fno-stack-protector\ + -fwhole-program \ + -nodefaultlibs -lservicepoint_binding_c -lc \ + -Wl,--gc-sections \ + -fno-unroll-loops \ + -fno-unwind-tables -fno-asynchronous-unwind-tables \ + -fmerge-all-constants \ + -Wl,-z,norelro \ + -Wl,--hash-style=gnu \ + -fvisibility=hidden \ + -Bsymbolic \ + -Wl,--exclude-libs,ALL \ + -fno-ident \ + -Wall + #-fuse-ld=gold \ + -fno-exceptions + #-Wl,--icf=all \ -ifeq ($(LTO), 1) - CCFLAGS += -flto -endif +STRIPFLAGS := -s --strip-unneeded -R .comment -R .gnu.version -R .comment -R .note -R .note.gnu.build-id -R .note.ABI-tag -_c_src := $(wildcard ./src/*.c) -_programs := $(basename $(notdir $(_c_src))) +_c_src := $(wildcard *.c) +_programs := $(basename $(_c_src)) _bins := $(addprefix out/, $(_programs)) _unstripped_bins := $(addsuffix _unstripped, $(_bins)) _run_programs := $(addprefix run_, $(_programs)) -_rs_src := $(wildcard ../src/**.rs) ../Cargo.lock ../Cargo.toml ../cbindgen.toml -_sp_artifacts := $(SERVICEPOINT_HEADER_OUT)/servicepoint.h $(RUST_TARGET_DIR)/libservicepoint_binding_c.a $(RUST_TARGET_DIR)/libservicepoint_binding_c.so +_rs_src := $(wildcard ../src/**.rs) ../Cargo.lock all: $(_bins) clean: - echo rm -r $(OUT_DIR) || true - rm $(SERVICEPOINT_HEADER_OUT)/servicepoint.h || true + rm -r out || true + rm include/servicepoint.h || true cargo clean -.PHONY: all clean sizes $(_run_programs) +PHONY: all clean sizes $(_run_programs) -$(_unstripped_bins): out/%_unstripped: src/%.c $(SERVICEPOINT_HEADER_OUT)/servicepoint.h $(_sp_artifacts) +$(_unstripped_bins): out/%_unstripped: %.c $(SERVICEPOINT_HEADER_OUT)/servicepoint.h $(RUST_TARGET_DIR)/libservicepoint_binding_c.a mkdir -p out || true - ${CC} $< \ + ${CC} $^ \ -I $(SERVICEPOINT_HEADER_OUT) \ - -L $(RUST_TARGET_DIR) \ + -L $(RUST_TARGET_DIR)\ $(CCFLAGS) \ -o $@ $(_bins): out/%: out/%_unstripped - $(STRIP) $(STRIPFLAGS) $^ -o $@ + strip $(STRIPFLAGS) $^ -o $@ -$(_sp_artifacts): $(_rs_src) - mkdir -p $(SERVICEPOINT_HEADER_OUT) || true - # generate servicepoint header and library to link against +$(SERVICEPOINT_HEADER_OUT)/servicepoint.h $(RUST_TARGET_DIR)/libservicepoint_binding_c.a: $(_rs_src) + mkdir -p include || true + # generate servicepoint header and binary to link against ${CARGO} rustc $(CARGOFLAGS) -- $(RUSTFLAGS) $(_run_programs): run_%: out/% FORCE @@ -116,9 +86,9 @@ $(_run_programs): run_%: out/% FORCE sizes: $(_bins) ls -lB out -analyze-size: $(OUT_DIR)/$(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 +#analyze-size: out/example_unstripped +# nm --print-size --size-sort --reverse-sort --radix=d --demangle out/example_unstripped \ +# | awk '{size=$$2+0; print size "\t" $$4}' \ +# | less FORCE: ; diff --git a/example/src/announce.c b/example/announce.c similarity index 100% rename from example/src/announce.c rename to example/announce.c diff --git a/example/src/brightness_tester.c b/example/brightness_tester.c similarity index 100% rename from example/src/brightness_tester.c rename to example/brightness_tester.c diff --git a/example/src/random_stuff.c b/example/random_stuff.c similarity index 79% rename from example/src/random_stuff.c rename to example/random_stuff.c index 2bf722e..ca5a14d 100644 --- a/example/src/random_stuff.c +++ b/example/random_stuff.c @@ -1,6 +1,5 @@ -//#include +#include #include "servicepoint.h" -//#include int main(void) { UdpConnection *connection = sp_udp_open_ipv4(127, 0, 0, 1, 2342); @@ -18,7 +17,7 @@ int main(void) { return 1; Header *header = sp_packet_get_header(packet); - // printf("[%d, %d, %d, %d, %d]\n", header->command_code, header->a, header->b, header->c, header->d); + printf("[%d, %d, %d, %d, %d]\n", header->command_code, header->a, header->b, header->c, header->d); sp_udp_send_packet(connection, packet); diff --git a/flake.nix b/flake.nix index 9d67ae9..b4f874f 100644 --- a/flake.nix +++ b/flake.nix @@ -33,17 +33,16 @@ { pkgs, system }: { default = pkgs.mkShell rec { - buildInputs = with pkgs; [ + buildInputs = with pkgs;[ xe xz - #libgcc - #glibc - pkgsStatic.musl - # libunwind + libgcc + #glibc.static + musl + libunwind + ]; - ]; - - nativeBuildInputs = with pkgs; [ + nativeBuildInputs = with pkgs;[ (pkgs.symlinkJoin { name = "rust-toolchain"; paths = with pkgs; [ @@ -58,14 +57,11 @@ ]; }) gcc - gdb - pkgsStatic.gcc gnumake pkg-config ]; - #RUST_SRC_PATH = "${pkgs.rust.packages.stable.rustPlatform.rustLibSrc}"; - CARGO = "rustup run nightly cargo"; + RUST_SRC_PATH = "${pkgs.rust.packages.stable.rustPlatform.rustLibSrc}"; }; } ); diff --git a/src/bitmap.rs b/src/bitmap.rs index 5db4af0..358be48 100644 --- a/src/bitmap.rs +++ b/src/bitmap.rs @@ -1,8 +1,6 @@ use crate::byte_slice::ByteSlice; use crate::{heap_drop, heap_move, heap_move_nonnull, heap_remove, SPBitVec}; -use servicepoint::{ - Bitmap, BitmapCommand, CompressionCode, DataRef, Grid, Origin, Packet, -}; +use servicepoint::{Bitmap, BitmapCommand, CompressionCode, DataRef, Grid, Origin, Packet}; use std::ptr::NonNull; /// Creates a new [Bitmap] with the specified dimensions. @@ -212,7 +210,7 @@ pub unsafe extern "C" fn sp_bitmap_into_packet( bitmap: NonNull, x: usize, y: usize, - compression: CompressionCode, + compression: CompressionCode ) -> *mut Packet { let bitmap = unsafe { heap_remove(bitmap) }; match Packet::try_from(BitmapCommand { diff --git a/src/bitvec.rs b/src/bitvec.rs index 82c0fbe..22f7545 100644 --- a/src/bitvec.rs +++ b/src/bitvec.rs @@ -1,7 +1,5 @@ use crate::{heap_drop, heap_move, heap_move_nonnull, heap_remove, ByteSlice}; -use servicepoint::{ - BinaryOperation, BitVecCommand, BitVecU8Msb0, CompressionCode, Packet, -}; +use servicepoint::{BinaryOperation, BitVecCommand, BitVecU8Msb0, CompressionCode, Packet}; use std::ptr::NonNull; /// A vector of bits @@ -159,7 +157,7 @@ pub unsafe extern "C" fn sp_bitvec_into_packet( bitvec: NonNull, offset: usize, operation: BinaryOperation, - compression: CompressionCode, + compression: CompressionCode ) -> *mut Packet { let bitvec = unsafe { heap_remove(bitvec) }.0; match Packet::try_from(BitVecCommand { diff --git a/src/commands/mod.rs b/src/commands/mod.rs new file mode 100644 index 0000000..1ea03d5 --- /dev/null +++ b/src/commands/mod.rs @@ -0,0 +1,3 @@ +mod typed; + +pub use typed::*; diff --git a/src/typed_command.rs b/src/commands/typed.rs similarity index 100% rename from src/typed_command.rs rename to src/commands/typed.rs diff --git a/src/udp.rs b/src/connection.rs similarity index 100% rename from src/udp.rs rename to src/connection.rs diff --git a/src/cp437_grid.rs b/src/cp437_grid.rs index ff70d2b..01aeb1e 100644 --- a/src/cp437_grid.rs +++ b/src/cp437_grid.rs @@ -1,7 +1,5 @@ use crate::{heap_drop, heap_move, heap_move_nonnull, heap_remove, ByteSlice}; -use servicepoint::{ - Cp437Grid, Cp437GridCommand, DataRef, Grid, Origin, Packet, -}; +use servicepoint::{Cp437Grid, Cp437GridCommand, DataRef, Grid, Origin, Packet}; use std::ptr::NonNull; /// Creates a new [Cp437Grid] with the specified dimensions. diff --git a/src/lib.rs b/src/lib.rs index 57192e0..05fb009 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -30,26 +30,22 @@ pub use crate::bitvec::*; pub use crate::brightness_grid::*; pub use crate::byte_slice::*; pub use crate::char_grid::*; +pub use crate::commands::*; +pub use crate::connection::*; pub use crate::cp437_grid::*; pub use crate::packet::*; pub use servicepoint::CommandCode; use std::ptr::NonNull; -pub use typed_command::*; mod bitmap; mod bitvec; mod brightness_grid; mod byte_slice; mod char_grid; +mod commands; +mod connection; mod cp437_grid; mod packet; -mod typed_command; - -#[cfg(feature = "protocol_udp")] -mod udp; - -#[cfg(feature = "protocol_udp")] -pub use udp::*; use std::time::Duration;