diff options
| -rw-r--r-- | Jenkinsfile | 41 | ||||
| -rwxr-xr-x | bootstrap.sh | 7 | ||||
| -rw-r--r-- | src/bootstrap.cc | 7 | ||||
| -rw-r--r-- | src/configure.cc | 23 | ||||
| -rw-r--r-- | src/rebuild.h | 2 | ||||
| -rw-r--r-- | src/task.h | 1 | ||||
| -rw-r--r-- | src/tasks.h | 4 | ||||
| -rw-r--r-- | src/unittest.h | 2 | ||||
| -rw-r--r-- | test/ctor.cc | 8 | 
9 files changed, 77 insertions, 18 deletions
| diff --git a/Jenkinsfile b/Jenkinsfile index b483ac3..9a99f2d 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -2,18 +2,45 @@ pipeline {  	agent { label 'c++20' }  	stages { -		stage('Build') { +		stage('Clean') {  			steps { -				echo 'Building...' -				sh 'rm -Rf build' +				echo 'Cleaning workspace ...' +				sh 'rm -Rf build build-gcc build-clang' +			} +		} +		stage('Build-gcc') { +			steps { +				echo 'Building (gcc) ...'  				sh './bootstrap.sh'  			}  		} -		stage('Test') { +		stage('Test-gcc') { +			steps { +				echo 'Testing (gcc) ...' +				sh './ctor check' +			} +			post { +				always { +					sh 'mv build build-gcc' +				} +			} +		} +		stage('Build-clang') { +			steps { +				echo 'Building (clang) ...' +				sh 'CXX=clang++ ./bootstrap.sh' +			} +		} +		stage('Test-clang') {  			steps { -				echo 'Testing...' +				echo 'Testing (clang) ...'  				sh './ctor check'  			} +			post { +				always { +					sh 'mv build build-clang' +				} +			}  		}  	} @@ -21,7 +48,7 @@ pipeline {  		always {  			xunit(thresholds: [ skipped(failureThreshold: '0'),  			                    failed(failureThreshold: '0') ], -			      tools: [ CppUnit(pattern: 'build/test/*.xml') ]) +			      tools: [ CppUnit(pattern: 'build-*/test/*.xml') ])  		}  	} -}
\ No newline at end of file +} diff --git a/bootstrap.sh b/bootstrap.sh index a5c11ac..5873e83 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -1,7 +1,10 @@  #!/bin/sh +: ${CXX:=g++} +CXX=$(which $CXX) +  echo "Bootstrapping..." -g++ -std=c++20 -Wall -O3 -Isrc -pthread src/bootstrap.cc ctor.cc test/ctor.cc -o ctor && \ +$CXX -std=c++20 -Wall -O3 -Isrc -pthread src/bootstrap.cc ctor.cc test/ctor.cc -o ctor && \  ./ctor && \ -g++ -std=c++20 -Wall -O3 -Isrc -pthread ctor.cc test/ctor.cc -Lbuild -lctor -o ctor && \ +$CXX -std=c++20 -Wall -O3 -Isrc -pthread ctor.cc test/ctor.cc -Lbuild -lctor -o ctor && \  ./ctor configure --ctor-includedir=src --ctor-libdir=build && \  echo "Done. Now run ./ctor to (re)build." diff --git a/src/bootstrap.cc b/src/bootstrap.cc index 9079092..c58c399 100644 --- a/src/bootstrap.cc +++ b/src/bootstrap.cc @@ -3,6 +3,7 @@  // See accompanying file LICENSE for details.  #include <iostream>  #include <array> +#include <cstdlib>  #define BOOTSTRAP @@ -35,6 +36,12 @@ bool hasConfiguration(const std::string& key)  const std::string& getConfiguration(const std::string& key,                                      const std::string& defaultValue)  { +	if(key == cfg::host_cxx && std::getenv("CXX")) +	{ +		static std::string s = std::getenv("CXX"); +		return s; +	} +  	return defaultValue;  } diff --git a/src/configure.cc b/src/configure.cc index 86538ab..50a7c32 100644 --- a/src/configure.cc +++ b/src/configure.cc @@ -32,6 +32,7 @@ namespace ctor  {  std::optional<std::string> includedir;  std::optional<std::string> libdir; +std::map<std::string, std::string> conf_values;  }  bool hasConfiguration(const std::string& key) @@ -46,6 +47,11 @@ bool hasConfiguration(const std::string& key)  		return true;  	} +	if(ctor::conf_values.find(key) != ctor::conf_values.end()) +	{ +		return true; +	} +  	const auto& c = configuration();  	return c.tools.find(key) != c.tools.end();  } @@ -63,6 +69,11 @@ const std::string& getConfiguration(const std::string& key,  		return *ctor::libdir;  	} +	if(ctor::conf_values.find(key) != ctor::conf_values.end()) +	{ +		return ctor::conf_values[key]; +	} +  	const auto& c = configuration();  	if(hasConfiguration(key))  	{ @@ -376,6 +387,18 @@ int regenerateCache(const Settings& default_settings,  	std::string build_ar = locate(build_arch, ar_prog);  	std::string build_ld = locate(build_arch, ld_prog); +	// Store current values for execution in this execution context. +	if(!ctor_includedir.empty()) +	{ +		ctor::conf_values[cfg::ctor_includedir] = ctor_includedir; +	} +	if(!ctor_libdir.empty()) +	{ +		ctor::conf_values[cfg::ctor_libdir] = ctor_libdir; +	} +	ctor::conf_values[cfg::host_cxx] = host_cxx; +	ctor::conf_values[cfg::build_cxx] = build_cxx; +  	std::cout << "Writing results to: " << configurationFile.string() << "\n";  	{  		std::ofstream istr(configurationFile); diff --git a/src/rebuild.h b/src/rebuild.h index afa2307..284aeb2 100644 --- a/src/rebuild.h +++ b/src/rebuild.h @@ -8,8 +8,6 @@  #include "ctor.h" -class Settings; -  struct BuildConfigurationEntry  {  	const char* file; @@ -28,6 +28,7 @@ class Task  public:  	Task(const BuildConfiguration& config, const Settings& settings,  	     const std::string& sourceDir); +	virtual ~Task() = default;  	int registerDepTasks(const std::set<std::shared_ptr<Task>>& tasks);  	virtual int registerDepTasksInner(const std::set<std::shared_ptr<Task>>& tasks) { return 0; } diff --git a/src/tasks.h b/src/tasks.h index c547432..403a954 100644 --- a/src/tasks.h +++ b/src/tasks.h @@ -10,8 +10,8 @@  #include "task.h" -class BuildConfiguration; -class Settings; +struct BuildConfiguration; +struct Settings;  struct Target  { diff --git a/src/unittest.h b/src/unittest.h index 8dee33c..5118689 100644 --- a/src/unittest.h +++ b/src/unittest.h @@ -7,7 +7,7 @@  #include <memory>  class Task; -class Settings; +struct Settings;  int runUnitTests(std::set<std::shared_ptr<Task>>& tasks,                   const Settings& settings); diff --git a/test/ctor.cc b/test/ctor.cc index e6d9734..89a94b9 100644 --- a/test/ctor.cc +++ b/test/ctor.cc @@ -19,7 +19,7 @@ BuildConfigurations ctorTestConfigs(const Settings& settings)  			},  			.flags = {  				.cxxflags = { -					"-std=c++20", "-O3", "-s", "-Wall", "-Werror", +					"-std=c++20", "-O3", "-Wall", "-Werror",  					"-I../src", "-Iuunit",  					"-DOUTPUT=\"execute\"",  				}, @@ -36,7 +36,7 @@ BuildConfigurations ctorTestConfigs(const Settings& settings)  			.depends = { "libctor_nomain.a" },  			.flags = {  				.cxxflags = { -					"-std=c++20", "-O3", "-s", "-Wall", "-Werror", +					"-std=c++20", "-O3", "-Wall", "-Werror",  					"-I../src", "-Iuunit",  					"-DOUTPUT=\"tasks\"",  				}, @@ -53,7 +53,7 @@ BuildConfigurations ctorTestConfigs(const Settings& settings)  			.depends = { "libctor_nomain.a" },  			.flags = {  				.cxxflags = { -					"-std=c++20", "-O3", "-s", "-Wall", "-Werror", +					"-std=c++20", "-O3", "-Wall", "-Werror",  					"-I../src", "-Iuunit",  					"-DOUTPUT=\"source_type\"",  				}, @@ -98,7 +98,7 @@ BuildConfigurations ctorTestConfigs(const Settings& settings)  			},  			.flags = {  				.cxxflags = { -					"-std=c++20", "-O3", "-s", "-Wall", "-Werror", +					"-std=c++20", "-O3", "-Wall", "-Werror",  					"-I../src",  				},  				.ldflags = { "-pthread" }, | 
