diff --git a/example/Makefile b/example/Makefile index 7e5bfe7..9e001e9 100644 --- a/example/Makefile +++ b/example/Makefile @@ -1,85 +1,113 @@ -CC := gcc -CARGO := rustup run nightly cargo +CARGO ?= rustup run nightly cargo +STRIP ?= strip -TARGET := x86_64-unknown-linux-musl -PROFILE := size-optimized FEATURES := protocol_udp THIS_DIR := $(dir $(realpath $(lastword $(MAKEFILE_LIST)))) -REPO_ROOT := $(THIS_DIR)/.. -RUST_TARGET_DIR := $(REPO_ROOT)/target/$(TARGET)/$(PROFILE) +REPO_ROOT := $(realpath $(THIS_DIR)/..) export SERVICEPOINT_HEADER_OUT := $(REPO_ROOT)/include -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 +override CFG_MUSL := $(if $(CFG_MUSL),$(CFG_MUSL),$(if $(MUSL),$(MUSL),0)) +override CFG_PROFILE := $(if $(CFG_PROFILE),$(CFG_PROFILE),$(if $(PROFILE),$(PROFILE),release)) -CARGOFLAGS := --manifest-path=$(REPO_ROOT)/Cargo.toml \ - --profile=$(PROFILE) \ +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) \ --no-default-features \ --features=$(FEATURES) \ - --target=$(TARGET) \ - -Zbuild-std="core,std,alloc,proc_macro,panic_abort" \ - -Zbuild-std-features="panic_immediate_abort" \ + --target=$(TARGET) -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 ($(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 -STRIPFLAGS := -s --strip-unneeded -R .comment -R .gnu.version -R .comment -R .note -R .note.gnu.build-id -R .note.ABI-tag +ifeq ($(LTO), 1) + CCFLAGS += -flto +endif -_c_src := $(wildcard *.c) -_programs := $(basename $(_c_src)) +_c_src := $(wildcard ./src/*.c) +_programs := $(basename $(notdir $(_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 all: $(_bins) clean: - rm -r out || true - rm include/servicepoint.h || true + echo rm -r $(OUT_DIR) || true + rm $(SERVICEPOINT_HEADER_OUT)/servicepoint.h || true cargo clean -PHONY: all clean sizes $(_run_programs) +.PHONY: all clean sizes $(_run_programs) -$(_unstripped_bins): out/%_unstripped: %.c $(SERVICEPOINT_HEADER_OUT)/servicepoint.h $(RUST_TARGET_DIR)/libservicepoint_binding_c.a +$(_unstripped_bins): out/%_unstripped: src/%.c $(SERVICEPOINT_HEADER_OUT)/servicepoint.h $(_sp_artifacts) 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 $@ -$(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 +$(_sp_artifacts): $(_rs_src) + mkdir -p $(SERVICEPOINT_HEADER_OUT) || true + # generate servicepoint header and library to link against ${CARGO} rustc $(CARGOFLAGS) -- $(RUSTFLAGS) $(_run_programs): run_%: out/% FORCE @@ -88,9 +116,9 @@ $(_run_programs): run_%: out/% FORCE sizes: $(_bins) ls -lB out -#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 +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 FORCE: ; diff --git a/example/announce.c b/example/src/announce.c similarity index 100% rename from example/announce.c rename to example/src/announce.c diff --git a/example/brightness_tester.c b/example/src/brightness_tester.c similarity index 100% rename from example/brightness_tester.c rename to example/src/brightness_tester.c diff --git a/example/random_stuff.c b/example/src/random_stuff.c similarity index 79% rename from example/random_stuff.c rename to example/src/random_stuff.c index ca5a14d..2bf722e 100644 --- a/example/random_stuff.c +++ b/example/src/random_stuff.c @@ -1,5 +1,6 @@ -#include +//#include #include "servicepoint.h" +//#include int main(void) { UdpConnection *connection = sp_udp_open_ipv4(127, 0, 0, 1, 2342); @@ -17,7 +18,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 b4f874f..9d67ae9 100644 --- a/flake.nix +++ b/flake.nix @@ -33,16 +33,17 @@ { pkgs, system }: { default = pkgs.mkShell rec { - buildInputs = with pkgs;[ + buildInputs = with pkgs; [ xe xz - libgcc - #glibc.static - musl - libunwind - ]; + #libgcc + #glibc + pkgsStatic.musl + # libunwind - nativeBuildInputs = with pkgs;[ + ]; + + nativeBuildInputs = with pkgs; [ (pkgs.symlinkJoin { name = "rust-toolchain"; paths = with pkgs; [ @@ -57,11 +58,14 @@ ]; }) gcc + gdb + pkgsStatic.gcc gnumake pkg-config ]; - RUST_SRC_PATH = "${pkgs.rust.packages.stable.rustPlatform.rustLibSrc}"; + #RUST_SRC_PATH = "${pkgs.rust.packages.stable.rustPlatform.rustLibSrc}"; + CARGO = "rustup run nightly cargo"; }; } );