diff --git a/CMakeLists.txt b/CMakeLists.txt index d04f19c28faa..c491b1fb2201 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -268,14 +268,43 @@ RemoveFlag(CMAKE_C_FLAGS_MINSIZEREL CACHE "-DNDEBUG" "Default C flags for MinSiz RemoveFlag(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS SCRIPT "-rdynamic" "") RemoveFlag(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS SCRIPT "-rdynamic" "") +# # +# Determine optimization level +# # + +if(NOT OPT) + set(CMAKE_CXX_FLAGS_RELEASE "-O3") + set(CMAKE_C_FLAGS_RELEASE "-O3") + + set(CMAKE_CXX_FLAGS_DEBUG "-O0") + set(CMAKE_C_FLAGS_DEBUG "-O0") + + if(PROFILER STREQUAL "perf") + set(CMAKE_CXX_FLAGS_PROFILE "-Og") + set(CMAKE_C_FLAGS_PROFILE "-Og") + else(PROFILER STREQUAL "perf") + set(CMAKE_CXX_FLAGS_PROFILE "-O0") + set(CMAKE_C_FLAGS_PROFILE "-O0") + endif(PROFILER STREQUAL "perf") +else(NOT OPT) + set(CMAKE_CXX_FLAGS_RELEASE "${OPT}") + set(CMAKE_C_FLAGS_RELEASE "${OPT}") + + set(CMAKE_CXX_FLAGS_DEBUG "${OPT}") + set(CMAKE_C_FLAGS_DEBUG "${OPT}") + + set(CMAKE_CXX_FLAGS_PROFILE "${OPT}") + set(CMAKE_C_FLAGS_PROFILE "${OPT}") +endif(NOT OPT) + # # # Start determining options for Release build # # # reset the base Release build option -MESSAGE("Replacing default flags used for Release build with -O3 ${EXTRA_FLAGS_CONFIG} ${EXTRA_FLAGS_RELEASE}") -set(CMAKE_CXX_FLAGS_RELEASE "-O3 ${EXTRA_FLAGS_CONFIG} ${EXTRA_FLAGS_RELEASE}" CACHE STRING "Release build flags" FORCE) -set(CMAKE_C_FLAGS_RELEASE "-O3 ${EXTRA_FLAGS_CONFIG} ${EXTRA_FLAGS_RELEASE}" CACHE STRING "Release build flags" FORCE) +MESSAGE("Replacing default flags used for Release build with ${OPT} ${EXTRA_FLAGS_CONFIG} ${EXTRA_FLAGS_RELEASE}") +set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${EXTRA_FLAGS_CONFIG} ${EXTRA_FLAGS_RELEASE}" CACHE STRING "Release build flags" FORCE) +set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} ${EXTRA_FLAGS_CONFIG} ${EXTRA_FLAGS_RELEASE}" CACHE STRING "Release build flags" FORCE) set(CMAKE_EXE_LINKER_FLAGS_RELEASE "" CACHE STRING "" FORCE) # set the arch to use for Release build if provided if(ARCH) @@ -372,9 +401,9 @@ set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${CMAKE_SOURCE_ # replace the default Debug flag of -g with -O0 -DDEBUG -ggdb3 # this matches the flags of scons' debug build -MESSAGE("Replacing flags used for Debug build -O0 -DDEBUG -ggdb3 ${EXTRA_FLAGS_CONFIG} ${EXTRA_FLAGS_DEBUG}") -set(CMAKE_CXX_FLAGS_DEBUG "-O0 -DDEBUG -ggdb3 ${EXTRA_FLAGS_CONFIG} ${EXTRA_FLAGS_DEBUG}" CACHE STRING "change cmake's Debug flags to match scons' flags" FORCE) -set(CMAKE_C_FLAGS_DEBUG "-O0 -DDEBUG -ggdb3 ${EXTRA_FLAGS_CONFIG} ${EXTRA_FLAGS_DEBUG}" CACHE STRING "change cmake's Debug flags to match scons' flags" FORCE) +MESSAGE("Replacing flags used for Debug build ${OPT} -DDEBUG -ggdb3 ${EXTRA_FLAGS_CONFIG} ${EXTRA_FLAGS_DEBUG}") +set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DDEBUG -ggdb3 ${EXTRA_FLAGS_CONFIG} ${EXTRA_FLAGS_DEBUG}" CACHE STRING "change cmake's Debug flags to match scons' flags" FORCE) +set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DDEBUG -ggdb3 ${EXTRA_FLAGS_CONFIG} ${EXTRA_FLAGS_DEBUG}" CACHE STRING "change cmake's Debug flags to match scons' flags" FORCE) set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${LINK_EXTRA_FLAGS_CONFIG} ${LINK_EXTRA_FLAGS_DEBUG}" CACHE STRING "" FORCE) # adds GLIBCXX_DEBUG definitions @@ -391,29 +420,29 @@ endif(GLIBCXX_DEBUG) if(PROFILER STREQUAL "gprof" OR NOT PROFILER) MESSAGE("Profiler is gprof") - set(CMAKE_CXX_FLAGS_PROFILE "-pg ${EXTRA_FLAGS_CONFIG} ${EXTRA_FLAGS_PROFILE}" CACHE STRING "Flags for profiling with gprof" FORCE) - set(CMAKE_C_FLAGS_PROFILE "-pg ${EXTRA_FLAGS_CONFIG} ${EXTRA_FLAGS_PROFILE}" CACHE STRING "Flags for profiling with gprof" FORCE) + set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_PROFILE} -pg ${EXTRA_FLAGS_CONFIG} ${EXTRA_FLAGS_PROFILE}" CACHE STRING "Flags for profiling with gprof" FORCE) + set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_PROFILE} -pg ${EXTRA_FLAGS_CONFIG} ${EXTRA_FLAGS_PROFILE}" CACHE STRING "Flags for profiling with gprof" FORCE) set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${LINK_EXTRA_FLAGS_CONFIG} ${LINK_EXTRA_FLAGS_PROFILE}" CACHE STRING "" FORCE) endif() if(PROFILER STREQUAL "gcov") MESSAGE("Profiler is gcov") - set(CMAKE_CXX_FLAGS_PROFILE "-fprofile-arcs -ftest-coverage ${EXTRA_FLAGS_CONFIG} ${EXTRA_FLAGS_PROFILE}" CACHE STRING "Flags for profiling with gcov" FORCE) - set(CMAKE_C_FLAGS_PROFILE "-fprofile-arcs -ftest-coverage ${EXTRA_FLAGS_CONFIG} ${EXTRA_FLAGS_PROFILE}" CACHE STRING "Flags for profiling with gcov" FORCE) + set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_PROFILE} -fprofile-arcs -ftest-coverage ${EXTRA_FLAGS_CONFIG} ${EXTRA_FLAGS_PROFILE}" CACHE STRING "Flags for profiling with gcov" FORCE) + set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_PROFILE} -fprofile-arcs -ftest-coverage ${EXTRA_FLAGS_CONFIG} ${EXTRA_FLAGS_PROFILE}" CACHE STRING "Flags for profiling with gcov" FORCE) set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${LINK_EXTRA_FLAGS_CONFIG} ${LINK_EXTRA_FLAGS_PROFILE}" CACHE STRING "" FORCE) endif() if(PROFILER STREQUAL "gperftools") MESSAGE("Profiler is gperftools") - set(CMAKE_CXX_FLAGS_PROFILE "${EXTRA_FLAGS_CONFIG} ${EXTRA_FLAGS_PROFILE}" CACHE STRING "Flags for profiling with gperftools" FORCE) - set(CMAKE_C_FLAGS_PROFILE "${EXTRA_FLAGS_CONFIG} ${EXTRA_FLAGS_PROFILE}" CACHE STRING "Flags for profiling with gperftools" FORCE) + set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_PROFILE} ${EXTRA_FLAGS_CONFIG} ${EXTRA_FLAGS_PROFILE}" CACHE STRING "Flags for profiling with gperftools" FORCE) + set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_PROFILE} ${EXTRA_FLAGS_CONFIG} ${EXTRA_FLAGS_PROFILE}" CACHE STRING "Flags for profiling with gperftools" FORCE) set(CMAKE_EXE_LINKER_FLAGS_PROFILE "-Wl,--no-as-needed,-lprofiler ${LINK_EXTRA_FLAGS_CONFIG} ${LINK_EXTRA_FLAGS_PROFILE}" CACHE STRING "" FORCE) endif() if(PROFILER STREQUAL "perf") MESSAGE("Profiler is perf") - set(CMAKE_CXX_FLAGS_PROFILE "-ggdb -Og ${EXTRA_FLAGS_CONFIG} ${EXTRA_FLAGS_PROFILE}" CACHE STRING "Flags for profiling with perf" FORCE) - set(CMAKE_C_FLAGS_PROFILE "-ggdb -Og ${EXTRA_FLAGS_CONFIG} ${EXTRA_FLAGS_PROFILE}" CACHE STRING "Flags for profiling with perf" FORCE) + set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_PROFILE} -ggdb ${EXTRA_FLAGS_CONFIG} ${EXTRA_FLAGS_PROFILE}" CACHE STRING "Flags for profiling with perf" FORCE) + set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_PROFILE} -ggdb ${EXTRA_FLAGS_CONFIG} ${EXTRA_FLAGS_PROFILE}" CACHE STRING "Flags for profiling with perf" FORCE) set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${LINK_EXTRA_FLAGS_CONFIG} ${LINK_EXTRA_FLAGS_PROFILE}" CACHE STRING "" FORCE) endif() diff --git a/SConstruct b/SConstruct index ab88ca755dcc..f47c973b694b 100755 --- a/SConstruct +++ b/SConstruct @@ -55,6 +55,7 @@ opts.AddVariables( ('extra_flags_profile', 'Extra compiler and linker flags to use for profile builds', ""), BoolVariable('enable_lto', 'Whether to enable Link Time Optimization for build=release', False), ('arch', 'What -march option to use for build=release, will default to pentiumpro on Windows', ""), + ('opt', 'override for the build\'s optimization level', ""), BoolVariable('glibcxx_debug', 'Whether to define _GLIBCXX_DEBUG and _GLIBCXX_DEBUG_PEDANTIC for build=debug', False), EnumVariable('profiler', 'profiler to be used for build=profile', "gprof", ["gprof", "gcov", "gperftools", "perf"]), EnumVariable('pgo_data', 'whether to generate profiling data for PGO, or use existing profiling data', "", ["", "generate", "use"]), @@ -480,12 +481,27 @@ for env in [test_env, client_env, env]: env.AppendUnique(CXXFLAGS = Split("-Wctor-dtor-privacy -Wuseless-cast -Wnoexcept")) if env['sanitize']: env.AppendUnique(CCFLAGS = ["-fsanitize=" + env["sanitize"]], LINKFLAGS = ["-fsanitize=" + env["sanitize"]]) - + +# # +# Determine optimization level +# # + + if not env["opt"]: + if env["build"] == "release": + env["opt"] = "-O3 " + elif env["build"] == "profile" and env["profiler"] == "perf": + env["opt"] = "-Og " + else: + env["opt"] = "-O0 " + else: + env["opt"] = env["opt"]+" " + + # # # Start determining options for debug build # # - debug_flags = "-O0 -DDEBUG -ggdb3" + debug_flags = env["opt"]+"-DDEBUG -ggdb3" if env["glibcxx_debug"] == True: glibcxx_debug_flags = "_GLIBCXX_DEBUG _GLIBCXX_DEBUG_PEDANTIC" @@ -498,7 +514,7 @@ for env in [test_env, client_env, env]: # # # default compiler flags - rel_comp_flags = "-O3" + rel_comp_flags = env["opt"] rel_link_flags = "" # use the arch if provided, or if on Windows and no arch was passed in then default to pentiumpro @@ -543,19 +559,19 @@ for env in [test_env, client_env, env]: # # if env["profiler"] == "gprof": - prof_comp_flags = "-pg" + prof_comp_flags = env["opt"]+"-pg" prof_link_flags = "-pg" if env["profiler"] == "gcov": - prof_comp_flags = "-fprofile-arcs -ftest-coverage" + prof_comp_flags = env["opt"]+"-fprofile-arcs -ftest-coverage" prof_link_flags = "-fprofile-arcs" if env["profiler"] == "gperftools": - prof_comp_flags = "" + prof_comp_flags = env["opt"] prof_link_flags = "-Wl,--no-as-needed,-lprofiler" if env["profiler"] == "perf": - prof_comp_flags = "-ggdb -Og" + prof_comp_flags = env["opt"]+"-ggdb" prof_link_flags = "" # # diff --git a/utils/travis/docker_run.sh b/utils/travis/docker_run.sh index 4ca3dce3143b..f2ab952c91b6 100755 --- a/utils/travis/docker_run.sh +++ b/utils/travis/docker_run.sh @@ -10,7 +10,7 @@ TOOL="$2" CC="$3" CXX="$4" CXXSTD="$5" -EXTRA_FLAGS_RELEASE="$6" +OPT="$6" WML_TESTS="$7" WML_TEST_TIME="$8" PLAY_TEST="$9" @@ -19,7 +19,7 @@ BOOST_TEST="${11}" LTO="${12}" SAN="${13}" -if [ "$EXTRA_FLAGS_RELEASE" == "-O0" ]; then +if [ "$OPT" == "-O0" ]; then STRICT="true" build_timeout=35 else @@ -37,7 +37,7 @@ echo "TOOL: $TOOL" echo "CC: $CC" echo "CXX: $CXX" echo "CXXSTD: $CXXSTD" -echo "EXTRA_FLAGS_RELEASE: $EXTRA_FLAGS_RELEASE" +echo "OPT: $OPT" echo "WML_TESTS: $WML_TESTS" echo "WML_TEST_TIME: $WML_TEST_TIME" echo "PLAY_TEST: $PLAY_TEST" @@ -62,7 +62,7 @@ else echo "compiler_check = content" >> $HOME/.ccache/ccache.conf cmake -DCMAKE_BUILD_TYPE=Release -DENABLE_GAME=true -DENABLE_SERVER=true -DENABLE_CAMPAIGN_SERVER=true -DENABLE_TESTS=true -DENABLE_NLS=false \ - -DEXTRA_FLAGS_CONFIG="-pipe" -DEXTRA_FLAGS_RELEASE="$EXTRA_FLAGS_RELEASE" -DENABLE_STRICT_COMPILATION="$STRICT" -DENABLE_LTO="$LTO" -DLTO_JOBS=2 \ + -DEXTRA_FLAGS_CONFIG="-pipe" -DOPT="$OPT" -DENABLE_STRICT_COMPILATION="$STRICT" -DENABLE_LTO="$LTO" -DLTO_JOBS=2 \ -DCXX_STD="$CXXSTD" -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache && \ make VERBOSE=1 -j2 BUILD_RET=$? @@ -72,7 +72,7 @@ else else scons wesnoth wesnothd campaignd boost_unit_tests build=release \ ctool=$CC cxxtool=$CXX cxx_std=$CXXSTD \ - extra_flags_config="-pipe" extra_flags_release="$EXTRA_FLAGS_RELEASE" strict="$STRICT" \ + extra_flags_config="-pipe" opt="$OPT" strict="$STRICT" \ nls=false enable_lto="$LTO" sanitize="$SAN" jobs=2 --debug=time BUILD_RET=$? fi diff --git a/utils/travis/steps/install.sh b/utils/travis/steps/install.sh index a27111809da0..1b3329b6cb80 100755 --- a/utils/travis/steps/install.sh +++ b/utils/travis/steps/install.sh @@ -2,7 +2,6 @@ date -export EXTRA_FLAGS_RELEASE="$OPT" export WML_TESTS=true export PLAY_TEST=true export MP_TEST=true diff --git a/utils/travis/steps/script.sh b/utils/travis/steps/script.sh index 946765431670..60ad364d9ddc 100755 --- a/utils/travis/steps/script.sh +++ b/utils/travis/steps/script.sh @@ -28,12 +28,12 @@ if [ "$TRAVIS_OS_NAME" = "osx" ]; then "$CXX" --version scons wesnoth wesnothd campaignd boost_unit_tests build=release \ ctool="$CC" cxxtool="$CXX" cxx_std="$CXXSTD" \ - extra_flags_config="-pipe" extra_flags_release="$EXTRA_FLAGS_RELEASE" strict=true \ + extra_flags_config="-pipe" opt="$OPT" strict=true \ nls="$NLS" enable_lto="$LTO" jobs=2 --debug=time fi else docker run -v "$HOME"/build-cache:/home/wesnoth-travis/build \ -v "$HOME"/.ccache:/root/.ccache wesnoth-repo:"$LTS"-"$BRANCH" \ bash -c './utils/travis/docker_run.sh "$@"' \ - bash "$NLS" "$TOOL" "$CC" "$CXX" "$CXXSTD" "$EXTRA_FLAGS_RELEASE" "$WML_TESTS" "$WML_TEST_TIME" "$PLAY_TEST" "$MP_TEST" "$BOOST_TEST" "$LTO" "$SAN" + bash "$NLS" "$TOOL" "$CC" "$CXX" "$CXXSTD" "$OPT" "$WML_TESTS" "$WML_TEST_TIME" "$PLAY_TEST" "$MP_TEST" "$BOOST_TEST" "$LTO" "$SAN" fi