summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBent Bisballe Nyeng <deva@aasimon.org>2022-12-15 11:05:31 +0100
committerBent Bisballe Nyeng <deva@aasimon.org>2023-01-09 17:22:54 +0100
commit55ab1f564286c6f3e986bf68ebb271132a749c6f (patch)
treebf6b35923b3a2e85cb061c78ea929ff58933c720
parentde26eed5157a1b5efc2a72668b4f4a22638f2774 (diff)
Add clang support.
-rw-r--r--Jenkinsfile41
-rwxr-xr-xbootstrap.sh7
-rw-r--r--src/bootstrap.cc7
-rw-r--r--src/configure.cc23
-rw-r--r--src/rebuild.h2
-rw-r--r--src/task.h1
-rw-r--r--src/tasks.h4
-rw-r--r--src/unittest.h2
-rw-r--r--test/ctor.cc8
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;
diff --git a/src/task.h b/src/task.h
index e192555..4efbfff 100644
--- a/src/task.h
+++ b/src/task.h
@@ -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" },