Skip to content

Commit b38d9d5

Browse files
authored
Upgrade Natron's minimum C++ version to c++17. (#984)
* Upgrade Natron's minimum C++ version to c++17. * Removed old C++11 logic from build files. Signed-off-by: Aaron Colwell <[email protected]>
1 parent 73e7dd8 commit b38d9d5

9 files changed

+39
-140
lines changed

CMakeLists.txt

+2-2
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,13 @@
2020
cmake_minimum_required(VERSION 3.16.7)
2121

2222
project(Natron
23-
VERSION "2.5.0"
23+
VERSION "2.6.0"
2424
DESCRIPTION "Open Source Compositing Software"
2525
HOMEPAGE_URL "https://natrongithub.github.io/"
2626
LANGUAGES CXX C
2727
)
2828

29-
set(CMAKE_CXX_STANDARD 14)
29+
set(CMAKE_CXX_STANDARD 17)
3030

3131
option(NATRON_SYSTEM_LIBS "use system versions of dependencies instead of bundled ones" OFF)
3232
option(NATRON_BUILD_TESTS "build the Natron test suite" ON)

Engine/CMakeLists.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ set(PYENGINE_HEADER PySide2_Engine_Python.h)
3232
set(POST_SHIBOKEN ../tools/utils/runPostShiboken2.sh)
3333

3434
set(shiboken_args
35-
"--enable-parent-ctor-heuristic" "--use-isnull-as-nb_nonzero"
35+
"-std=c++17" "--enable-parent-ctor-heuristic" "--use-isnull-as-nb_nonzero"
3636
"--avoid-protected-hack" "--enable-pyside-extensions"
3737
"-I." "-I.." "-I../Global" "-I../libs/OpenFX/include" ${PYENGINE_INCS}
3838
"-T${PYSIDE_TYPESYSTEMS}" "--output-directory=${PYENGINE_OUT}"

Global/Macros.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@
3838
#endif
3939

4040
#ifdef __cplusplus
41-
#if __cplusplus < 201402L
42-
#error "Natron 2.5+ requires C++14"
41+
#if __cplusplus < 201703L
42+
#error "Natron 2.6+ requires C++17"
4343
#endif
4444
// Establish the name space.
4545
namespace Natron { }

Gui/CMakeLists.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ set(PYGUI_HEADER PySide2_Gui_Python.h)
3232
set(POST_SHIBOKEN ../tools/utils/runPostShiboken2.sh)
3333

3434
set(shiboken_args
35-
"--enable-parent-ctor-heuristic" "--use-isnull-as-nb_nonzero"
35+
"-std=c++17" "--enable-parent-ctor-heuristic" "--use-isnull-as-nb_nonzero"
3636
"--avoid-protected-hack" "--enable-pyside-extensions"
3737
${PYGUI_INCS}
3838
"-T../Engine" "-T${PYSIDE_TYPESYSTEMS}" "--output-directory=${PYGUI_OUT}"

global.pri

+8-63
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
# along with Natron. If not, see <http://www.gnu.org/licenses/gpl-2.0.html>
1818
# ***** END LICENSE BLOCK *****
1919

20-
CONFIG += c++11 c++14
20+
CONFIG += c++17
2121

2222
# libs may modify the config (eg openmp), so it must be included before
2323
include(libs.pri)
@@ -201,9 +201,6 @@ unix:LIBS += $$QMAKE_LIBS_DYNLOAD
201201
# see https://github.com/MrKepzie/Natron/issues/1659
202202
# -fpermissive turns it into a warning
203203
QMAKE_CXXFLAGS += -fpermissive
204-
# GCC 6 and later are C++14 by default, but Qt 4 is C++98
205-
# Note: disabled, because qmake should put the right flags anyway
206-
#lessThan(QT_MAJOR_VERSION, 5): QMAKE_CXXFLAGS += -std=gnu++98
207204

208205
# clear some Eigen3 warnings
209206
QMAKE_CFLAGS += -Wno-int-in-bool-context
@@ -215,22 +212,6 @@ unix:LIBS += $$QMAKE_LIBS_DYNLOAD
215212
QMAKE_CXXFLAGS += -Wno-expansion-to-defined
216213
}
217214
}
218-
c++11 {
219-
# check for at least version 4.7
220-
contains(GCCVer,[0-3]\\.[0-9]+.*) {
221-
error("At least GCC 4.6 is required.")
222-
} else {
223-
contains(GCCVer,4\\.[0-5].*) {
224-
error("At least GCC 4.6 is required.")
225-
} else {
226-
contains(GCCVer,4\\.6.*) {
227-
lessThan(QT_GCC_MAJOR_VERSION, 5): QMAKE_CXXFLAGS += -std=c++0x
228-
} else {
229-
lessThan(QT_GCC_MAJOR_VERSION, 5): QMAKE_CXXFLAGS += -std=c++11
230-
}
231-
}
232-
}
233-
}
234215
}
235216

