mirror of
				https://github.com/TheLartians/ModernCppStarter.git
				synced 2025-10-31 02:01:33 +01:00 
			
		
		
		
	Add optional standalone executable directory (#2)
* add standalone executable * update readme * add standalone workflow * fix path
This commit is contained in:
		
							parent
							
								
									ad1f006762
								
							
						
					
					
						commit
						1dc64084eb
					
				
					 5 changed files with 122 additions and 10 deletions
				
			
		
							
								
								
									
										20
									
								
								.github/workflows/standalone.yml
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								.github/workflows/standalone.yml
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,20 @@ | |||
| name: Standalone | ||||
| 
 | ||||
| on: [push] | ||||
| 
 | ||||
| jobs: | ||||
|   build: | ||||
| 
 | ||||
|     runs-on: ubuntu-latest | ||||
|      | ||||
|     steps: | ||||
|     - uses: actions/checkout@v1 | ||||
|      | ||||
|     - name: configure | ||||
|       run: cmake -Hstandalone -Bbuild | ||||
| 
 | ||||
|     - name: build | ||||
|       run: cmake --build build | ||||
| 
 | ||||
|     - name: run | ||||
|       run: ./build/Greeter | ||||
|  | @ -37,7 +37,6 @@ CPMAddPackage( | |||
| 
 | ||||
| # Note: | ||||
| # for single header libraries use `add_library(Greeter INTERFACE)` instead  | ||||
| # To create an executable use `add_executable(Greeter ${headers} ${sources})` | ||||
| add_library(Greeter ${headers} ${sources}) | ||||
| 
 | ||||
| # Note: for single header libraries use the following instead: | ||||
|  |  | |||
							
								
								
									
										34
									
								
								README.md
									
										
									
									
									
								
							
							
						
						
									
										34
									
								
								README.md
									
										
									
									
									
								
							|  | @ -15,7 +15,8 @@ This template is a collection from learnings of previous projects and should all | |||
| ## Features | ||||
| 
 | ||||
| - Modern CMake practices | ||||
| - Suited for single header libraries and larger projects | ||||
| - Suited for single header libraries and projects of any scale | ||||
| - Separation into library and executable code | ||||
| - Integrated test suite | ||||
| - Continuous integration via [GitHub Actions](https://help.github.com/en/actions/) | ||||
| - Code coverage via [codecov](https://codecov.io) | ||||
|  | @ -27,22 +28,35 @@ This template is a collection from learnings of previous projects and should all | |||
| 
 | ||||
| ### Adjust the template to your needs | ||||
| 
 | ||||
| - Use this repo [as a template](https://help.github.com/en/github/creating-cloning-and-archiving-repositories/creating-a-repository-from-a-template) and replace all occurrences of "Greeter" in [both](test/CMakeLists.txt) [CMakeLists.txt](CMakeLists.txt) with the name of your project | ||||
| - Use this repo [as a template](https://help.github.com/en/github/creating-cloning-and-archiving-repositories/creating-a-repository-from-a-template) and replace all occurrences of "Greeter" in the relevant CMakeLists.txt with the name of your project | ||||
| - Replace the source files with your own | ||||
| - For single-header libraries: see the comments in [CMakeLists.txt](CMakeLists.txt) | ||||
| - Add your project's codecov token to your project's github secrets under `CODECOV_TOKEN` | ||||
| - Happy coding! | ||||
| 
 | ||||
| Remember to eventually remove any unused files, such as the standalone directory or irrelevant tests for your project. | ||||
| 
 | ||||
| ### Build and run the standalone target | ||||
| 
 | ||||
| Use the following command to build and run the executable target. | ||||
| 
 | ||||
| ```bash | ||||
| cmake -Hstandalone -Bbuild/standalone | ||||
| cmake --build build/standalone | ||||
| ./build/standalone/Greeter --help | ||||
| ``` | ||||
| 
 | ||||
| ### Build and run test suite | ||||
| 
 | ||||
| Use the following commands from the project's root directory to run the test suite. | ||||
| 
 | ||||
| ```bash | ||||
| cmake -Htest -Bbuild | ||||
| cmake --build build | ||||
| CTEST_OUTPUT_ON_FAILURE=1 cmake --build build --target test | ||||
| cmake -Htest -Bbuild/test | ||||
| cmake --build build/test | ||||
| CTEST_OUTPUT_ON_FAILURE=1 cmake --build build/test --target test | ||||
| 
 | ||||
| # or simply call the executable:  | ||||
| ./build/GreeterTests | ||||
| ./build/test/GreeterTests | ||||
| ``` | ||||
| 
 | ||||
| To collect code coverage information, run CMake with the `-DENABLE_TEST_COVERAGE=1` option. | ||||
|  | @ -52,11 +66,13 @@ To collect code coverage information, run CMake with the `-DENABLE_TEST_COVERAGE | |||
| Use the following commands from the project's root directory to run clang-format (must be installed on the host system). | ||||
| 
 | ||||
| ```bash | ||||
| cmake -Htest -Bbuild | ||||
| cmake -Htest -Bbuild/test | ||||
| 
 | ||||
| # view changes | ||||
| cmake --build build --target format | ||||
| cmake --build build/test --target format | ||||
| 
 | ||||
| # apply changes | ||||
| cmake --build build --target fix-format | ||||
| cmake --build build/test --target fix-format | ||||
| ``` | ||||
| 
 | ||||
| See [Format.cmake](https://github.com/TheLartians/Format.cmake) for more options. | ||||
|  |  | |||
							
								
								
									
										31
									
								
								standalone/CMakeLists.txt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								standalone/CMakeLists.txt
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,31 @@ | |||
| cmake_minimum_required(VERSION 3.5 FATAL_ERROR) | ||||
| 
 | ||||
| project(GreeterStandalone | ||||
|   LANGUAGES CXX | ||||
| ) | ||||
| 
 | ||||
| # ---- Dependencies ---- | ||||
| 
 | ||||
| include(../cmake/CPM.cmake) | ||||
| 
 | ||||
| CPMAddPackage( | ||||
|   NAME cxxopts | ||||
|   GITHUB_REPOSITORY jarro2783/cxxopts | ||||
|   VERSION 2.2.0 | ||||
|   OPTIONS | ||||
|     "CXXOPTS_BUILD_EXAMPLES Off" | ||||
|     "CXXOPTS_BUILD_TESTS Off" | ||||
| ) | ||||
| 
 | ||||
| CPMAddPackage( | ||||
|   NAME Greeter | ||||
|   SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/.. | ||||
| ) | ||||
| 
 | ||||
| # ---- Create standalone executable ---- | ||||
| 
 | ||||
| file(GLOB sources ${CMAKE_CURRENT_SOURCE_DIR}/source/*.cpp) | ||||
| add_executable(GreeterStandalone ${sources}) | ||||
| set_target_properties(GreeterStandalone PROPERTIES CXX_STANDARD 17 COMPILE_FLAGS "-Wall -pedantic -Wextra") | ||||
| set_target_properties(GreeterStandalone PROPERTIES OUTPUT_NAME "Greeter") | ||||
| target_link_libraries(GreeterStandalone Greeter cxxopts) | ||||
							
								
								
									
										46
									
								
								standalone/source/main.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								standalone/source/main.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,46 @@ | |||
| #include <greeter.h> | ||||
| 
 | ||||
| #include <cxxopts.hpp> | ||||
| #include <iostream> | ||||
| #include <string> | ||||
| #include <unordered_map> | ||||
| 
 | ||||
| const std::unordered_map<std::string, greeter::LanguageCode> languages{ | ||||
|     {"en", greeter::LanguageCode::EN}, | ||||
|     {"de", greeter::LanguageCode::DE}, | ||||
|     {"es", greeter::LanguageCode::ES}, | ||||
|     {"fr", greeter::LanguageCode::FR}, | ||||
| }; | ||||
| 
 | ||||
| int main(int argc, char** argv) { | ||||
|   cxxopts::Options options(argv[0], "A program to welcome the world!"); | ||||
| 
 | ||||
|   std::string language; | ||||
|   std::string name; | ||||
| 
 | ||||
|   // clang-format off
 | ||||
|   options.add_options() | ||||
|     ("h,help", "Show help") | ||||
|     ("n,name", "Name to greet", cxxopts::value(name)->default_value("World")) | ||||
|     ("l,lang", "Language code to use", cxxopts::value(language)->default_value("en")) | ||||
|   ; | ||||
|   // clang-format on
 | ||||
| 
 | ||||
|   auto result = options.parse(argc, argv); | ||||
| 
 | ||||
|   if (result["help"].as<bool>()) { | ||||
|     std::cout << options.help() << std::endl; | ||||
|     return 0; | ||||
|   } | ||||
| 
 | ||||
|   auto langIt = languages.find(language); | ||||
|   if (langIt == languages.end()) { | ||||
|     std::cout << "unknown language code: " << language << std::endl; | ||||
|     return 1; | ||||
|   } | ||||
| 
 | ||||
|   greeter::Greeter greeter(name); | ||||
|   std::cout << greeter.greet(langIt->second) << std::endl; | ||||
| 
 | ||||
|   return 0; | ||||
| } | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue