diff --git a/.ci/awesome_bot.sh b/.ci/awesome_bot.sh index 5604c8ff30..b142f420ac 100755 --- a/.ci/awesome_bot.sh +++ b/.ci/awesome_bot.sh @@ -1,9 +1,15 @@ #!/bin/bash +if type awesome_bot >/dev/null 2>&1; then + AWESOME_BOT_EXEC="awesome_bot" +else + AWESOME_BOT_EXEC="bundle exec awesome_bot" +fi + awesome_bot_with_retry() { local attempt_max=5 local -i attempt_num=1 - until awesome_bot "$@"; do + until ${AWESOME_BOT_EXEC} "$@"; do if ((attempt_num == attempt_max)); then exit 1 fi diff --git a/.github/workflows/awesome-bot.yml b/.github/workflows/awesome-bot.yml index bbf66a0dc3..c1fb21f153 100644 --- a/.github/workflows/awesome-bot.yml +++ b/.github/workflows/awesome-bot.yml @@ -10,16 +10,23 @@ on: name: AsesomeBot jobs: check: - runs-on: ubuntu-latest + # act の場合 github.ref_protected がないのでそれを利用 + # act の image に libssl1.1 が入ってないので 20.04 を使う + runs-on: ${{ (github.ref_protected == null && 'ubuntu-20.04') || 'ubuntu-latest' }} env: ASESOME_BOT_OPTION: --allow-redirect --allow-ssl --allow-dupe -t 60 steps: - uses: actions/checkout@v3 + - name: Create Gemfile + run: | + { + echo 'source "http://rubygems.org"' + echo "gem 'awesome_bot'" + } > Gemfile - uses: ruby/setup-ruby@v1 with: - ruby-version: 2.6 - - name: install - run: gem install awesome_bot + ruby-version: 3.1 + bundler-cache: true - name: check run: | # shellcheck disable=SC2086 diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 7af7ed69f5..18daf6aba2 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -25,6 +25,10 @@ jobs: analyze: name: Analyze runs-on: ubuntu-latest + # jobs.*.if では env 参照できない + # act の場合 github.ref_protected がないのでそれを利用 + # act では実行しない + if: github.ref_protected != null strategy: fail-fast: false diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index f258e341ef..b37fceee47 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -24,11 +24,15 @@ on: jobs: codecov: runs-on: ubuntu-latest + # jobs.*.if では env 参照できない + # act の場合 github.ref_protected がないのでそれを利用 + # act では実行しない + if: github.ref_protected != null env: USE_COVERAGE: gcov DEFS: -DIUTEST_FORCE_COLORCONSOLE=1 steps: - - uses: actions/checkout@master + - uses: actions/checkout@v3 - name: info run: | make -C test showcxxmacros @@ -44,7 +48,7 @@ jobs: - name: test run: | make -C test test - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 with: name: test-result path: test/*.xml @@ -58,10 +62,14 @@ jobs: coveralls: runs-on: ubuntu-latest + # jobs.*.if では env 参照できない + # act の場合 github.ref_protected がないのでそれを利用 + # act では実行しない + if: github.ref_protected != null env: USE_COVERAGE: lcov steps: - - uses: actions/checkout@master + - uses: actions/checkout@v3 - name: install dependencies run: | sudo apt-get install -qq -y lcov @@ -80,7 +88,7 @@ jobs: - name: test run: | make -C test test - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 with: name: test-result path: test/*.xml diff --git a/.github/workflows/gtest-compat.yml b/.github/workflows/gtest-compat.yml index 06a7eb16da..622c42b6d5 100644 --- a/.github/workflows/gtest-compat.yml +++ b/.github/workflows/gtest-compat.yml @@ -16,6 +16,9 @@ on: - '*.yaml' - '.circleci/**' - '.semaphore/**' + - '.github/**' + - '!.github/workflows/gtest-compat.yml' + - 'docs/**' push: branches: - master @@ -38,8 +41,13 @@ jobs: matrix: include: - gtest-version: "latest" - GTEST_EXPECT_VER: 0x01110000 + GTEST_EXPECT_VER: 0x01120100 GTEST_EXPECT_LATEST: 1 + - gtest-version: "release-1.12.1" + # 1.12.1 only change the version number + GTEST_EXPECT_VER: 0x01120000 + - gtest-version: "release-1.12.0" + GTEST_EXPECT_VER: 0x01120000 - gtest-version: "release-1.11.0" GTEST_EXPECT_VER: 0x01110000 - gtest-version: "release-1.10.0" diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index dd43296c16..c22b154e2e 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -39,7 +39,7 @@ jobs: run: | echo "${GITHUB_EVENT_CONTEXT}" > github_event.json - name: store event - uses: actions/upload-artifact@v1 + uses: actions/upload-artifact@v3 with: name: github_event.json path: github_event.json @@ -187,7 +187,7 @@ jobs: # if: always() zapcc-basic-test: - runs-on: ubuntu-18.04 + runs-on: ubuntu-latest needs: prepare container: image: docker://srzzumix/zapcc:bionic diff --git a/.github/workflows/metrics.yml b/.github/workflows/metrics.yml index add35ab63e..2c2c3e25b1 100644 --- a/.github/workflows/metrics.yml +++ b/.github/workflows/metrics.yml @@ -21,7 +21,7 @@ on: jobs: prepare: - runs-on: ubuntu-18.04 + runs-on: ubuntu-latest env: HEAD_COMMIT_MESSAGE: ${{ github.event.head_commit.message }} if: > @@ -32,7 +32,7 @@ jobs: echo "$HEAD_COMMIT_MESSAGE" fused: - runs-on: ubuntu-18.04 + runs-on: ubuntu-latest needs: prepare steps: - uses: actions/checkout@v3 @@ -40,9 +40,9 @@ jobs: id: fused run: | make -C tools/fused - echo "##[set-output name=size;]$(wc -c < fused-src/iutest.hpp)" - echo "##[set-output name=min_size;]$(wc -c < fused-src/iutest.min.hpp)" - echo "##[set-output name=wandbox_min_size;]$(wc -c < fused-src/iutest.wandbox.min.hpp)" + echo "size=$(wc -c < fused-src/iutest.hpp)" >> "${GITHUB_OUTPUT}" + echo "min_size=$(wc -c < fused-src/iutest.min.hpp)" >> "${GITHUB_OUTPUT}" + echo "wandbox_min_size=$(wc -c < fused-src/iutest.wandbox.min.hpp)" >> "${GITHUB_OUTPUT}" - name: send metrics run: | curl \ @@ -63,7 +63,7 @@ jobs: password: ${{ secrets.DOCKERHUB_TOKEN }} lizard: - runs-on: ubuntu-18.04 + runs-on: ubuntu-latest needs: login steps: - uses: actions/checkout@v3 @@ -72,7 +72,7 @@ jobs: with: args: -o lizard.html --html ./include - name: Archive code metrics results - uses: actions/upload-artifact@v1 + uses: actions/upload-artifact@v3 with: name: lizard.html path: lizard.html diff --git a/.github/workflows/reviewdog.yml b/.github/workflows/reviewdog.yml index 66b192bc29..791911799a 100644 --- a/.github/workflows/reviewdog.yml +++ b/.github/workflows/reviewdog.yml @@ -54,3 +54,14 @@ jobs: steps: - uses: actions/checkout@v3 - uses: reviewdog/action-actionlint@v1 + with: + reporter: github-pr-review + + hadolint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: hadolint + uses: reviewdog/action-hadolint@v1 + with: + reporter: github-pr-review diff --git a/Makefile b/Makefile index 69995b1f83..3fa558bc0f 100644 --- a/Makefile +++ b/Makefile @@ -15,7 +15,7 @@ fused: ## create fused src make -C tools/fused editorconfig-self-lint: - make -C tools/python editorconfig + make -C tools/python editorconfig-self-lint DAGGER_OPTS:=--log-format=plain dagger-ctest: diff --git a/appveyor.yml b/appveyor.yml index a579d5f04c..f3919de51a 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -217,12 +217,12 @@ for: install: cmd: | curl -sSL -o %CYGWIN_PATH%\%CYGWIN_SETUP_EXE% "https://cygwin.com/%CYGWIN_SETUP_EXE%" - %CYGWIN_PATH%\%CYGWIN_SETUP_EXE% -qnNdO -R %CYGWIN_PATH% -s http://cygwin.mirror.constant.com -l %CYGWIN_PATH%/var/cache/setup -P make -P clang + %CYGWIN_PATH%\%CYGWIN_SETUP_EXE% -qnNdO --allow-unsupported-windows -R %CYGWIN_PATH% -s http://cygwin.mirror.constant.com -l %CYGWIN_PATH%/var/cache/setup -P make -P clang before_build: *noop build_script: cmd: | cd test - make showcxxmacros showstdlbfeatures + make showcxxmacros check_stdlib showstdlbfeatures make -j4 OUTPUTXML=%OUTPUTXML_TYPE% test_script: cmd: make test OUTPUTXML=%OUTPUTXML_TYPE% && make report @@ -256,7 +256,7 @@ for: build_script: cmd: | cd test - mingw32-make showcxxversion showcxxmacros showstdlbfeatures + mingw32-make showcxxversion showcxxmacros check_stdlib showstdlbfeatures mingw32-make -j4 %MAKE_OPTIONS% OUTPUTXML=%OUTPUTXML_TYPE% test_script: cmd: mingw32-make test %MAKE_OPTIONS% OUTPUTXML=%OUTPUTXML_TYPE% && mingw32-make report @@ -269,7 +269,7 @@ for: before_build: cmd: | "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\Tools\vsdevcmd.bat" - cd test && nmake showcxxmacros showstdlbfeatures + cd test && nmake showcxxmacros check_stdlib showstdlbfeatures nmake minimum_tests && minimum_tests.exe --spec nmake clean build_script: diff --git a/codefresh.yml b/codefresh.yml index 337bd3fad3..f5135f1e7b 100644 --- a/codefresh.yml +++ b/codefresh.yml @@ -38,6 +38,7 @@ steps: - cf_export GGC_MIN_EXPAND=4 - cf_export GGC_MIN_HEAPSIZ=32768 - cf_export CI_NODEBUG=1 + - cf_export NO_TESTDATA=1 - make -C test clean - make -C test prepare when: *skip_condition diff --git a/docs/Doxyfile b/docs/Doxyfile index d3fdfe53e2..96ea3dc3bb 100644 --- a/docs/Doxyfile +++ b/docs/Doxyfile @@ -38,7 +38,7 @@ PROJECT_NAME = iutest # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = 1.17.99.13 +PROJECT_NUMBER = 1.17.99.14 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a diff --git a/include/gtest/iutest_gmock_ver.hpp b/include/gtest/iutest_gmock_ver.hpp index a0c4567d15..e143451ce1 100644 --- a/include/gtest/iutest_gmock_ver.hpp +++ b/include/gtest/iutest_gmock_ver.hpp @@ -26,9 +26,11 @@ //!< Minor Version #ifndef GMOCK_MINORVER -# if defined(GTEST_FLAG_GET) -# define GMOCK_MINORVER 0x11 +# if defined(GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_FUNCTION_MOCKER_H_) +# define GMOCK_MINORVER 0x12 # define GMOCK_LATEST 1 +# elif defined(GTEST_FLAG_GET) +# define GMOCK_MINORVER 0x11 # elif defined(GMOCK_INTERNAL_NOEXCEPT_SPEC_IF_NOEXCEPT) # define GMOCK_MINORVER 0x11 # elif defined(GMOCK_INCLUDE_GMOCK_GMOCK_NICE_STRICT_H_) @@ -52,7 +54,9 @@ //!< Micro Version #ifndef GMOCK_MICROVER -# if GMOCK_MINORVER == 0x08 && !defined(GMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_CALLBACK_MATCHERS_H_) +# if GMOCK_MINORVER == 0x12 && defined(GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_FUNCTION_MOCKER_H_) +# define GMOCK_MICROVER 0x01 +# elif GMOCK_MINORVER == 0x08 && !defined(GMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_CALLBACK_MATCHERS_H_) # define GMOCK_MICROVER 0x01 # endif #endif diff --git a/include/gtest/iutest_gtest_ver.hpp b/include/gtest/iutest_gtest_ver.hpp index 2257431fb5..1cf3a7a839 100644 --- a/include/gtest/iutest_gtest_ver.hpp +++ b/include/gtest/iutest_gtest_ver.hpp @@ -27,9 +27,11 @@ //!< Minor Version #ifndef GTEST_MINORVER -# if defined(GTEST_FLAG_GET) -# define GTEST_MINORVER 0x11 +# if defined(GTEST_HAVE_ATTRIBUTE_) +# define GTEST_MINORVER 0x12 # define GTEST_LATEST 1 +# elif defined(GTEST_FLAG_GET) +# define GTEST_MINORVER 0x12 # elif defined(GTEST_TEST_NO_THROW_CATCH_STD_EXCEPTION_) # define GTEST_MINORVER 0x11 # elif defined(GTEST_SKIP) @@ -57,7 +59,9 @@ //!< Micro Version #ifndef GTEST_MICROVER -# if GTEST_MINORVER == 0x08 && defined(GTEST_STRINGIFY_) +# if GTEST_MINORVER == 0x12 && defined(GTEST_HAVE_ATTRIBUTE_) +# define GTEST_MICROVER 0x01 +# elif GTEST_MINORVER == 0x08 && defined(GTEST_STRINGIFY_) # define GTEST_MICROVER 0x01 # elif GTEST_MINORVER == 0x02 && defined(GTEST_HAS_CLONE) # define GTEST_MICROVER 0x01 diff --git a/include/gtest/switch/iutest_switch_assertion_return.hpp b/include/gtest/switch/iutest_switch_assertion_return.hpp index ab6e7887e6..245d169e30 100644 --- a/include/gtest/switch/iutest_switch_assertion_return.hpp +++ b/include/gtest/switch/iutest_switch_assertion_return.hpp @@ -125,7 +125,8 @@ class AssertHelperEx : public AssertHelper return fixed.ret.value; } private: - GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelperEx); + AssertHelperEx(const AssertHelperEx&); + AssertHelperEx& operator = (const AssertHelperEx&); }; } // end of namespace internal diff --git a/include/internal/iutest_file.hpp b/include/internal/iutest_file.hpp index eba1560773..e7899129f0 100644 --- a/include/internal/iutest_file.hpp +++ b/include/internal/iutest_file.hpp @@ -235,7 +235,7 @@ class StdioFile : public IFile } //! サイズ取得 - virtual size_t GetSize() IUTEST_CXX_OVERRIDE + virtual iu_uint_max_t GetSize() IUTEST_CXX_OVERRIDE { return GetSize(m_fp); } @@ -247,59 +247,32 @@ class StdioFile : public IFile } public: - static size_t GetSize(FILE* fp) + static iu_uint_max_t GetSize(FILE* fp) { - if( fp == NULL ) - { - return 0; - } -#if IUTEST_HAS_FILE_STAT - internal::posix::StatStruct st; - if (internal::posix::Stat(fp, &st) != 0) - { - return GetSizeBySeekSet(fp); - } - // FIXME: https://github.com/srz-zumix/iutest/issues/227 - return static_cast(st.st_size); -#else - return GetSizeBySeekSet(fp); -#endif + return internal::posix::FileSize(fp); } - static size_t GetSizeBySeekSet(FILE* fp) + static iu_uint_max_t GetSizeBySeekSet(FILE* fp) { - if( fp == NULL ) - { - return 0; - } - const long pre = ftell(fp); - if( (pre != -1) && (fseek(fp, 0, SEEK_END) == 0) ) - { - const size_t size = static_cast(ftell(fp)); - IUTEST_UNUSED_RETURN(fseek(fp, pre, SEEK_SET)); - return size; - } - return 0; + return internal::posix::FileSizeBySeekSet(fp); } private: virtual bool OpenImpl(const char* filename, int mode) IUTEST_CXX_OVERRIDE { Close(); -IUTEST_PRAGMA_CRT_SECURE_WARN_DISABLE_BEGIN() switch( mode ) { case IFile::OpenRead: - m_fp = fopen(filename, "rb"); + m_fp = internal::posix::FileOpen(filename, "rb"); break; case IFile::OpenWrite: - m_fp = fopen(filename, "wb"); + m_fp = internal::posix::FileOpen(filename, "wb"); break; case IFile::OpenAppend: - m_fp = fopen(filename, "ab"); + m_fp = internal::posix::FileOpen(filename, "ab"); break; default: break; } -IUTEST_PRAGMA_CRT_SECURE_WARN_DISABLE_END() return m_fp != NULL; } }; @@ -371,7 +344,7 @@ class TempFile : public IFile } //! サイズ取得 - virtual size_t GetSize() IUTEST_CXX_OVERRIDE + virtual iu_uint_max_t GetSize() IUTEST_CXX_OVERRIDE { return m_file.GetSize(); } @@ -452,6 +425,7 @@ IUTEST_PRAGMA_CRT_SECURE_WARN_DISABLE_END() #endif + #if IUTEST_HAS_STRINGSTREAM /** @@ -502,13 +476,13 @@ class StringStreamFile : public IFile } //! サイズ取得 - virtual size_t GetSize() IUTEST_CXX_OVERRIDE + virtual iu_uint_max_t GetSize() IUTEST_CXX_OVERRIDE { ::std::stringstream::pos_type pre = ss.tellg(); ss.seekg(0, ::std::ios::end); ::std::stringstream::pos_type size = ss.tellg(); ss.seekg(pre, ::std::ios::beg); - return static_cast(size); + return static_cast(size); } //! 全読み込み @@ -540,7 +514,7 @@ class NoEffectFile IUTEST_CXX_FINAL : public IFile virtual void Close() IUTEST_CXX_OVERRIDE {} virtual bool Write(const void*, size_t, size_t) IUTEST_CXX_OVERRIDE { return true; } virtual bool Read(void*, size_t, size_t) IUTEST_CXX_OVERRIDE { return true; } - virtual size_t GetSize() IUTEST_CXX_OVERRIDE { return 0; } + virtual iu_uint_max_t GetSize() IUTEST_CXX_OVERRIDE { return 0; } private: virtual bool OpenImpl(const char*, int) IUTEST_CXX_OVERRIDE { return true; } }; diff --git a/include/internal/iutest_option_message.hpp b/include/internal/iutest_option_message.hpp index d49168e45e..f41d32b2ce 100644 --- a/include/internal/iutest_option_message.hpp +++ b/include/internal/iutest_option_message.hpp @@ -240,6 +240,7 @@ inline void iuOptionMessage::ShowSpec() IIUT_SHOW_MACRO(IUTEST_HAS_IOMANIP); IIUT_SHOW_MACRO(IUTEST_HAS_LAMBDA); IIUT_SHOW_MACRO(IUTEST_HAS_LAMBDA_STATEMENTS); + IIUT_SHOW_MACRO(IUTEST_HAS_LARGEFILE_API); IIUT_SHOW_MACRO(IUTEST_HAS_LONG_DOUBLE); IIUT_SHOW_MACRO(IUTEST_HAS_MKSTEMP); IIUT_SHOW_MACRO(IUTEST_HAS_MOVE_ASSIGNMENT_DEFAULT_FUNCTION); diff --git a/include/internal/iutest_port.hpp b/include/internal/iutest_port.hpp index 66692899dd..5123d529a3 100644 --- a/include/internal/iutest_port.hpp +++ b/include/internal/iutest_port.hpp @@ -104,6 +104,49 @@ IUTEST_ATTRIBUTE_NORETURN_ void Abort(); inline void Abort() { abort(); } #endif +#if IUTEST_HAS_FOPEN + +inline FILE* FileOpen(const char* filename, const char* mode) +{ +#if defined(_MSC_VER) +IUTEST_PRAGMA_CRT_SECURE_WARN_DISABLE_BEGIN() + return fopen(filename, mode); +IUTEST_PRAGMA_CRT_SECURE_WARN_DISABLE_END() +#elif defined(_LARGEFILE64_SOURCE) + return fopen64(filename, mode); +#else + return fopen(filename, mode); +#endif +} + +inline int FileSeek(FILE* fp, iu_off_t pos, int origin) +{ +#if defined(_MSC_VER) + return _fseeki64(fp, pos, origin); +#elif defined(_LARGEFILE64_SOURCE) + return fseeko64(fp, pos, origin); +#elif IUTEST_HAS_LARGEFILE_API + return fseeko(fp, pos, origin); +#else + return fseek(fp, pos, origin); +#endif +} + +inline iu_off_t FileTell(FILE* fp) +{ +#if defined(_MSC_VER) + return static_cast(_ftelli64(fp)); +#elif defined(_LARGEFILE64_SOURCE) + return static_cast(ftello64(fp)); +#elif IUTEST_HAS_LARGEFILE_API + return static_cast(ftello(fp)); +#else + return static_cast(ftell(fp)); +#endif +} + +#endif + #if IUTEST_HAS_HDR_UNISTD #if defined(_MSC_VER) || defined(IUTEST_OS_WINDOWS_MINGW) @@ -170,18 +213,30 @@ inline int Fileno(FILE*) { return -1; } #if defined(IUTEST_OS_WINDOWS) && !defined(IUTEST_OS_WINDOWS_WINE) -typedef struct _stat StatStruct; +typedef struct __stat64 StatStruct; -inline int FileStat(int fd, StatStruct* buf) { return _fstat(fd, buf); } -inline int Stat(const char* path, StatStruct* buf) { return _stat(path, buf); } +inline int FileStat(int fd, StatStruct* buf) { return _fstat64(fd, buf); } +inline int Stat(const char* path, StatStruct* buf) { return _stat64(path, buf); } inline bool IsDir(const StatStruct& st) { return (st.st_mode & _S_IFDIR) != 0; } #else +#if defined(_LARGEFILE64_SOURCE) + +typedef struct stat64 StatStruct; + +inline int FileStat(int fd, StatStruct* buf) { return fstat64(fd, buf); } +inline int Stat(const char* path, StatStruct* buf) { return stat64(path, buf); } + +#else + typedef struct stat StatStruct; inline int FileStat(int fd, StatStruct* buf) { return fstat(fd, buf); } inline int Stat(const char* path, StatStruct* buf) { return stat(path, buf); } + +#endif + inline bool IsDir(const StatStruct& st) { return S_ISDIR(st.st_mode); } #endif @@ -194,6 +249,76 @@ inline int Stat(FILE* fp, StatStruct* buf) #endif +#if IUTEST_HAS_FOPEN + +inline iu_uint_max_t FileSizeBySeekSet(FILE* fp) +{ + if( fp == NULL ) + { + return 0; + } + const iu_off_t pre = FileTell(fp); + if( (pre != -1) && (FileSeek(fp, 0, SEEK_END) == 0) ) + { + const iu_off_t size = FileTell(fp); + IUTEST_UNUSED_RETURN(FileSeek(fp, pre, SEEK_SET)); + return static_cast(size); + } + return 0; +} + +inline iu_uint_max_t FileSize(FILE* fp) +{ + if( fp == NULL ) + { + return 0; + } +#if IUTEST_HAS_FILE_STAT + StatStruct st; + if (Stat(fp, &st) == 0) + { + return static_cast(st.st_size); + } +#endif + return FileSizeBySeekSet(fp); +} + +#endif + +inline iu_uint_max_t FdSize(int fd) +{ + if( fd == -1 ) + { + return 0; + } +#if IUTEST_HAS_FILE_STAT + StatStruct st; + if (FileStat(fd, &st) == 0) + { + return static_cast(st.st_size); + } +#endif + return 0; +} + +inline iu_uint_max_t FileSizeFromPath(const char* filename) +{ +#if IUTEST_HAS_STD_FILESYSTEM + return ::std::filesystem::file_size(filename); +#else + +#if IUTEST_HAS_FILE_STAT + StatStruct st; + if (Stat(filename, &st) == 0) + { + return static_cast(st.st_size); + } +#endif + return 0; + +#endif +} + #if IUTEST_HAS_MKSTEMP #if defined(_MSC_VER) diff --git a/include/internal/iutest_stdlib_defs.hpp b/include/internal/iutest_stdlib_defs.hpp index b7b91a3595..35b5173798 100644 --- a/include/internal/iutest_stdlib_defs.hpp +++ b/include/internal/iutest_stdlib_defs.hpp @@ -638,6 +638,18 @@ # define IUTEST_HAS_INVALID_PARAMETER_HANDLER 0 #endif +//! has largefile api +#if !defined(IUTEST_HAS_LARGEFILE_API) +# if defined(__LARGEFILE_VISIBLE) && __LARGEFILE_VISIBLE +# define IUTEST_HAS_LARGEFILE_API 1 +# elif defined(__POSIX_VISIBLE) && __POSIX_VISIBLE >= 200112 +# define IUTEST_HAS_LARGEFILE_API 1 +# else +# define IUTEST_HAS_LARGEFILE_API 0 +# endif +#endif + + //! has fopen #if !defined(IUTEST_HAS_FOPEN) # define IUTEST_HAS_FOPEN 1 @@ -657,7 +669,11 @@ //! has fileno #if !defined(IUTEST_HAS_FILENO) -# if !defined(IUTEST_OS_WINDOWS_MOBILE) && !defined(__STRICT_ANSI__) +# if defined(__POSIX_VISIBLE) && __POSIX_VISIBLE == 0 +# define IUTEST_HAS_FILENO 0 +# elif defined(IUTEST_OS_WINDOWS_MINGW) && defined(__STRICT_ANSI__) +# define IUTEST_HAS_FILENO 0 +# elif !defined(IUTEST_OS_WINDOWS_MOBILE) # define IUTEST_HAS_FILENO 1 # endif #endif diff --git a/include/internal/iutest_stream.hpp b/include/internal/iutest_stream.hpp index 74300919c9..fc40969e79 100644 --- a/include/internal/iutest_stream.hpp +++ b/include/internal/iutest_stream.hpp @@ -6,7 +6,7 @@ * * @author t.shirayanagi * @par copyright - * Copyright (C) 2012-2021, Takazumi Shirayanagi\n + * Copyright (C) 2012-2022, Takazumi Shirayanagi\n * This software is released under the new BSD License, * see LICENSE */ @@ -62,14 +62,14 @@ class IInStream virtual bool Read(void* buf, size_t size, size_t cnt) = 0; //! サイズ取得 - virtual size_t GetSize() = 0; + virtual iu_uint_max_t GetSize() = 0; public: //! 全読み込み virtual ::std::string ReadAll() { ::std::string str; - const size_t size = GetSize(); + const size_t size = static_cast(GetSize()); if( size != 0 ) { char* buf = new char[size+1]; diff --git a/include/iutest_defs.hpp b/include/iutest_defs.hpp index 1469d40dc4..816908c237 100644 --- a/include/iutest_defs.hpp +++ b/include/iutest_defs.hpp @@ -504,9 +504,11 @@ typedef detail::type_fit_t<8>::Int Int64; //!< 64 bit 符号付き整数型 typedef detail::type_fit_t<8>::UInt UInt64; //!< 64 bit 符号なし整数型 #if IUTEST_HAS_CXX11 && IUTEST_HAS_CXX_HDR_CSTDINT -typedef ::std::uintmax_t iu_off_t; +typedef ::std::intmax_t iu_off_t; +typedef ::std::uintmax_t iu_uint_max_t; #else -typedef UInt64 iu_off_t; +typedef Int64 iu_off_t; +typedef UInt64 iu_uint_max_t; #endif #if IUTEST_HAS_CXX11 && IUTEST_HAS_CXX_HDR_CSTDINT diff --git a/include/iutest_ver.hpp b/include/iutest_ver.hpp index ce90c81e1d..8447bd4959 100644 --- a/include/iutest_ver.hpp +++ b/include/iutest_ver.hpp @@ -17,11 +17,11 @@ //====================================================================== // define -#define IUTEST_VER 0x01179913u //!< iutest version 1.17.99.13 +#define IUTEST_VER 0x01179914u //!< iutest version 1.17.99.14 #define IUTEST_MAJORVER 0x01u //!< Major Version #define IUTEST_MINORVER 0x17u //!< Minor Version #define IUTEST_MICROVER 0x99u //!< Micro Version -#define IUTEST_REVISION 0x13u //!< Revision +#define IUTEST_REVISION 0x14u //!< Revision #define IUTEST_BUILD IUTEST_MICROVER //!< @deprecated diff --git a/projects/vscode/iutest.code-workspace b/projects/vscode/iutest.code-workspace index 152205975c..ce9247110b 100644 --- a/projects/vscode/iutest.code-workspace +++ b/projects/vscode/iutest.code-workspace @@ -136,7 +136,29 @@ "version": "cpp", "*.defs": "cpp" }, - "bracketLens.minBracketScopeLines": 12 + "bracketLens.minBracketScopeLines": 12, + "editor.tokenColorCustomizations": { + "textMateRules": [ + { + "scope": "googletest.failed", + "settings": { + "foreground": "#f00" + } + }, + { + "scope": "googletest.passed", + "settings": { + "foreground": "#0f0" + } + }, + { + "scope": "googletest.run", + "settings": { + "foreground": "#0f0" + } + } + ] + } }, "launch": { "configurations": [ diff --git a/test/.gitignore b/test/.gitignore index 5eddb1fdf9..5ee390f782 100644 --- a/test/.gitignore +++ b/test/.gitignore @@ -7,8 +7,8 @@ !*.hpp !*.defs !*.in -!Makefile -!GNUMakefile +![Mm]akefile +!GNU[Mm]akefile !**/ # !benchmark/**/* !configcheck/**/* diff --git a/test/GNUmakefile b/test/GNUmakefile index 2a06555082..358166f091 100644 --- a/test/GNUmakefile +++ b/test/GNUmakefile @@ -183,6 +183,8 @@ endif COVERITY_SCAN_BUILD_TARGETS = $(ALLTESTS_TARGET) $(EXTENSIONTESTS_TARGET) \ $(TEST_TARGETS) $(ASSERTION_ONLY_TARGETS) $(TARGETS_IUTEST_ONLY) $(UNITTESTS_TARGET) +GENERATE_TESTDATA=testdata/4gb.bin + # # exec options # @@ -208,7 +210,7 @@ all : clean default test ## clean and build, run # @if [ ! -e `dirname $(OUTDIR)` ]; then mkdir -p `dirname $(OUTDIR)`; fi clean : ## clean - $(RM) $(TARGETS) $(NO_DEFAULT_TARGETS) $(ALL_OBJS) *.o *.stackdump *.core *.exe *.log *.ns.cpp + $(RM) $(TARGETS) $(NO_DEFAULT_TARGETS) $(ALL_OBJS) $(GENERATE_TESTDATA) *.o *.stackdump *.core *.exe *.log *.ns.cpp $(RM) -R *.dSYM ifdef OUTPUTXML $(RM) *.xml @@ -322,6 +324,29 @@ gtest-version: clean gtest_version_tests_run ## gtest version test coverity_scan: $(COVERITY_SCAN_BUILD_TARGETS) +# +# +# test data +# + +ifdef NO_TESTDATA + +testdata: + @echo skip generate testdata + +else + +testdata: $(GENERATE_TESTDATA) + +endif + +testdata/4gb.bin: + dd if=/dev/zero of=$@ bs=1048576 count=4096 + +# testdata/4gb.bin: testdata/empty.bin +# cp $< $@ +# truncate -s 4G $@ + # # # fused @@ -444,7 +469,7 @@ override CXXFLAGS += -DIUTEST_USE_LIB=1 -L../lib override LDFLAGS:= -liutest $(LDFLAGS) endif -$(TARGETS_EXCLUDE_ALLTESTS) : $(OUTDIR)/% : %.cpp $(IUTEST_HEADERS) $(MAKEFILE) +$(TARGETS_EXCLUDE_ALLTESTS) : $(OUTDIR)/% : %.cpp $(IUTEST_HEADERS) testdata $(MAKEFILE) $(BUILD4ZAPCC) $(CXX) $(IUTEST_INCLUDE) $(CXXFLAGS) -o $@ $< $(LDFLAGS) @@ -478,29 +503,29 @@ endif $(BUILD_ONLY) : $(OUTDIR)/% : %.cpp $(IUTEST_HEADERS) $(MAKEFILE) $(CXX) $(IUTEST_INCLUDE) $(CXXFLAGS) -o $@ $< $(LDFLAGS) -$(TEST_TARGETS) : $(OUTDIR)/% : %.cpp $(IUTEST_HEADERS) $(MAKEFILE) +$(TEST_TARGETS) : $(OUTDIR)/% : %.cpp $(IUTEST_HEADERS) testdata $(MAKEFILE) $(BUILD4ZAPCC) $(CXX) $(IUTEST_INCLUDE) $(CXXFLAGS) -o $@ $< $(LDFLAGS) -$(ASSERTION_ONLY_TARGETS) : $(OUTDIR)/% : %.cpp $(IUTEST_HEADERS) $(MAKEFILE) +$(ASSERTION_ONLY_TARGETS) : $(OUTDIR)/% : %.cpp $(IUTEST_HEADERS) testdata $(MAKEFILE) $(BUILD4ZAPCC) $(CXX) $(IUTEST_INCLUDE) $(CXXFLAGS) -o $@ $< endif -$(ALLTESTS_TARGET) : $(ALLTESTS_SRC_OBJS) $(IUTEST_HEADERS) $(MAKEFILE) +$(ALLTESTS_TARGET) : $(ALLTESTS_SRC_OBJS) $(IUTEST_HEADERS) testdata $(MAKEFILE) $(BUILD4ZAPCC) $(CXX) $(IUTEST_INCLUDE) $(CXXFLAGS) -o $@ $(ALLTESTS_SRC_OBJS) $(LDFLAGS) -$(NAMESPACETESTS_TARGET) : $(NAMESPACETESTS_SRC_AND_OBJS) $(IUTEST_HEADERS) $(MAKEFILE) +$(NAMESPACETESTS_TARGET) : $(NAMESPACETESTS_SRC_AND_OBJS) $(IUTEST_HEADERS) testdata $(MAKEFILE) $(BUILD4ZAPCC) $(CXX) $(IUTEST_INCLUDE) $(CXXFLAGS) -o $@ $(NAMESPACETESTS_SRC_AND_OBJS) $(LDFLAGS) -$(EXTENSIONTESTS_TARGET) : $(EXTENSIONTESTS_SRCS) $(IUTEST_HEADERS) $(MAKEFILE) +$(EXTENSIONTESTS_TARGET) : $(EXTENSIONTESTS_SRCS) $(IUTEST_HEADERS) testdata $(MAKEFILE) $(BUILD4ZAPCC) $(CXX) $(IUTEST_INCLUDE) $(CXXFLAGS) -o $@ $(EXTENSIONTESTS_SRCS) $(LDFLAGS) -$(UNITTESTS_TARGET) : $(UNITTESTS_SRCS) $(IUTEST_HEADERS) $(MAKEFILE) +$(UNITTESTS_TARGET) : $(UNITTESTS_SRCS) $(IUTEST_HEADERS) testdata $(MAKEFILE) $(BUILD4ZAPCC) $(CXX) $(IUTEST_INCLUDE) $(CXXFLAGS) -o $@ $(UNITTESTS_SRCS) $(LDFLAGS) diff --git a/test/param_test_tests1.cpp b/test/param_test_tests1.cpp index d4fc39a6bb..f56dc1bdd9 100644 --- a/test/param_test_tests1.cpp +++ b/test/param_test_tests1.cpp @@ -25,6 +25,11 @@ IUTEST_P(ParamTest, Test) IUTEST_SUCCEED() << GetParam(); } +IUTEST_F(ParamTest, NoParam) +{ + IUTEST_SUCCEED(); +} + int param_test_array[] = { 3, 2, 1, 0 }; ::std::vector va(param_test_array, param_test_array+(sizeof(param_test_array)/sizeof(param_test_array[0]))); IUTEST_INSTANTIATE_TEST_SUITE_P(Range, ParamTest, ::iutest::Range(0, 10)); diff --git a/test/random_seed_tests.cpp b/test/random_seed_tests.cpp index c041c6b0ea..bee69145d9 100644 --- a/test/random_seed_tests.cpp +++ b/test/random_seed_tests.cpp @@ -72,15 +72,14 @@ int main(int argc, char* argv[]) { MyEnvironment* const env = new MyEnvironment(); IUTEST_TERMINATE_ON_FAILURE( ::iutest::AddGlobalTestEnvironment(env) == env ); - IUTEST_INIT(&argc, argv); - +#if defined(IUTEST_USE_GTEST) && (GTEST_VER >= 0x01120000) + ::iutest::IUTEST_FLAG(recreate_environments_when_repeating) = true; +#endif ::iutest::IUTEST_FLAG(repeat) = kRepeatCount; ::iutest::IUTEST_FLAG(shuffle) = true; ::iutest::IUTEST_FLAG(random_seed) = kSeed; -#if defined(IUTEST_USE_GTEST) && GTEST_LATEST - ::iutest::IUTEST_FLAG(recreate_environments_when_repeating) = true; -#endif + IUTEST_INIT(&argc, argv); const int ret = IUTEST_RUN_ALL_TESTS(); if( ret != 0 ) return ret; diff --git a/test/repeat_tests.cpp b/test/repeat_tests.cpp index 49e1dbe25a..4d5378972c 100644 --- a/test/repeat_tests.cpp +++ b/test/repeat_tests.cpp @@ -145,7 +145,7 @@ int main(int argc, char* argv[]) IUTEST_TERMINATE_ON_FAILURE( ::iutest::AddGlobalTestEnvironment(env) == env ); IUTEST_INIT(&argc, argv); -#if defined(IUTEST_USE_GTEST) && GTEST_LATEST +#if defined(IUTEST_USE_GTEST) && (GTEST_VER >= 0x01120000) ::iutest::IUTEST_FLAG(recreate_environments_when_repeating) = true; #endif diff --git a/test/shuffle_tests.cpp b/test/shuffle_tests.cpp index f382a368dc..69274de885 100644 --- a/test/shuffle_tests.cpp +++ b/test/shuffle_tests.cpp @@ -76,7 +76,7 @@ int main(int argc, char* argv[]) ::iutest::IUTEST_FLAG(repeat) = 3; ::iutest::IUTEST_FLAG(shuffle) = true; -#if defined(IUTEST_USE_GTEST) && GTEST_LATEST +#if defined(IUTEST_USE_GTEST) && (GTEST_VER >= 0x01120000) ::iutest::IUTEST_FLAG(recreate_environments_when_repeating) = true; #endif diff --git a/test/stdlib_feature_tests/Makefile b/test/stdlib_feature_tests/Makefile index b8a1516a78..fcf9cd9fcb 100644 --- a/test/stdlib_feature_tests/Makefile +++ b/test/stdlib_feature_tests/Makefile @@ -52,6 +52,8 @@ FEATURE_MACROS=\ _ISOC11_SOURCE \ _LARGEFILE64_SOURCE \ _LARGEFILE_SOURCE \ + __LARGEFILE_VISIBLE \ + _LARGE_FILE_API \ _FILE_OFFSET_BITS \ _BSD_SOURCE \ _SVID_SOURCE \ diff --git a/test/testdata/.gitignore b/test/testdata/.gitignore new file mode 100644 index 0000000000..a923fb94eb --- /dev/null +++ b/test/testdata/.gitignore @@ -0,0 +1 @@ +*gb.bin diff --git a/test/testdata/unit_file_tests.tmp b/test/testdata/unit_file_tests.tmp new file mode 100644 index 0000000000..f1d18473b9 --- /dev/null +++ b/test/testdata/unit_file_tests.tmp @@ -0,0 +1 @@ +test1234abcdWXYZ \ No newline at end of file diff --git a/test/unit_file_tests.cpp b/test/unit_file_tests.cpp index b3099ebb2e..34c4eac52b 100644 --- a/test/unit_file_tests.cpp +++ b/test/unit_file_tests.cpp @@ -1,12 +1,12 @@ //====================================================================== //----------------------------------------------------------------------- /** - * @file unit_filepath_tests.cpp + * @file unit_file_tests.cpp * @brief iutest test * * @author t.shirayanagi * @par copyright - * Copyright (C) 2013-2021, Takazumi Shirayanagi\n + * Copyright (C) 2013-2022, Takazumi Shirayanagi\n * The new BSD License is applied to this software. * see LICENSE */ @@ -42,7 +42,90 @@ IUTEST(StdFileUnitTest, FileSize) IUTEST_ASSERT_TRUE( file.Open(filename.string().c_str(), iutest::IFile::OpenAppend) ); IUTEST_EXPECT_LT(0u, file.GetSize()); IUTEST_EXPECT_EQ(0u, ::iutest::StdioFile::GetSize(NULL)); - IUTEST_EXPECT_EQ(0u, ::iutest::StdioFile::GetSizeBySeekSet(NULL)); +} + +IUTEST(StdFileUnitTest, ReadWrite) +{ + char wbuf[] = "test1234abcdWXYZ"; + char rbuf[32] = { 0 }; + ::iutest::StdioFile file; + ::iutest::internal::FilePath filename("./testdata/unit_file_tests.tmp"); + IUTEST_ASSERT_TRUE( file.Open(filename.string().c_str(), iutest::IFile::OpenWrite) ); + IUTEST_ASSERT_TRUE( file.Write(wbuf, 4, 4)); + IUTEST_ASSERT_TRUE( file.Open(filename.string().c_str(), iutest::IFile::OpenRead) ); + IUTEST_ASSERT_TRUE( file.Read(rbuf, 4, 4)); + IUTEST_EXPECT_STREQ(wbuf, rbuf); + IUTEST_EXPECT_LT(0u, file.GetSize()); + IUTEST_EXPECT_EQ(0u, ::iutest::StdioFile::GetSize(NULL)); +} + +IUTEST(StdFileUnitTest, FileSize64bit) +{ + const ::iutest::iu_off_t expectedSize = 0x100000000ll; + ::iutest::StdioFile file; + IUTEST_ASSUME_TRUE( file.Open("./testdata/4gb.bin", iutest::IFile::OpenRead) ); +#if IUTEST_HAS_FILENO && IUTEST_HAS_FILE_STAT + IUTEST_EXPECT_EQ(expectedSize, file.GetSize()); +#else + IUTEST_INFORM_EQ(expectedSize, file.GetSize()); +#endif +} + + +#if IUTEST_HAS_PARAM_TEST && IUTEST_HAS_STD_FILESYSTEM + +const std::filesystem::path largefile("./testdata/largefile.bin"); + +class FileSystemTest : public ::iuutil::backward::Test, public ::iutest::WithParamInterface +{ +public: + static void SetUpTestCase(void) + { + IUTEST_ASSERT_TRUE(::std::filesystem::copy_file("./testdata/empty.bin", largefile, ::std::filesystem::copy_options::overwrite_existing)); + } + static void TearDownTestCase(void) + { + ::std::filesystem::remove(largefile); + } + + void SetUp() IUTEST_CXX_OVERRIDE + { + ::std::filesystem::resize_file(largefile, GetParam()); + } + void TearDown() IUTEST_CXX_OVERRIDE + { + } +}; + +IUTEST_P(FileSystemTest, FileSize64bit) +{ + const uintmax_t expectedSize = GetParam(); + IUTEST_ASSUME_EQ(expectedSize, ::std::filesystem::file_size(largefile)); + + ::iutest::StdioFile file; + IUTEST_ASSERT_TRUE( file.Open(largefile, iutest::IFile::OpenRead) ); +#if IUTEST_HAS_FILENO && IUTEST_HAS_FILE_STAT + IUTEST_EXPECT_EQ(expectedSize, file.GetSize()); +#else + IUTEST_INFORM_EQ(expectedSize, file.GetSize()); +#endif +} + +IUTEST_INSTANTIATE_TEST_SUITE_P(A, FileSystemTest, ::iutest::Values(0x100000000ull, 0x100001111ull, 0x10000ull)); + +#endif + +#endif + +#if IUTEST_HAS_FILE_STAT || IUTEST_HAS_STD_FILESYSTEM + +IUTEST(StdFileUnitTest, FileSizeFromPath) +{ + const ::iutest::iu_uint_max_t expectedSize = 0x100000000ull; + const char* path = "./testdata/4gb.bin"; + ::iutest::internal::FilePath file_path = ::iutest::internal::FilePath(path); + IUTEST_ASSUME_TRUE (file_path.FileOrDirectoryExists()); + IUTEST_ASSERT_EQ(expectedSize, ::iutest::internal::posix::FileSizeFromPath(path)); } #endif @@ -74,37 +157,3 @@ IUTEST(NoEffectFileUnitTest, Call) IUTEST_EXPECT_TRUE( file.Read(NULL, 0, 0) ); IUTEST_EXPECT_EQ(0u, file.GetSize()); } - -#if IUTEST_HAS_STD_FILESYSTEM - -const std::filesystem::path largefile("./testdata/largefile.bin"); - -class FileSystemTest : public ::iuutil::backward::Test -{ -public: - static void SetUpTestCase() - { - IUTEST_ASSERT_TRUE(::std::filesystem::copy_file("./testdata/empty.bin", largefile, ::std::filesystem::copy_options::overwrite_existing)); - ::std::filesystem::resize_file(largefile, 0x100000000ull); - } - static void TearDownTestCase() - { - ::std::filesystem::remove(largefile); - } -}; - -#if IUTEST_HAS_FOPEN - -// FIXME: 64bit GetSizeBySeekSet -// IUTEST_F(FileSystemTest, FileSize64bit) -// { -// IUTEST_ASSUME_EQ(0x100000000ull, ::std::filesystem::file_size(largefile)); - -// ::iutest::StdioFile file; -// IUTEST_ASSERT_TRUE( file.Open(largefile, iutest::IFile::OpenRead) ); -// IUTEST_EXPECT_EQ(0x100000000ull, file.GetSize()); -// } - -#endif - -#endif diff --git a/tools/python/Makefile b/tools/python/Makefile index f65ad42b0f..06b595ccba 100644 --- a/tools/python/Makefile +++ b/tools/python/Makefile @@ -1,7 +1,7 @@ # # Makefile -.PHONY: sample clean editorconfig +.PHONY: sample clean editorconfig-self-lint TOOLS=eval_line.py sample: $(TOOLS) Makefile diff --git a/utils/usegtest.mk b/utils/usegtest.mk index ff21613b40..81a47f57aa 100644 --- a/utils/usegtest.mk +++ b/utils/usegtest.mk @@ -1,7 +1,7 @@ # # usegtest.mk # -# Copyright (C) 2017-2018, Takazumi Shirayanagi +# Copyright (C) 2017-2022, Takazumi Shirayanagi # This software is released under the new BSD License, # see LICENSE # @@ -49,9 +49,9 @@ GTEST_INC_=-isystem$(GTEST_ROOT_)/include GTEST_SYSTEM_INCLUDED=1 #GTEST_LIB_=$(GTEST_ROOT_)/make/gtest.a -ifeq ($(findstring yes, $(shell test -e $(GTEST_ROOT_)/make/gtest-all.o && echo -n yes)), yes) +ifeq ($(findstring yes, $(shell test -e $(GTEST_GMOCK_ROOT)/lib/libgtest.a && echo -n yes)), yes) -GTEST_LIB_=$(GTEST_ROOT_)/make/gtest-all.o +GTEST_LIB_=-L $(GTEST_GMOCK_ROOT)/lib/ -lgtest else @@ -61,12 +61,20 @@ GTEST_LIB_=-L $(GTEST_GMOCK_ROOT)/build/lib/ -lgtest else +ifeq ($(findstring yes, $(shell test -e $(GTEST_ROOT_)/make/gtest-all.o && echo -n yes)), yes) + +GTEST_LIB_=$(GTEST_ROOT_)/make/gtest-all.o + +else + GTEST_LIB_=-lgtest endif endif +endif + else diff --git a/utils/xcode.mk b/utils/xcode.mk index 3bfbdda0d7..d3eac6ce43 100644 --- a/utils/xcode.mk +++ b/utils/xcode.mk @@ -31,11 +31,39 @@ ifeq (1,$(shell expr \( $(APPLE_CLANGMAJOR) \>= 7 \))) # https://en.wikipedia.org/wiki/Xcode#Toolchain_versions +ifeq (1,$(shell expr \( $(APPLE_CLANGMAJOR) \>= 14 \))) +CLANGMAJOR:=14 +CLANGMINOR:=0 + +else + +# 13 +ifeq (1,$(shell expr \( $(APPLE_CLANGMAJOR) \>= 13 \))) + +ifeq (1,$(shell expr \( $(APPLE_CLANGMINOR) \>= 3 \))) +CLANGMAJOR:=13 +CLANGMINOR:=0 +else +CLANGMAJOR:=12 +CLANGMINOR:=0 +endif + +else + +# 12 ifeq (1,$(shell expr \( $(APPLE_CLANGMAJOR) \>= 12 \))) + +ifeq (1,$(shell expr \( $(APPLE_CLANGMINOR) \>= 5 \))) +CLANGMAJOR:=11 +CLANGMINOR:=0 +else CLANGMAJOR:=10 CLANGMINOR:=0 +endif + else +# 11 ifeq (1,$(shell expr \( $(APPLE_CLANGMAJOR) \>= 11 \))) ifeq (1,$(shell expr \( $(APPLE_CLANGMINOR) \>= 4 \))) @@ -48,6 +76,7 @@ endif else +# 10 ifeq (1,$(shell expr \( $(APPLE_CLANGMAJOR) \>= 10 \))) ifeq (1,$(shell expr \( $(APPLE_CLANGMINOR) \>= 2 \))) @@ -60,6 +89,7 @@ endif else +# 9 ifeq (1,$(shell expr \( $(APPLE_CLANGMAJOR) \>= 9 \))) ifeq (1,$(shell expr \( $(APPLE_CLANGMINOR) \>= 3 \))) @@ -74,6 +104,7 @@ else CLANGMAJOR:=3 +# 8 ifeq (1,$(shell expr \( $(APPLE_CLANGMAJOR) \>= 8 \))) CLANGMINOR:=9 else @@ -86,6 +117,8 @@ endif # >= 9 endif # >= 10 endif # >= 11 endif # >= 12 +endif # >= 13 +endif # >= 14 endif # >= 7 else