236217
# from https://github.com/qt/qtbase/blob/dev/mkspecs/features/qt_common.prf
@@ -308,28 +289,14 @@ macx-clang-libc++ {
308289
# in Qt 4.8.7, objective-C misses the stdlib and macos version flags
309290
QMAKE_OBJECTIVE_CFLAGS += -mmacosx-version-min=$$QMAKE_MACOSX_DEPLOYMENT_TARGET
310291
QMAKE_OBJECTIVE_CXXFLAGS += -stdlib=libc++ -mmacosx-version-min=$$QMAKE_MACOSX_DEPLOYMENT_TARGET
311-
c++11 {
312-
c++14 {
313-
QMAKE_OBJECTIVE_CXXFLAGS += -std=c++14
314-
}
315-
!c++14 {
316-
QMAKE_OBJECTIVE_CXXFLAGS += -std=c++11
317-
}
318-
}
292+
QMAKE_OBJECTIVE_CXXFLAGS += -std=c++17
319293
}
320294

321295
macx-clang {
322296
# in Qt 4.8.7, objective-C misses the stdlib and macos version flags
323297
QMAKE_OBJECTIVE_CFLAGS += -mmacosx-version-min=$$QMAKE_MACOSX_DEPLOYMENT_TARGET
324298
QMAKE_OBJECTIVE_CXXFLAGS += -mmacosx-version-min=$$QMAKE_MACOSX_DEPLOYMENT_TARGET
325-
c++11 {
326-
c++14 {
327-
QMAKE_OBJECTIVE_CXXFLAGS += -std=c++14
328-
}
329-
!c++14 {
330-
QMAKE_OBJECTIVE_CXXFLAGS += -std=c++11
331-
}
332-
}
299+
QMAKE_OBJECTIVE_CXXFLAGS += -std=c++17
333300
}
334301

335302
CONFIG(debug) {
@@ -344,11 +311,6 @@ CONFIG(debug) {
344311
}
345312
}
346313

