ci: add clang code coverage check (#10)
	
		
			
	
		
	
	
		
	
		
			All checks were successful
		
		
	
	
		
			
				
	
				continuous-integration/drone/push Build is passing
				
			
		
		
	
	
				
					
				
			
		
			All checks were successful
		
		
	
	continuous-integration/drone/push Build is passing
				
			reviewed-on: #10 Co-authored-by: light7734 <light7734@tuta.io> Co-committed-by: light7734 <light7734@tuta.io>
This commit is contained in:
		
							parent
							
								
									3998c4127a
								
							
						
					
					
						commit
						688c88f255
					
				
					 6 changed files with 112 additions and 14 deletions
				
			
		
							
								
								
									
										17
									
								
								.drone.yml
									
										
									
									
									
								
							
							
						
						
									
										17
									
								
								.drone.yml
									
										
									
									
									
								
							|  | @ -25,13 +25,13 @@ trigger: | ||||||
| 
 | 
 | ||||||
| steps: | steps: | ||||||
| - name: unit tests | - name: unit tests | ||||||
|   image: unit_tests:latest |   image: amd64_gcc_unit_tests:latest | ||||||
|   pull: if-not-exists |   pull: if-not-exists | ||||||
|   commands: |   commands: | ||||||
|     - ./tools/ci/amd64/gcc/unit_tests.sh |     - ./tools/ci/amd64/gcc/unit_tests.sh | ||||||
| 
 | 
 | ||||||
| - name: valgrind | - name: valgrind | ||||||
|   image: valgrind:latest |   image: amd64_gcc_valgrind:latest | ||||||
|   pull: if-not-exists |   pull: if-not-exists | ||||||
|   commands: |   commands: | ||||||
|     - ./tools/ci/amd64/gcc/valgrind.sh |     - ./tools/ci/amd64/gcc/valgrind.sh | ||||||
|  | @ -45,14 +45,23 @@ trigger: | ||||||
|   - main |   - main | ||||||
| 
 | 
 | ||||||
| steps: | steps: | ||||||
|  | - name: code coverage | ||||||
|  |   image: amd64_clang_coverage:latest | ||||||
|  |   pull: if-not-exists | ||||||
|  |   environment: | ||||||
|  |     CODECOV_TOKEN: | ||||||
|  |       from_secret: CODECOV_TOKEN  | ||||||
|  |   commands: | ||||||
|  |     - ./tools/ci/amd64/clang/coverage.sh | ||||||
|  | 
 | ||||||
| - name: leak sanitizer | - name: leak sanitizer | ||||||
|   image: leak_sanitizer:latest |   image: amd64_clang_lsan:latest | ||||||
|   pull: if-not-exists |   pull: if-not-exists | ||||||
|   commands: |   commands: | ||||||
|     - ./tools/ci/amd64/clang/lsan.sh |     - ./tools/ci/amd64/clang/lsan.sh | ||||||
| 
 | 
 | ||||||
| - name: memory sanitizer | - name: memory sanitizer | ||||||
|   image: memory_sanitizer:latest |   image: amd64_clang_msan:latest | ||||||
|   pull: if-not-exists |   pull: if-not-exists | ||||||
|   commands: |   commands: | ||||||
|     - ./tools/ci/amd64/clang/msan.sh |     - ./tools/ci/amd64/clang/msan.sh | ||||||
|  |  | ||||||
|  | @ -1,16 +1,42 @@ | ||||||
| cmake_minimum_required(VERSION 3.14) | cmake_minimum_required(VERSION 3.14) | ||||||
| project(Light) | project(Light) | ||||||
| set(CMAKE_CXX_STANDARD 23) | set(CMAKE_CXX_STANDARD 23) | ||||||
|  | set(CMAKE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/tools/cmake) | ||||||
| 
 | 
 | ||||||
| include(${CMAKE_CURRENT_SOURCE_DIR}/tools/cmake/functions.cmake) | include(CheckCXXSourceCompiles) | ||||||
| include(${CMAKE_CURRENT_SOURCE_DIR}/tools/cmake/definitions.cmake) | include(${CMAKE_DIR}/functions.cmake) | ||||||
| include(${CMAKE_CURRENT_SOURCE_DIR}/tools/cmake/dependencies.cmake) | include(${CMAKE_DIR}/definitions.cmake) | ||||||
|  | include(${CMAKE_DIR}/dependencies.cmake) | ||||||
| 
 | 
 | ||||||
| add_option(ENABLE_STATIC_ANALYSIS "Performs static analysis via clang-tidy and fails build on failing checks") | add_option(ENABLE_TESTS "Enables the building of the test modules") | ||||||
|  | 
 | ||||||
|  | add_option(ENABLE_STATIC_ANALYSIS "Makes clang-tidy checks mandatory for compilation") | ||||||
| if (ENABLE_STATIC_ANALYSIS) | if (ENABLE_STATIC_ANALYSIS) | ||||||
|     set(CMAKE_CXX_CLANG_TIDY "clang-tidy;--warnings-as-errors=*;--allow-no-checks") |     set(CMAKE_CXX_CLANG_TIDY "clang-tidy;--warnings-as-errors=*;--allow-no-checks") | ||||||
| endif () | endif () | ||||||
| 
 | 
 | ||||||
| add_option(ENABLE_TESTS "Enables the building of the test modules") | add_option(ENABLE_LLVM_COVERAGE "Enables the code coverage instrumentation for clang") | ||||||
|  | if(ENABLE_LLVM_COVERAGE) | ||||||
|  |     if (NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") | ||||||
|  |         message(FATAL_ERROR "ENABLE_LLVM_COVERAGE only supports the clang compiler") | ||||||
|  |     endif () | ||||||
|  | 
 | ||||||
|  |     # Check for libc++ | ||||||
|  |     check_cxx_source_compiles(" | ||||||
|  |         #include <string> | ||||||
|  |         #ifdef _LIBCPP_VERSION | ||||||
|  |         int main() { return 0; } | ||||||
|  |         #else | ||||||
|  |         #error Not using libc++ | ||||||
|  |         #endif | ||||||
|  |     " USING_LIBCXX) | ||||||
|  |     if(NOT USING_LIBCXX) | ||||||
|  |         message(FATAL_ERROR "ENABLE_LLVM_COVERAGE requires libc++, please compile with -stdlib=libc++") | ||||||
|  |     endif() | ||||||
|  | 
 | ||||||
|  |     add_compile_options(-fprofile-instr-generate -fcoverage-mapping) | ||||||
|  |     add_link_options(-fprofile-instr-generate -fcoverage-mapping) | ||||||
|  | endif () | ||||||
|  | 
 | ||||||
| add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/modules) | add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/modules) | ||||||
| add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/external/glad) | add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/external/glad) | ||||||
|  |  | ||||||
|  | @ -12,6 +12,7 @@ class LightRecipe(ConanFile): | ||||||
| 
 | 
 | ||||||
