1+ name : CI
2+
3+ on :
4+ push :
5+ branches : [ master, main ]
6+ pull_request :
7+ branches : [ master, main ]
8+
9+ jobs :
10+ test-make :
11+ name : Test with Make
12+ runs-on : ${{ matrix.os }}
13+ strategy :
14+ fail-fast : false
15+ matrix :
16+ os : [ubuntu-latest, macos-latest]
17+ include :
18+ - os : ubuntu-latest
19+ cc : gcc
20+ - os : macos-latest
21+ cc : clang
22+
23+ steps :
24+ - uses : actions/checkout@v4
25+
26+ - name : Install dependencies (Ubuntu)
27+ if : matrix.os == 'ubuntu-latest'
28+ run : |
29+ sudo apt-get update
30+ sudo apt-get install -y build-essential
31+
32+ - name : Install dependencies (macOS)
33+ if : matrix.os == 'macos-latest'
34+ run : |
35+ # Ensure we have the latest Xcode command line tools
36+ xcode-select --install 2>/dev/null || true
37+
38+ - name : Build with Make
39+ run : |
40+ export CC=${{ matrix.cc }}
41+ make clean || true
42+ make
43+
44+ - name : Test with Make
45+ run : |
46+ make test
47+
48+ - name : Test installation
49+ run : |
50+ sudo make install PREFIX=/usr/local
51+ # Verify installation
52+ ls -la /usr/local/lib/libargparse*
53+ ls -la /usr/local/include/argparse.h
54+
55+ test-cmake :
56+ name : Test with CMake
57+ runs-on : ${{ matrix.os }}
58+ strategy :
59+ fail-fast : false
60+ matrix :
61+ os : [ubuntu-latest, macos-latest, windows-latest]
62+ build_type : [Debug, Release]
63+ include :
64+ - os : ubuntu-latest
65+ generator : " Unix Makefiles"
66+ - os : macos-latest
67+ generator : " Unix Makefiles"
68+ - os : windows-latest
69+ generator : " Visual Studio 17 2022"
70+
71+ steps :
72+ - uses : actions/checkout@v4
73+
74+ - name : Install dependencies (Ubuntu)
75+ if : matrix.os == 'ubuntu-latest'
76+ run : |
77+ sudo apt-get update
78+ sudo apt-get install -y build-essential cmake
79+
80+ - name : Install dependencies (macOS)
81+ if : matrix.os == 'macos-latest'
82+ run : |
83+ brew install cmake
84+
85+ - name : Setup MSVC (Windows)
86+ if : matrix.os == 'windows-latest'
87+ uses : ilammy/msvc-dev-cmd@v1
88+
89+ - name : Configure CMake
90+ run : |
91+ cmake -B build -G "${{ matrix.generator }}" -DCMAKE_BUILD_TYPE=${{ matrix.build_type }}
92+
93+ - name : Build with CMake
94+ run : |
95+ cmake --build build --config ${{ matrix.build_type }}
96+
97+ - name : Test with CMake (Unix)
98+ if : matrix.os != 'windows-latest'
99+ run : |
100+ cd build
101+ make -C ../tests test
102+
103+ - name : Test with CMake (Windows)
104+ if : matrix.os == 'windows-latest'
105+ run : |
106+ # Windows doesn't have make, so we'll compile and run tests manually
107+ cd tests
108+ cl /I../ test_null_help.c ../argparse.c /Fe:test_null_help.exe
109+ ./test_null_help.exe --help
110+
111+ - name : Test installation with CMake (Unix)
112+ if : matrix.os != 'windows-latest'
113+ run : |
114+ sudo cmake --install build --prefix /usr/local
115+ # Verify installation
116+ ls -la /usr/local/lib/libargparse*
117+ ls -la /usr/local/include/argparse.h
118+ # Test pkg-config
119+ pkg-config --exists argparse
120+
121+ test-cross-platform :
122+ name : Cross-platform compatibility
123+ runs-on : ubuntu-latest
124+ strategy :
125+ matrix :
126+ compiler : [gcc, clang]
127+ std : [c89, c99, c11]
128+
129+ steps :
130+ - uses : actions/checkout@v4
131+
132+ - name : Install compilers
133+ run : |
134+ sudo apt-get update
135+ sudo apt-get install -y gcc clang
136+
137+ - name : Test C standard compliance
138+ run : |
139+ export CC=${{ matrix.compiler }}
140+ export CFLAGS="-std=${{ matrix.std }} -Wall -Wextra -Werror -pedantic"
141+ make clean || true
142+ make
143+ make test
144+
145+ memory-safety :
146+ name : Memory Safety Tests
147+ runs-on : ubuntu-latest
148+
149+ steps :
150+ - uses : actions/checkout@v4
151+
152+ - name : Install tools
153+ run : |
154+ sudo apt-get update
155+ sudo apt-get install -y valgrind clang
156+
157+ - name : Build with sanitizers
158+ run : |
159+ export CC=clang
160+ export CFLAGS="-fsanitize=address -fsanitize=undefined -g"
161+ export LDFLAGS="-fsanitize=address -fsanitize=undefined"
162+ make clean || true
163+ make
164+
165+ - name : Run tests with AddressSanitizer
166+ run : |
167+ export ASAN_OPTIONS=abort_on_error=1
168+ make test
169+
170+ - name : Build for Valgrind
171+ run : |
172+ make clean
173+ export CFLAGS="-g -O0"
174+ make
175+
176+ - name : Run tests with Valgrind
177+ run : |
178+ cd tests
179+ for test in test_*.sh; do
180+ echo "Running $test with Valgrind..."
181+ # Modify test to run with valgrind
182+ sed 's|\./\([^[:space:]]*\)|valgrind --error-exitcode=1 --leak-check=full ./\1|g' "$test" > "valgrind_$test"
183+ chmod +x "valgrind_$test"
184+ bash "valgrind_$test" || echo "Valgrind test failed: $test"
185+ done
0 commit comments