From f16cb153e1918bc4f9573ea0f2b349467670620b Mon Sep 17 00:00:00 2001 From: Michael Thomson Date: Tue, 10 Sep 2024 12:58:55 -0400 Subject: [PATCH] update --- .envrc | 1 + .gitignore | 3 +++ Makefile | 10 +++++----- flake.lock | 25 +++++++++++++++++++++++++ flake.nix | 39 +++++++++++++++++++++++++++++++++++++++ server | Bin 79840 -> 55048 bytes 6 files changed, 73 insertions(+), 5 deletions(-) create mode 100644 .envrc create mode 100644 flake.lock create mode 100644 flake.nix diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..3550a30 --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +use flake diff --git a/.gitignore b/.gitignore index c6127b3..d62ec78 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +.direnv +.ccls-cache +compile_commands.json # Prerequisites *.d diff --git a/Makefile b/Makefile index a4b8202..7fa9ed9 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ # ----- Variables for customization ----- CC = gcc # Compiler (you can change to clang if desired) -CFLAGS = -g3 -Wall -Wextra -fsanitize=address,undefined # Standard flags + debugging & warnings +CFLAGS = -g2 -Wall -Wextra #-fsanitize=address # Standard flags + debugging & warnings LDFLAGS = # Linker flags, if any # ----- Automatic dependency tracking ----- @@ -9,14 +9,14 @@ OBJS := $(SRCS:.c=.o) # Corresponding object files (.o) HDRS := $(SRCS:.c=.h) # ----- Targets ----- -server: $(OBJS) - $(CC) $(CFLAGS) $(OBJS) -o server $(LDFLAGS) +server: $(OBJS) + $(CC) $(CFLAGS) $(OBJS) -o server $(LDFLAGS) # Create object files from source files %.o: %.c %.h $(CC) $(CFLAGS) -c $< -o $@ -# Phony target for cleaning +# Phony target for cleaning .PHONY: clean clean: - rm -f $(OBJS) server + rm -f $(OBJS) diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..86ed220 --- /dev/null +++ b/flake.lock @@ -0,0 +1,25 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1721379653, + "narHash": "sha256-8MUgifkJ7lkZs3u99UDZMB4kbOxvMEXQZ31FO3SopZ0=", + "rev": "1d9c2c9b3e71b9ee663d11c5d298727dace8d374", + "revCount": 655136, + "type": "tarball", + "url": "https://api.flakehub.com/f/pinned/NixOS/nixpkgs/0.1.655136%2Brev-1d9c2c9b3e71b9ee663d11c5d298727dace8d374/0190cd4f-c0eb-72cb-834b-ac854aa282dc/source.tar.gz" + }, + "original": { + "type": "tarball", + "url": "https://flakehub.com/f/NixOS/nixpkgs/0.1.%2A.tar.gz" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..7b99041 --- /dev/null +++ b/flake.nix @@ -0,0 +1,39 @@ +{ + description = "A Nix-flake-based C/C++ development environment"; + + inputs.nixpkgs.url = "https://flakehub.com/f/NixOS/nixpkgs/0.1.*.tar.gz"; + + outputs = { self, nixpkgs }: + let + supportedSystems = [ "x86_64-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin" ]; + forEachSupportedSystem = f: nixpkgs.lib.genAttrs supportedSystems (system: f { + pkgs = import nixpkgs { inherit system; }; + }); + in + { + devShells = forEachSupportedSystem ({ pkgs }: { + default = pkgs.mkShell.override + { + # Override stdenv in order to change compiler: + # stdenv = pkgs.clangStdenv; + } + { + packages = with pkgs; [ + clang-tools + cmake + codespell + conan + cppcheck + doxygen + gtest + lcov + vcpkg + vcpkg-tool + ccls + bear + ] ++ (if system == "aarch64-darwin" then [ ] else [ gdb ]); + }; + }); + }; +} + diff --git a/server b/server index 2acf9984657fd4d1064c3b023aae26bec3b3a93a..b9198f53ee0188e8031d434a84c66c3bf8d2ce81 100755 GIT binary patch literal 55048 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 literal 79840 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