Build Linux and Windows out-of-tree in dedicated linux/ and windows/ directories

This commit is contained in:
Andrea Mazzoleni
2026-09-26 19:06:59 +02:00
parent 0138b48023
commit d5e18adb95
6 changed files with 38 additions and 42 deletions
+2
View File
@@ -36,6 +36,8 @@ install-sh
missing
stamp-h1
.dirstamp
linux/
windows/
# objects
snapraid
+11 -7
View File
@@ -80,12 +80,16 @@ SnapRAID is designed to recover from an interruption, including `SIGKILL`, at an
- `Makefile.am`: Source file lists, dependencies, install hooks (including rules for generating documentation)
- `uncrustify.cfg`: Code formatting rules for main application source files
- `linux.cfg`: Code formatting rules for `raid/` directory and its subdirectories
- Run `make doc` to regenerate all manual pages (`*.1`) and text manuals (`*.txt`)
- Run `(cd linux && make doc)` to regenerate all manual pages (`*.1`) and text manuals (`*.txt`)
- Always use parallel compilation with `make -j$(nproc)` instead of plain `make`
- Create temporary files and directories under `/tmp/snapraid/`.
- To cross-compile for Windows x64: build out-of-tree in `/tmp/snapraid/` so the Linux configuration is preserved:
`mkdir -p /tmp/snapraid/windows && (cd /tmp/snapraid/windows && /path/to/configure.windows-x64 && make -j$(nproc))`
Subsequent Windows rebuilds only require: `(cd /tmp/snapraid/windows && make -j$(nproc))`
- Both Linux and Windows builds are out-of-tree in dedicated subdirectories (`linux/` and `windows/`) in the project directory, keeping the root directory clean:
- Linux build:
`mkdir -p linux && (cd linux && ../configure && make -j$(nproc))`
Subsequent Linux rebuilds: `(cd linux && make -j$(nproc))`
- Windows x64 cross-compilation:
`mkdir -p windows && (cd windows && ../configure.windows-x64 && make -j$(nproc))`
Subsequent Windows rebuilds: `(cd windows && make -j$(nproc))`
- The Windows build needs to be tested only when modifying Windows-specific code (e.g., `os/mingw.*`, `cmdline/mingwapp.c`, or Windows-specific `#ifdef` paths)
## Code Style Guidelines
@@ -137,8 +141,8 @@ SnapRAID is designed to recover from an interruption, including `SIGKILL`, at an
#### Testing Changes
- Never run `make check` because it's too expansive
- Run `./snapraid test` for the regression test
- The `test` and `selftest` suites (in `cmdline/selftest.c` and `./snapraid test`) must be strictly memory-only without creating files or performing filesystem I/O
- If running the speed benchmark (`./snapraid -T`), always use `--speed-test-period 100` (e.g. `./snapraid -T --speed-test-period 100`) to run it faster
- Run `./linux/snapraid test` for the regression test
- The `test` and `selftest` suites (in `cmdline/selftest.c` and `./linux/snapraid test`) must be strictly memory-only without creating files or performing filesystem I/O
- If running the speed benchmark (`./linux/snapraid -T`), always use `--speed-test-period 100` (e.g. `./linux/snapraid -T --speed-test-period 100`) to run it faster
- The Windows build needs to be tested only when modifying Windows-specific code
- Verify error paths and recovery scenarios (the test suite covers aborted sync, UUID changes, disk failures)
+18
View File
@@ -0,0 +1,18 @@
# If Makefile exists (generated by ./configure in this directory), delegate
# directly to it so that in-tree builds work normally as if this file were absent.
# Otherwise, redirect all targets to linux/Makefile for out-of-tree builds.
# Named GNUmakefile so it takes precedence in GNU Make without conflicting with
# Makefile on case-insensitive filesystems (Windows/macOS).
ifeq ($(wildcard Makefile),Makefile)
include Makefile
else ifeq ($(wildcard linux/Makefile),linux/Makefile)
all doc:
$(MAKE) -C linux $@
.DEFAULT:
$(MAKE) -C linux $@
.PHONY: all doc
else
$(error SnapRAID is not configured. Run './configure')
endif
+3 -1
View File
@@ -1 +1,3 @@
./configure CC=/usr/libexec/ccc-analyzer
DIR=$(dirname "$0")
"$DIR/configure" CC=/usr/libexec/ccc-analyzer
+1 -34
View File
@@ -1,35 +1,2 @@
#!/bin/bash
# Identify the original source directory
DIR=$(dirname "$0")
# Resolve the absolute path of the source directory to prevent path ambiguity
SRC_DIR=$(cd "$DIR" && pwd)
# List of critical Autotools files to hide temporarily
FILES_TO_HIDE=("config.status" "Makefile" "config.log")
HIDDEN_FILES=()
# Function to restore original files when the script finishes or exits
restore_files() {
for file in "${HIDDEN_FILES[@]}"; do
if [ -f "$SRC_DIR/${file}.bak" ]; then
mv "$SRC_DIR/${file}.bak" "$SRC_DIR/$file"
fi
done
}
# Ensure files are restored under any exit condition (success, error, or interruption like Ctrl+C)
trap restore_files EXIT INT TERM
# 1. Mask the files in the original source directory
for file in "${FILES_TO_HIDE[@]}"; do
if [ -f "$SRC_DIR/$file" ]; then
mv "$SRC_DIR/$file" "$SRC_DIR/${file}.bak"
HIDDEN_FILES+=("$file") # Keep track of files that were actually renamed
fi
done
# 2. Run the original configure command
"$SRC_DIR/configure" --host=x86_64-w64-mingw32.static --build=$("$SRC_DIR/config.guess") "$@"
# Note: The 'restore_files' function will automatically trigger here via the trap hook.
"$DIR/configure" --host=x86_64-w64-mingw32.static --build=$("$DIR/config.guess") "$@"
+3
View File
@@ -47,3 +47,6 @@ sudo sh makeslackware.sh
sudo sh makearch.sh
sudo sh makedeb.sh
sudo sh makerpm.sh
make distclean