347-
!macx {
348-
# c++11 build fails on Snow Leopard 10.6 (see the macx section below)
349-
#CONFIG += c++11
350-
}
351-
352314
win32 {
353315
#ofx needs WINDOWS def
354316
#microsoft compiler needs _MBCS to compile with the multi-byte character set.
@@ -527,33 +489,16 @@ unix {
527489
symbols_hidden_by_default.name = GCC_SYMBOLS_PRIVATE_EXTERN
528490
symbols_hidden_by_default.value = YES
529491
QMAKE_MAC_XCODE_SETTINGS += symbols_hidden_by_default
530-
c++11 {
531-
c++14 {
532-
QMAKE_CXXFLAGS += -std=c++14
533-
enable_cxx14.name = CLANG_CXX_LANGUAGE_STANDARD
534-
enable_cxx14.value = c++14
535-
QMAKE_MAC_XCODE_SETTINGS += enable_cxx14
536-
}
537-
!c++14 {
538-
QMAKE_CXXFLAGS += -std=c++11
539-
enable_cxx11.name = CLANG_CXX_LANGUAGE_STANDARD
540-
enable_cxx11.value = c++0x
541-
QMAKE_MAC_XCODE_SETTINGS += enable_cxx11
542-
}
543-
}
492+
QMAKE_CXXFLAGS += -std=c++17
493+
enable_cxx17.name = CLANG_CXX_LANGUAGE_STANDARD
494+
enable_cxx17.value = c++17
495+
QMAKE_MAC_XCODE_SETTINGS += enable_cxx17
544496
}
545497

546498
*clang* {
547499
QMAKE_CXXFLAGS += -ftemplate-depth-1024
548500
QMAKE_CXXFLAGS_WARN_ON += -Wno-c++11-extensions
549-
c++11 {
550-
c++14 {
551-
QMAKE_CXXFLAGS += -std=c++14
552-
}
553-
!c++14 {
554-
QMAKE_CXXFLAGS += -std=c++11
555-
}
556-
}
501+
QMAKE_CXXFLAGS += -std=c++17
557502
}
558503

559504
# see http://clang.llvm.org/docs/AddressSanitizer.html and http://blog.qt.digia.com/blog/2013/04/17/using-gccs-4-8-0-address-sanitizer-with-qt/

libs.pri

+5-19
Original file line numberDiff line numberDiff line change
@@ -49,16 +49,8 @@ DEFINES += OPENMVG_NO_SERIALIZATION
4949
# Use this to use OsiMskSolverInterface.cpp
5050
#DEFINES += OPENMVG_HAVE_MOSEK
5151

52-
c++11 {
53-
DEFINES += OPENMVG_STD_UNORDERED_MAP
54-
DEFINES += OPENMVG_STD_SHARED_PTR
55-
} else {
56-
# Use boost::shared_ptr and boost::unordered_map
57-
CONFIG += boost
58-
DEFINES += OPENMVG_BOOST_UNORDERED_MAP
59-
DEFINES += OPENMVG_BOOST_SHARED_PTR
60-
DEFINES += OPENMVG_NO_UNIQUE_PTR
61-
}
52+
DEFINES += OPENMVG_STD_UNORDERED_MAP
53+
DEFINES += OPENMVG_STD_SHARED_PTR
6254

6355
INCLUDEPATH += $$PWD/libs/openMVG/openMVG
6456
INCLUDEPATH += $$PWD/libs/openMVG
@@ -85,15 +77,9 @@ openmp {
8577
#If undefined, make sure to add to sources all the files in ceres/internal/ceres/generated
8678
DEFINES += CERES_RESTRICT_SCHUR_SPECIALIZATION
8779
DEFINES += WITH_LIBMV_GUARDED_ALLOC GOOGLE_GLOG_DLL_DECL= LIBMV_NO_FAST_DETECTOR=
88-
c++11 {
89-
DEFINES += CERES_STD_UNORDERED_MAP
90-
DEFINES += CERES_STD_SHARED_PTR
91-
} else {
92-
# Use boost::shared_ptr and boost::unordered_map
93-
CONFIG += boost
94-
DEFINES += CERES_BOOST_SHARED_PTR
95-
DEFINES += CERES_BOOST_UNORDERED_MAP
96-
}
80+
DEFINES += CERES_STD_UNORDERED_MAP
81+
DEFINES += CERES_STD_SHARED_PTR
82+
9783
INCLUDEPATH += $$PWD/libs/ceres/config
9884
INCLUDEPATH += $$PWD/libs/ceres/include
9985
INCLUDEPATH += $$PWD/libs/ceres/internal

tools/jenkins/build-natron.sh

+2-2
Original file line numberDiff line numberDiff line change
@@ -157,9 +157,9 @@ if [ "$QT_VERSION_MAJOR" = 5 ]; then
157157
rm Engine/Qt${QT_VERSION_MAJOR}/NatronEngine/* Gui/Qt${QT_VERSION_MAJOR}/NatronGui/* || true
158158
SHIBOKEN_INCLUDE_PATHS="-I. -I./Engine -I./Global -Ilibs/OpenFX/include -I${UNIX_SDK_HOME}/include -I${QTDIR}/include -I${UNIX_PYTHON_HOME}/include/python${PYVER} -I${UNIX_PYTHON_HOME}/include/PySide2 -I${UNIX_PYTHON_HOME}/lib/python${PYVER}/site-packages/PySide2/include"
159159
SHIBOKEN_TYPESYSTEM_PATHS="-T${UNIX_PYTHON_HOME}/share/PySide2/typesystems -T${UNIX_PYTHON_HOME}/lib/python${PYVER}/site-packages/PySide2/typesystems"
160-
shiboken2 --avoid-protected-hack --enable-pyside-extensions ${SHIBOKEN_INCLUDE_PATHS} ${SHIBOKEN_TYPESYSTEM_PATHS} --output-directory=Engine/Qt${QT_VERSION_MAJOR} Engine/Pyside2_Engine_Python.h Engine/typesystem_engine.xml
160+
shiboken2 -std=c++17 --avoid-protected-hack --enable-pyside-extensions ${SHIBOKEN_INCLUDE_PATHS} ${SHIBOKEN_TYPESYSTEM_PATHS} --output-directory=Engine/Qt${QT_VERSION_MAJOR} Engine/Pyside2_Engine_Python.h Engine/typesystem_engine.xml
161161

162-
shiboken2 --avoid-protected-hack --enable-pyside-extensions ${SHIBOKEN_INCLUDE_PATHS} -I${QTDIR}/include/QtWidgets -I${QTDIR}/include/QtCore ${SHIBOKEN_TYPESYSTEM_PATHS} -T./Engine -T./Shiboken --output-directory=Gui/Qt${QT_VERSION_MAJOR} Gui/Pyside2_Gui_Python.h Gui/typesystem_natronGui.xml
162+
shiboken2 -std=c++17 --avoid-protected-hack --enable-pyside-extensions ${SHIBOKEN_INCLUDE_PATHS} -I${QTDIR}/include/QtWidgets -I${QTDIR}/include/QtCore ${SHIBOKEN_TYPESYSTEM_PATHS} -T./Engine -T./Shiboken --output-directory=Gui/Qt${QT_VERSION_MAJOR} Gui/Pyside2_Gui_Python.h Gui/typesystem_natronGui.xml
163163

164164
tools/utils/runPostShiboken2.sh Engine/Qt${QT_VERSION_MAJOR}/NatronEngine natronengine
165165
tools/utils/runPostShiboken2.sh Gui/Qt${QT_VERSION_MAJOR}/NatronGui natrongui

tools/jenkins/build-plugins.sh

-7
Original file line numberDiff line numberDiff line change
@@ -351,17 +351,10 @@ if [ "$BUILD_ARENA" = "1" ] && [ -d "$TMP_PATH/openfx-arena" ]; then
351351
make -C Bundle lodepng.h
352352
fi
353353

354-
CXX_ARENA="$CXX17"
355-
# poppler >= 21.12 requires C++17
356-
# https://github.com/NatronGitHub/openfx-arena/issues/23
357-
if version_gt 21.12 "$(pkg-config --modversion poppler)"; then
358-
CXX_ARENA="$CXX"
359-
fi
360354
env \
361355
MINGW="${ISWIN:-}" \
362356
LICENSE="$NATRON_LICENSE" \
363357
${ARENA_FLAGS:-} \
364-
CXX="$CXX_ARENA" \
365358
CONFIG="${COMPILE_TYPE}" \
366359
OPTFLAG="${OPTFLAG}" \
367360
BITS="${BITS}" \

tools/jenkins/compiler-common.sh

+18-43
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,10 @@ set -e # Exit immediately if a command exits with a non-zero status
44
set -u # Treat unset variables as an error when substituting.
55
#set -x # Print commands and their arguments as they are executed.
66

7-
STD14="c++14"
87
STD17="c++17"
98

109
# https://stackoverflow.com/a/42232124
1110
if [ "$PKGOS" = "Windows" ]; then
12-
STD14="gnu++14"
1311
STD17="gnu++17"
1412
fi
1513

@@ -46,46 +44,33 @@ if [ "$PKGOS" = "OSX" ]; then
4644
9|10|11|12)
4745
# GXX should be an openmp-capable compiler (to compile CImg.ofx)
4846

49-
# older version, using clang-3.4
50-
CC=clang-mp-3.4
51-
CXX="clang++-mp-3.4 -std=c++14"
52-
CXX17="clang++-mp-3.4 -std=c++1z"
47+
# older version, using clang-5.0
48+
CC=clang-mp-5.0
49+
CXX="clang++-mp-5.0 -std=c++1z"
5350
GXX=g++-mp-4.9
5451
OBJECTIVE_CC=$CC
5552
OBJECTIVE_CXX=$CXX
5653
;;
5754
*)
5855
# newer OS X / macOS version link with libc++ and can use the system clang
5956
CC=clang
60-
CXX="clang++ -std=c++14"
61-
CXX17="clang++ -std=c++1z"
57+
CXX="clang++ -std=c++1z"
6258
OBJECTIVE_CC=$CC
6359
OBJECTIVE_CXX=$CXX
6460
;;
6561
esac
6662
elif [ "$COMPILER" = "clang-omp" ]; then
67-
# newer version (testing) using clang-4.0
68-
CC=clang-mp-4.0
69-
CXX="clang++-mp-4.0 -stdlib=libc++ -std=c++14"
70-
CXX17="clang++-mp-4.0 -stdlib=libc++ -std=c++1z"
7163
# newer version (testing) using clang
7264
# if a recent clang-mp is available
7365
if command -v clang-mp-6.0 >/dev/null 2>&1; then
7466
CC=clang-mp-6.0
75-
CXX="clang++-mp-6.0 -stdlib=libc++ -std=c++14"
76-
CXX17="clang++-mp-6.0 -stdlib=libc++ -std=c++17"
67+
CXX="clang++-mp-6.0 -stdlib=libc++ -std=c++17"
7768
elif command -v clang-mp-5.0 >/dev/null 2>&1; then
7869
CC=clang-mp-5.0
79-
CXX="clang++-mp-5.0 -stdlib=libc++ -std=c++14"
80-
CXX17="clang++-mp-5.0 -stdlib=libc++ -std=c++17"
81-
elif command -v clang-mp-4.0 >/dev/null 2>&1; then
82-
CC=clang-mp-4.0
83-
CXX="clang++-mp-4.0 -stdlib=libc++ -std=c++14"
84-
CXX17="clang++-mp-4.0 -stdlib=libc++ -std=c++1z"
70+
CXX="clang++-mp-5.0 -stdlib=libc++ -std=c++17"
8571
elif command -v /usr/local/opt/llvm@11/bin/clang >/dev/null 2>&1; then
8672
CC=/usr/local/opt/llvm@11/bin/clang
87-
CXX="/usr/local/opt/llvm@11/bin/clang++ -std=c++14"
88-
CXX17="/usr/local/opt/llvm@11/bin/clang++ -std=c++17"
73+
CXX="/usr/local/opt/llvm@11/bin/clang++ -std=c++17"
8974
fi
9075
# clang > 7.0 sometimes chokes on building Universal CImg.ofx, probably because of #pragma omp atomic
9176
#Undefined symbols for architecture i386:
@@ -98,40 +83,31 @@ if [ "$PKGOS" = "OSX" ]; then
9883
*)
9984
if command -v clang-mp-17 >/dev/null 2>&1; then
10085
CC=clang-mp-17
101-
CXX="clang++-mp-17 -stdlib=libc++ -std=c++14"
102-
CXX17="clang++-mp-17 -stdlib=libc++ -std=c++17"
86+
CXX="clang++-mp-17 -stdlib=libc++ -std=c++17"
10387
elif command -v clang-mp-16 >/dev/null 2>&1; then
10488
CC=clang-mp-16
105-
CXX="clang++-mp-16 -stdlib=libc++ -std=c++14"
106-
CXX17="clang++-mp-16 -stdlib=libc++ -std=c++17"
89+
CXX="clang++-mp-16 -stdlib=libc++ -std=c++17"
10790
elif command -v clang-mp-15 >/dev/null 2>&1; then
10891
CC=clang-mp-15
109-
CXX="clang++-mp-15 -stdlib=libc++ -std=c++14"
110-
CXX17="clang++-mp-15 -stdlib=libc++ -std=c++17"
92+
CXX="clang++-mp-15 -stdlib=libc++ -std=c++17"
11193
elif command -v clang-mp-14 >/dev/null 2>&1; then
11294
CC=clang-mp-14
113-
CXX="clang++-mp-14 -stdlib=libc++ -std=c++14"
114-
CXX17="clang++-mp-14 -stdlib=libc++ -std=c++17"
95+
CXX="clang++-mp-14 -stdlib=libc++ -std=c++17"
11596
elif command -v clang-mp-13 >/dev/null 2>&1; then
11697
CC=clang-mp-13
117-
CXX="clang++-mp-13 -stdlib=libc++ -std=c++14"
118-
CXX17="clang++-mp-13 -stdlib=libc++ -std=c++17"
98+
CXX="clang++-mp-13 -stdlib=libc++ -std=c++17"
11999
elif command -v clang-mp-12 >/dev/null 2>&1; then
120100
CC=clang-mp-12
121-
CXX="clang++-mp-12 -stdlib=libc++ -std=c++14"
122-
CXX17="clang++-mp-12 -stdlib=libc++ -std=c++17"
101+
CXX="clang++-mp-12 -stdlib=libc++ -std=c++17"
123102
elif command -v clang-mp-11 >/dev/null 2>&1; then
124103
CC=clang-mp-11
125-
CXX="clang++-mp-11 -stdlib=libc++ -std=c++14"
126-
CXX17="clang++-mp-11 -stdlib=libc++ -std=c++17"
104+
CXX="clang++-mp-11 -stdlib=libc++ -std=c++17"
127105
elif command -v clang-mp-10 >/dev/null 2>&1; then
128106
CC=clang-mp-10
129-
CXX="clang++-mp-10 -stdlib=libc++ -std=c++14"
130-
CXX17="clang++-mp-10 -stdlib=libc++ -std=c++17"
107+
CXX="clang++-mp-10 -stdlib=libc++ -std=c++17"
131108
elif command -v clang-mp-9.0 >/dev/null 2>&1; then
132109
CC=clang-mp-9.0
133-
CXX="clang++-mp-9.0 -stdlib=libc++ -std=c++14"
134-
CXX17="clang++-mp-9.0 -stdlib=libc++ -std=c++17"
110+
CXX="clang++-mp-9.0 -stdlib=libc++ -std=c++17"
135111
fi
136112
;;
137113
esac
@@ -152,7 +128,7 @@ if [ "$PKGOS" = "OSX" ]; then
152128
#GCC_VERSION=5
153129
#GCC_VERSION=6
154130
CC=gcc-mp-${GCC_VERSION}
155-
CXX="g++-mp-${GCC_VERSION} -std=c++14"
131+
CXX="g++-mp-${GCC_VERSION} -std=c++17"
156132
OBJECTIVE_CC=gcc-4.2
157133
OBJECTIVE_CXX=g++-4.2
158134
fi
@@ -211,8 +187,7 @@ fi
211187

212188
COMPILER=${COMPILER:-gcc}
213189
CC=${CC:-gcc}
214-
CXX=${CXX:-g++ -std=${STD14}}
215-
CXX17=${CXX17:-g++ -std=${STD17}}
190+
CXX=${CXX:-g++ -std=${STD17}}
216191
OBJECTIVE_CC=${OBJECTIVE_CC:-${CC}}
217192
OBJECTIVE_CXX=${OBJECTIVE_CXX:-${CXX}}
218193

0 commit comments

Comments
 (0)