|     options = { |     options = { | ||||||
|         "enable_tests": [True, False], |         "enable_tests": [True, False], | ||||||
|  |         "enable_llvm_coverage": [True, False], | ||||||
|         "enable_static_analysis": [True, False], |         "enable_static_analysis": [True, False], | ||||||
|         "use_mold": [True, False], |         "use_mold": [True, False], | ||||||
|         "export_compile_commands": [True, False], |         "export_compile_commands": [True, False], | ||||||
|  | @ -19,6 +20,7 @@ class LightRecipe(ConanFile): | ||||||
| 
 | 
 | ||||||
|     default_options = { |     default_options = { | ||||||
|         "enable_tests": True, |         "enable_tests": True, | ||||||
|  |         "enable_llvm_coverage": False, | ||||||
|         "enable_static_analysis": False, |         "enable_static_analysis": False, | ||||||
|         "use_mold": False, |         "use_mold": False, | ||||||
|         "export_compile_commands": True, |         "export_compile_commands": True, | ||||||
|  | @ -44,8 +46,9 @@ class LightRecipe(ConanFile): | ||||||
|             tc.cache_variables["CMAKE_LINKER_TYPE"] = "MOLD" |             tc.cache_variables["CMAKE_LINKER_TYPE"] = "MOLD" | ||||||
| 
 | 
 | ||||||
|         tc.cache_variables["CMAKE_EXPORT_COMPILE_COMMANDS"] = self.options.export_compile_commands |         tc.cache_variables["CMAKE_EXPORT_COMPILE_COMMANDS"] = self.options.export_compile_commands | ||||||
|         tc.cache_variables["ENABLE_STATIC_ANALYSIS"] = self.options.enable_static_analysis |  | ||||||
|         tc.cache_variables["ENABLE_TESTS"] = self.options.enable_tests |         tc.cache_variables["ENABLE_TESTS"] = self.options.enable_tests | ||||||
|  |         tc.cache_variables["ENABLE_LLVM_COVERAGE"] = self.options.enable_llvm_coverage | ||||||
|  |         tc.cache_variables["ENABLE_STATIC_ANALYSIS"] = self.options.enable_static_analysis | ||||||
| 
 | 
 | ||||||
|         repo = git.Repo(search_parent_directories=True) |         repo = git.Repo(search_parent_directories=True) | ||||||
|         tc.cache_variables["GIT_HASH"] = repo.head.object.hexsha |         tc.cache_variables["GIT_HASH"] = repo.head.object.hexsha | ||||||
|  |  | ||||||
							
								
								
									
										48
									
								
								tools/ci/amd64/clang/coverage.dockerfile
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								tools/ci/amd64/clang/coverage.dockerfile
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,48 @@ | ||||||
|  | FROM archlinux:latest | ||||||
|  | 
 | ||||||
|  | RUN pacman -Syu --noconfirm && \ | ||||||
|  |     pacman -S --noconfirm \ | ||||||
|  |     bash \ | ||||||
|  |     base-devel \ | ||||||
|  |     git \ | ||||||
|  |     cmake \ | ||||||
|  |     ninja \ | ||||||
|  |     python \ | ||||||
|  |     python-pip \ | ||||||
|  |     clang \ | ||||||
|  |     llvm \ | ||||||
|  |     mesa \ | ||||||
|  |     mold \ | ||||||
|  |     ninja \ | ||||||
|  |     curl \ | ||||||
|  |     wget \ | ||||||
|  |     zlib | ||||||
|  | 
 | ||||||
|  | RUN pip install --no-cache-dir --break-system-packages conan gitpython \ | ||||||
|  |     && conan profile detect | ||||||
|  | 
 | ||||||
|  | RUN clang --version  \ | ||||||
|  |     && pip --version \ | ||||||
|  |     && conan --version \ | ||||||
|  |     && cmake --version \ | ||||||
|  |     && g++ --version \ | ||||||
|  |     && clang --version \ | ||||||
|  |     && ninja --version \ | ||||||
|  |     && mold --version \ | ||||||
|  |     && llvm-profdata --version \ | ||||||
|  |     && llvm-cov --version | ||||||
|  | 
 | ||||||
|  | RUN git clone 'https://git.light7734.com/light7734/light.git' \ | ||||||
|  |     && cd light; git checkout 'ci/code_cov' \ | ||||||
|  |     && conan build . \ | ||||||
|  |         -c tools.system.package_manager:mode=install \ | ||||||
|  |         -c tools.cmake.cmaketoolchain:generator=Ninja \ | ||||||
|  |         -c tools.build:compiler_executables='{"c": "clang", "cpp": "clang++"}' \ | ||||||
|  |         -s build_type=Release \ | ||||||
|  |         -s compiler=clang \ | ||||||
|  |         -s compiler.version=20 \ | ||||||
|  |         -s compiler.libcxx=libc++ \ | ||||||
|  |         -o use_mold=True \ | ||||||
|  |         -o enable_lcov=True \ | ||||||
|  |         --build=missing \ | ||||||
|  |     && rm -r ../light/ | ||||||
|  | @ -7,16 +7,13 @@ rm -rf ./build | ||||||
| conan build . \ | conan build . \ | ||||||
|     -c tools.system.package_manager:mode=install \ |     -c tools.system.package_manager:mode=install \ | ||||||
|     -c tools.cmake.cmaketoolchain:generator=Ninja \ |     -c tools.cmake.cmaketoolchain:generator=Ninja \ | ||||||
|     -c tools.build:cxxflags='["-fprofile-instr-generate", "-fcoverage-mapping"]' \ |  | ||||||
|     -c tools.build:sharedlinkflags='["-fprofile-instr-generate", "-fcoverage-mapping"]' \ |  | ||||||
|     -c tools.build:exelinkflags='["-fprofile-instr-generate", "-fcoverage-mapping"]' \ |  | ||||||
|     -c tools.info.package_id:confs='["tools.build:cxxflags","tools.build:sharedlinkflags","tools.build:exelinkflags"]' \ |  | ||||||
|     -c tools.build:compiler_executables='{"c": "clang", "cpp": "clang++"}' \ |     -c tools.build:compiler_executables='{"c": "clang", "cpp": "clang++"}' \ | ||||||
|     -s build_type=Release \ |     -s build_type=Release \ | ||||||
|     -s compiler=clang \ |     -s compiler=clang \ | ||||||
|     -s compiler.version=20 \ |     -s compiler.version=20 \ | ||||||
|     -s compiler.libcxx=libc++ \ |     -s compiler.libcxx=libc++ \ | ||||||
|     -o use_mold=True \ |     -o use_mold=True \ | ||||||
|  |     -o enable_llvm_coverage=True \ | ||||||
|     --build=missing |     --build=missing | ||||||
| 
 | 
 | ||||||
| for test in $(find ./build -type f -name '*_tests' -executable); do | for test in $(find ./build -type f -name '*_tests' -executable); do | ||||||
|  | @ -24,3 +21,15 @@ for test in $(find ./build -type f -name '*_tests' -executable); do | ||||||
|   "$test" |   "$test" | ||||||
| done | done | ||||||
| 
 | 
 | ||||||
|  | mkdir -p ./build/coverage/  | ||||||
|  | for test in $(find ./build -type f -name '*_tests' -executable); do | ||||||
|  |     export LLVM_PROFILE_FILE="./build/coverage/$(basename "$(dirname "{}")").profraw"; | ||||||
|  |     echo ${LLVM_PROFILE_FILE} >> ./build/coverage/list; | ||||||
|  |     "$test" | ||||||
|  | done | ||||||
|  | 
 | ||||||
|  | llvm-profdata merge --input-files './build/coverage/list' -o "./build/coverage/merged.profdata"  | ||||||
|  | find ./modules -type f -name "*.profraw" -exec rm -fv {} + | ||||||
|  | LLVM_COV_SHOW=$(llvm-cov show -instr-profile='./build/coverage/merged.profdata' $(find ./build -type f -name '*_tests' -executable -exec printf -- '-object %s ' {} \;) -ignore-filename-regex='./modules/[^/]+/*_tests') | ||||||
|  | echo "${LLVM_COV_SHOW}" > './build/coverage/coverage.txt' | ||||||
|  | wget -qO- "https://codecov.io/bash" | bash | ||||||
|  |  | ||||||
|  | @ -15,6 +15,9 @@ docker build -t amd64_gcc_unit_tests -f $CI_DIR/amd64/gcc/unit_tests.dockerfile | ||||||
| echo "==> Building image: amd64_gcc_valgrind" | echo "==> Building image: amd64_gcc_valgrind" | ||||||
| docker build -t amd64_gcc_valgrind -f $CI_DIR/amd64/gcc/valgrind.dockerfile . | docker build -t amd64_gcc_valgrind -f $CI_DIR/amd64/gcc/valgrind.dockerfile . | ||||||
| 
 | 
 | ||||||
|  | echo "==> Building image: amd64_clang_coverage" | ||||||
|  | docker build -t amd64_clang_coverage -f $CI_DIR/amd64/clang/coverage.dockerfile . | ||||||
|  | 
 | ||||||
| echo "==> Building image: amd64_clang_lsan" | echo "==> Building image: amd64_clang_lsan" | ||||||
| docker build -t amd64_clang_lsan -f $CI_DIR/amd64/clang/lsan.dockerfile . | docker build -t amd64_clang_lsan -f $CI_DIR/amd64/clang/lsan.dockerfile . | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue