From 44ddf63825c69a956c62f4f68eff918631405983 Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Sun, 26 Jan 2025 09:00:01 -0600 Subject: [PATCH 1/9] STYLE: Add itkVirtualGetNameOfClassMacro + itkOverrideGetNameOfClassMacro Added two new macro's, intended to replace the old 'itkTypeMacro' and 'itkTypeMacroNoParent'. The main aim is to be clearer about what those macro's do: add a virtual 'GetNameOfClass()' member function and override it. Unlike 'itkTypeMacro', 'itkOverrideGetNameOfClassMacro' does not have a 'superclass' parameter, as it was not used anyway. Note that originally 'itkTypeMacro' did not use its 'superclass' parameter either, looking at commit 699b66cb04d410e555656828e8892107add38ccb, Will Schroeder, June 27, 2001: https://github.com/InsightSoftwareConsortium/ITK/blob/699b66cb04d410e555656828e8892107add38ccb/Code/Common/itkMacro.h#L331-L337 --- include/itkHighPriorityRealTimeClock.h | 2 +- src/PerformanceBenchmarkingInformation.h.in | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/include/itkHighPriorityRealTimeClock.h b/include/itkHighPriorityRealTimeClock.h index 9ede344..62d62e5 100644 --- a/include/itkHighPriorityRealTimeClock.h +++ b/include/itkHighPriorityRealTimeClock.h @@ -46,7 +46,7 @@ class PerformanceBenchmarking_EXPORT HighPriorityRealTimeClock : public RealTime using ConstPointer = SmartPointer; /** Method for defining the name of the class */ - itkTypeMacro(HighPriorityRealTimeClock, RealTimeClock); + itkOverrideGetNameOfClassMacro(HighPriorityRealTimeClock); /** Method for creation through the object factory */ itkNewMacro(Self); diff --git a/src/PerformanceBenchmarkingInformation.h.in b/src/PerformanceBenchmarkingInformation.h.in index ccd473e..af6f167 100644 --- a/src/PerformanceBenchmarkingInformation.h.in +++ b/src/PerformanceBenchmarkingInformation.h.in @@ -82,7 +82,7 @@ public: using MapType = std::map; /** Run-time type information (and related methods). */ - itkTypeMacro(PerformanceBenchmarkingInformation, Object); + itkOverrideGetNameOfClassMacro(PerformanceBenchmarkingInformation); /** Returns the global instance */ static Pointer New(); From f11f139485e68d51cb81bb2d6b9624fe48abd1ab Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Sun, 26 Jan 2025 12:56:20 -0600 Subject: [PATCH 2/9] STYLE: CoordRepType -> CoordinateType code readability For the sake of code readability, a new 'CoordinateType' alias is added for each nested 'CoordRepType' alias. The old 'CoordRepType' aliases will still be available with ITK 6.0, but it is recommended to use 'CoordinateType' instead. The 'CoordRepType' aliases will be removed when 'ITK_FUTURE_LEGACY_REMOVE' is enabled. Similarly, 'InputCoordinateType', 'OutputCoordinateType', and 'ImagePointCoordinateType' replace 'InputCoordRepType', 'OutputCoordRepType', and 'ImagePointCoordRepType', respectively. --- examples/Filtering/ResampleBenchmark.cxx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/examples/Filtering/ResampleBenchmark.cxx b/examples/Filtering/ResampleBenchmark.cxx index ef99084..5e8961b 100644 --- a/examples/Filtering/ResampleBenchmark.cxx +++ b/examples/Filtering/ResampleBenchmark.cxx @@ -372,13 +372,13 @@ DefineInterpolator(typename InterpolatorType::Pointer & interpolator, { // Interpolator typedefs using InputImageType = typename InterpolatorType::InputImageType; - using CoordRepType = typename InterpolatorType::CoordRepType; - using CoefficientType = CoordRepType; + using CoordinateType = typename InterpolatorType::CoordinateType; + using CoefficientType = CoordinateType; // Typedefs for all interpolators - using NearestNeighborInterpolatorType = itk::NearestNeighborInterpolateImageFunction; - using LinearInterpolatorType = itk::LinearInterpolateImageFunction; - using BSplineInterpolatorType = itk::BSplineInterpolateImageFunction; + using NearestNeighborInterpolatorType = itk::NearestNeighborInterpolateImageFunction; + using LinearInterpolatorType = itk::LinearInterpolateImageFunction; + using BSplineInterpolatorType = itk::BSplineInterpolateImageFunction; if (interpolatorName == "Nearest") { @@ -402,10 +402,10 @@ DefineExtrapolator(typename ExtrapolatorType::Pointer & extrapolator, const std: { // Extrapolator typedefs using InputImageType = typename ExtrapolatorType::InputImageType; - using CoordRepType = typename ExtrapolatorType::CoordRepType; + using CoordinateType = typename ExtrapolatorType::CoordinateType; // Typedefs for all extrapolators - using NearestNeighborExtrapolatorType = itk::NearestNeighborExtrapolateImageFunction; + using NearestNeighborExtrapolatorType = itk::NearestNeighborExtrapolateImageFunction; if (extrapolatorName == "Nearest") { From c27456e7122a9649a2b9677136a561de99ea9f63 Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Mon, 27 Jan 2025 17:53:58 -0600 Subject: [PATCH 3/9] STYLE: Update to match clang-format-19 from ITK --- .clang-format | 251 +++++++++++++++--- include/PerformanceBenchmarkingUtilities.h | 2 +- include/jsonxx.h | 34 +-- src/PerformanceBenchmarkingInformation.cxx.in | 48 ++-- src/itkHighPriorityRealTimeClock.cxx | 10 +- 5 files changed, 250 insertions(+), 95 deletions(-) diff --git a/.clang-format b/.clang-format index 411b009..45b9502 100644 --- a/.clang-format +++ b/.clang-format @@ -1,4 +1,4 @@ -## This config file is only relevant for clang-format version 8.0.0 +## This config file is only relevant for clang-format version 19.1.4 ## ## Examples of each format style can be found on the in the clang-format documentation ## See: https://clang.llvm.org/docs/ClangFormatStyleOptions.html for details of each option @@ -10,142 +10,309 @@ ## maintaining a consistent code style. ## ## EXAMPLE apply code style enforcement before commit: -# Utilities/Maintenance/clang-format.bash --clang ${PATH_TO_CLANG_FORMAT_8.0.0} --modified +# Utilities/Maintenance/clang-format.bash --clang ${PATH_TO_CLANG_FORMAT_19.1.4} --modified ## EXAMPLE apply code style enforcement after commit: -# Utilities/Maintenance/clang-format.bash --clang ${PATH_TO_CLANG_FORMAT_8.0.0} --last +# Utilities/Maintenance/clang-format.bash --clang ${PATH_TO_CLANG_FORMAT_19.1.4} --last --- -# This configuration requires clang-format version 8.0.0 exactly. -BasedOnStyle: Mozilla +# This configuration requires clang-format version 19.1.4 exactly. Language: Cpp AccessModifierOffset: -2 AlignAfterOpenBracket: Align -AlignConsecutiveAssignments: false -AlignConsecutiveDeclarations: true -AlignEscapedNewlines: Right -AlignOperands: true -AlignTrailingComments: true -# clang 9.0 AllowAllArgumentsOnNextLine: true -# clang 9.0 AllowAllConstructorInitializersOnNextLine: true +AlignArrayOfStructures: None +AlignConsecutiveAssignments: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + AlignFunctionPointers: false + PadOperators: true +AlignConsecutiveBitFields: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + AlignFunctionPointers: false + PadOperators: false +AlignConsecutiveDeclarations: + Enabled: true + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + AlignFunctionPointers: false + PadOperators: true +AlignConsecutiveMacros: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + AlignFunctionPointers: false + PadOperators: false +AlignConsecutiveShortCaseStatements: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCaseArrows: false + AlignCaseColons: false +AlignConsecutiveTableGenBreakingDAGArgColons: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + AlignFunctionPointers: false + PadOperators: false +AlignConsecutiveTableGenCondOperatorColons: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + AlignFunctionPointers: false + PadOperators: false +AlignConsecutiveTableGenDefinitionColons: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + AlignFunctionPointers: false + PadOperators: false +AlignEscapedNewlines: Left +AlignOperands: Align +AlignTrailingComments: + Kind: Always + OverEmptyLines: 0 +AllowAllArgumentsOnNextLine: true AllowAllParametersOfDeclarationOnNextLine: false -AllowShortBlocksOnASingleLine: false +AllowBreakBeforeNoexceptSpecifier: Never +AllowShortBlocksOnASingleLine: Never +AllowShortCaseExpressionOnASingleLine: true AllowShortCaseLabelsOnASingleLine: false -AllowShortFunctionsOnASingleLine: Inline -# clang 9.0 AllowShortLambdasOnASingleLine: All -# clang 9.0 features AllowShortIfStatementsOnASingleLine: Never -AllowShortIfStatementsOnASingleLine: false +AllowShortCompoundRequirementOnASingleLine: true +AllowShortEnumsOnASingleLine: true +#AllowShortFunctionsOnASingleLine: Inline Only merge functions defined inside a class. Implies empty. +#AllowShortFunctionsOnASingleLine: None (in configuration: None) Never merge functions into a single line. +AllowShortFunctionsOnASingleLine: All +AllowShortIfStatementsOnASingleLine: Never +AllowShortLambdasOnASingleLine: All AllowShortLoopsOnASingleLine: false AlwaysBreakAfterDefinitionReturnType: None -AlwaysBreakAfterReturnType: All AlwaysBreakBeforeMultilineStrings: false -AlwaysBreakTemplateDeclarations: Yes +AttributeMacros: + - __capability BinPackArguments: false BinPackParameters: false -BreakBeforeBraces: Custom +BitFieldColonSpacing: Both BraceWrapping: - # clang 9.0 feature AfterCaseLabel: false + AfterCaseLabel: true AfterClass: true - AfterControlStatement: true + AfterControlStatement: Always AfterEnum: true + AfterExternBlock: true AfterFunction: true AfterNamespace: true AfterObjCDeclaration: true AfterStruct: true AfterUnion: true - AfterExternBlock: true BeforeCatch: true BeforeElse: true -## This is the big change from historical ITK formatting! -# Historically ITK used a style similar to https://en.wikipedia.org/wiki/Indentation_style#Whitesmiths_style -# with indented braces, and not indented code. This style is very difficult to automatically -# maintain with code beautification tools. Not indenting braces is more common among -# formatting tools. + BeforeLambdaBody: false + BeforeWhile: false IndentBraces: false SplitEmptyFunction: false SplitEmptyRecord: false SplitEmptyNamespace: false +BreakAdjacentStringLiterals: true +BreakAfterAttributes: Leave +BreakAfterJavaFieldAnnotations: false +BreakAfterReturnType: All +BreakArrays: true BreakBeforeBinaryOperators: None -#clang 6.0 BreakBeforeInheritanceComma: true -BreakInheritanceList: BeforeComma +BreakBeforeConceptDeclarations: Always +BreakBeforeBraces: Custom +BreakBeforeInlineASMColon: OnlyMultiline BreakBeforeTernaryOperators: true -#clang 6.0 BreakConstructorInitializersBeforeComma: true BreakConstructorInitializers: BeforeComma -BreakAfterJavaFieldAnnotations: false +BreakFunctionDefinitionParameters: false +BreakInheritanceList: BeforeComma BreakStringLiterals: true +BreakTemplateDeclarations: Yes ## The following line allows larger lines in non-documentation code ColumnLimit: 120 CommentPragmas: '^ IWYU pragma:' CompactNamespaces: false -ConstructorInitializerAllOnOneLineOrOnePerLine: false ConstructorInitializerIndentWidth: 2 ContinuationIndentWidth: 2 Cpp11BracedListStyle: false DerivePointerAlignment: false DisableFormat: false +EmptyLineAfterAccessModifier: Never +EmptyLineBeforeAccessModifier: LogicalBlock ExperimentalAutoDetectBinPacking: false FixNamespaceComments: true ForEachMacros: - foreach - Q_FOREACH - BOOST_FOREACH +IfMacros: + - KJ_IF_MAYBE IncludeBlocks: Preserve IncludeCategories: - Regex: '^"(llvm|llvm-c|clang|clang-c)/' Priority: 2 + SortPriority: 0 + CaseSensitive: false - Regex: '^(<|"(gtest|gmock|isl|json)/)' Priority: 3 + SortPriority: 0 + CaseSensitive: false - Regex: '.*' Priority: 1 + SortPriority: 0 + CaseSensitive: false IncludeIsMainRegex: '(Test)?$' +IncludeIsMainSourceRegex: '' +IndentAccessModifiers: false +IndentCaseBlocks: false IndentCaseLabels: true +IndentExternBlock: AfterExternBlock +IndentGotoLabels: true IndentPPDirectives: AfterHash +IndentRequiresClause: true IndentWidth: 2 IndentWrappedFunctionNames: false +InsertBraces: false +InsertNewlineAtEOF: false +InsertTrailingCommas: None +IntegerLiteralSeparator: + Binary: 0 + BinaryMinDigits: 0 + Decimal: 0 + DecimalMinDigits: 0 + Hex: 0 + HexMinDigits: 0 JavaScriptQuotes: Leave JavaScriptWrapImports: true -KeepEmptyLinesAtTheStartOfBlocks: true +KeepEmptyLines: + AtEndOfFile: false + AtStartOfBlock: true + AtStartOfFile: true +LambdaBodyIndentation: Signature +LineEnding: DeriveLF MacroBlockBegin: '' MacroBlockEnd: '' +MainIncludeChar: Quote MaxEmptyLinesToKeep: 2 NamespaceIndentation: None ObjCBinPackProtocolList: Auto ObjCBlockIndentWidth: 2 +ObjCBreakBeforeNestedBlockParam: true ObjCSpaceAfterProperty: true ObjCSpaceBeforeProtocolList: false +PackConstructorInitializers: BinPack PenaltyBreakAssignment: 2 PenaltyBreakBeforeFirstCallParameter: 19 PenaltyBreakComment: 300 ## The following line allows larger lines in non-documentation code PenaltyBreakFirstLessLess: 120 +PenaltyBreakOpenParenthesis: 0 +PenaltyBreakScopeResolution: 500 PenaltyBreakString: 1000 PenaltyBreakTemplateDeclaration: 10 PenaltyExcessCharacter: 1000000 +PenaltyIndentedWhitespace: 0 PenaltyReturnTypeOnItsOwnLine: 200 PointerAlignment: Middle +PPIndentWidth: -1 +QualifierAlignment: Custom +QualifierOrder: + - friend + - static + - inline + - constexpr + - const + - type +ReferenceAlignment: Pointer ReflowComments: true +RemoveBracesLLVM: false +RemoveParentheses: Leave +RemoveSemicolon: false +RequiresClausePosition: OwnLine +RequiresExpressionIndentation: OuterScope +SeparateDefinitionBlocks: Leave +ShortNamespaceLines: 1 +SkipMacroDefinitionBody: false # We may want to sort the includes as a separate pass -SortIncludes: false +SortIncludes: Never +SortJavaStaticImport: Before # We may want to revisit this later -SortUsingDeclarations: false +SortUsingDeclarations: Never SpaceAfterCStyleCast: false -# SpaceAfterLogicalNot: false +SpaceAfterLogicalNot: false SpaceAfterTemplateKeyword: true +SpaceAroundPointerQualifiers: Default SpaceBeforeAssignmentOperators: true +SpaceBeforeCaseColon: false SpaceBeforeCpp11BracedList: false SpaceBeforeCtorInitializerColon: true SpaceBeforeInheritanceColon: true +SpaceBeforeJsonColon: false SpaceBeforeParens: ControlStatements +SpaceBeforeParensOptions: + AfterControlStatements: true + AfterForeachMacros: true + AfterFunctionDefinitionName: false + AfterFunctionDeclarationName: false + AfterIfMacros: true + AfterOverloadedOperator: false + AfterPlacementOperator: true + AfterRequiresInClause: false + AfterRequiresInExpression: false + BeforeNonEmptyParentheses: false SpaceBeforeRangeBasedForLoopColon: true -SpaceInEmptyParentheses: false +SpaceBeforeSquareBrackets: false +SpaceInEmptyBlock: false SpacesBeforeTrailingComments: 1 -SpacesInAngles: false +SpacesInAngles: Never SpacesInContainerLiterals: false -SpacesInCStyleCastParentheses: false -SpacesInParentheses: false +SpacesInLineCommentPrefix: + Minimum: 1 + Maximum: -1 +SpacesInParens: Never +SpacesInParensOptions: + ExceptDoubleParentheses: false + InCStyleCasts: false + InConditionalStatements: false + InEmptyParentheses: false + Other: false SpacesInSquareBrackets: false -Standard: Cpp11 +Standard: Latest +StatementAttributeLikeMacros: + - Q_EMIT StatementMacros: - Q_UNUSED - QT_REQUIRE_VERSION + - ITK_GCC_PRAGMA_PUSH + - ITK_GCC_PRAGMA_POP + - ITK_GCC_SUPPRESS_Wfloat_equal + - ITK_GCC_SUPPRESS_Wformat_nonliteral + - ITK_GCC_SUPPRESS_Warray_bounds + - ITK_CLANG_PRAGMA_PUSH + - ITK_CLANG_PRAGMA_POP + - ITK_CLANG_SUPPRESS_Wzero_as_null_pointer_constant + - CLANG_PRAGMA_PUSH + - CLANG_PRAGMA_POP + - CLANG_SUPPRESS_Wfloat_equal + - INTEL_PRAGMA_WARN_PUSH + - INTEL_PRAGMA_WARN_POP + - INTEL_SUPPRESS_warning_1292 + - itkTemplateFloatingToIntegerMacro + - itkLegacyMacro +TableGenBreakInsideDAGArg: DontBreak TabWidth: 2 UseTab: Never +VerilogBreakBetweenInstancePorts: true +WhitespaceSensitiveMacros: + - BOOST_PP_STRINGIZE + - CF_SWIFT_NAME + - NS_SWIFT_NAME + - PP_STRINGIZE + - STRINGIZE ... diff --git a/include/PerformanceBenchmarkingUtilities.h b/include/PerformanceBenchmarkingUtilities.h index e3f8e40..480a870 100644 --- a/include/PerformanceBenchmarkingUtilities.h +++ b/include/PerformanceBenchmarkingUtilities.h @@ -25,7 +25,7 @@ PerformanceBenchmarking_EXPORT std::string PerfDateStamp(); PerformanceBenchmarking_EXPORT std::string - ReplaceOccurrence(std::string str, const std::string && findvalue, const std::string && replacevalue); +ReplaceOccurrence(std::string str, const std::string && findvalue, const std::string && replacevalue); PerformanceBenchmarking_EXPORT std::string DecorateWithBuildInformation(std::string inputJson); diff --git a/include/jsonxx.h b/include/jsonxx.h index 4b5a8ca..f70e369 100644 --- a/include/jsonxx.h +++ b/include/jsonxx.h @@ -35,19 +35,19 @@ #ifdef _MSC_VER // disable the C4127 warning if using VC, see https://stackoverflow.com/a/12042515 -# define JSONXX_ASSERT(...) \ - do \ - { \ - __pragma(warning(push)) __pragma(warning(disable : 4127)) if (jsonxx::Assertions) __pragma(warning(pop)) \ - jsonxx::assertion(__FILE__, __LINE__, #__VA_ARGS__, bool(__VA_ARGS__)); \ - __pragma(warning(push)) __pragma(warning(disable : 4127)) \ +# define JSONXX_ASSERT(...) \ + do \ + { \ + __pragma(warning(push)) __pragma(warning(disable : 4127)) if (jsonxx::Assertions) __pragma(warning(pop)) \ + jsonxx::assertion(__FILE__, __LINE__, #__VA_ARGS__, bool(__VA_ARGS__)); \ + __pragma(warning(push)) __pragma(warning(disable : 4127)) \ } while (0) __pragma(warning(pop)) #else -# define JSONXX_ASSERT(...) \ - do \ - { \ - if (jsonxx::Assertions) \ - jsonxx::assertion(__FILE__, __LINE__, #__VA_ARGS__, bool(__VA_ARGS__)); \ +# define JSONXX_ASSERT(...) \ + do \ + { \ + if (jsonxx::Assertions) \ + jsonxx::assertion(__FILE__, __LINE__, #__VA_ARGS__, bool(__VA_ARGS__)); \ } while (0) #endif @@ -316,12 +316,12 @@ class Value type_ = BOOL_; bool_value_ = b; } -#define local_number(TYPE) \ - void import(const TYPE & n) \ - { \ - reset(); \ - type_ = NUMBER_; \ - number_value_ = static_cast(n); \ +#define local_number(TYPE) \ + void import(const TYPE & n) \ + { \ + reset(); \ + type_ = NUMBER_; \ + number_value_ = static_cast(n); \ } local_number(char) local_number(int) local_number(long) local_number(long long) local_number(unsigned char) local_number(unsigned int) local_number(unsigned long) local_number(unsigned long long) local_number(float) diff --git a/src/PerformanceBenchmarkingInformation.cxx.in b/src/PerformanceBenchmarkingInformation.cxx.in index 78ea883..80aa30e 100644 --- a/src/PerformanceBenchmarkingInformation.cxx.in +++ b/src/PerformanceBenchmarkingInformation.cxx.in @@ -31,37 +31,32 @@ // Construct const versions via the emplace method. This macro simplifies the text // written in ITK/Modules/Core/Common/src/CMakeLists.txt. -#define MAKE_MAP_ENTRY(KEY, VALUE, DESCRIPTION ) \ -m_Map.emplace( \ - std::pair< MapKeyType, InformationValueType>( \ - MapKeyType{ KEY }, \ - InformationValueType{ MapValueType{ VALUE }, MapValueDescriptionType{ DESCRIPTION } } \ - ) \ -) +#define MAKE_MAP_ENTRY(KEY, VALUE, DESCRIPTION) \ + m_Map.emplace(std::pair( \ + MapKeyType{ KEY }, InformationValueType{ MapValueType{ VALUE }, MapValueDescriptionType{ DESCRIPTION } })) -namespace itk { +namespace itk +{ -std::mutex PerformanceBenchmarkingInformation::m_Mutex; +std::mutex PerformanceBenchmarkingInformation::m_Mutex; PerformanceBenchmarkingInformation::Pointer PerformanceBenchmarkingInformation::m_InformationInstance; PerformanceBenchmarkingInformation::MapType PerformanceBenchmarkingInformation::m_Map; PerformanceBenchmarkingInformation::Pointer -PerformanceBenchmarkingInformation -::New() +PerformanceBenchmarkingInformation ::New() { return Self::GetInstance(); } PerformanceBenchmarkingInformation::Pointer -PerformanceBenchmarkingInformation -::GetInstance() +PerformanceBenchmarkingInformation ::GetInstance() { std::lock_guard mutexHolder(m_Mutex); if (m_InformationInstance.IsNull()) { m_InformationInstance = ObjectFactory::Create(); { - new PerformanceBenchmarkingInformation(); //constructor sets m_InformationInstance + new PerformanceBenchmarkingInformation(); // constructor sets m_InformationInstance } } return m_InformationInstance; @@ -74,50 +69,49 @@ PerformanceBenchmarkingInformation::GetMap() } const PerformanceBenchmarkingInformation::MapValueType -PerformanceBenchmarkingInformation::GetValue(const MapKeyType &&key) +PerformanceBenchmarkingInformation::GetValue(const MapKeyType && key) { - const MapType &localMap = PerformanceBenchmarkingInformation::GetInstance()->GetMap(); + const MapType & localMap = PerformanceBenchmarkingInformation::GetInstance()->GetMap(); auto it = localMap.find(key); if (it != localMap.end()) { return it->second.m_Value; } - return {""}; + return { "" }; } const PerformanceBenchmarkingInformation::MapValueDescriptionType PerformanceBenchmarkingInformation::GetDescription(const MapKeyType && key) { - const MapType &localMap = PerformanceBenchmarkingInformation::GetInstance()->GetMap(); + const MapType & localMap = PerformanceBenchmarkingInformation::GetInstance()->GetMap(); auto it = localMap.find(key); if (it != localMap.end()) { return it->second.m_Description; } - return {""}; + return { "" }; } -const std::vector< PerformanceBenchmarkingInformation::MapKeyType > +const std::vector PerformanceBenchmarkingInformation::GetAllKeys() { - std::vector< PerformanceBenchmarkingInformation::MapKeyType > keyVector; + std::vector keyVector; keyVector.reserve(30); - for( auto elem : PerformanceBenchmarkingInformation::GetInstance()->m_Map ) + for (auto elem : PerformanceBenchmarkingInformation::GetInstance()->m_Map) { - keyVector.emplace_back( elem.first ); + keyVector.emplace_back(elem.first); } return keyVector; } -PerformanceBenchmarkingInformation -::PerformanceBenchmarkingInformation() +PerformanceBenchmarkingInformation ::PerformanceBenchmarkingInformation() { - m_InformationInstance = this; //threads need this + m_InformationInstance = this; // threads need this m_InformationInstance->UnRegister(); // Remove extra reference @MAPPING_VALUES@ } -} //end namespace itk +} // end namespace itk diff --git a/src/itkHighPriorityRealTimeClock.cxx b/src/itkHighPriorityRealTimeClock.cxx index 53df7c4..ec4f406 100644 --- a/src/itkHighPriorityRealTimeClock.cxx +++ b/src/itkHighPriorityRealTimeClock.cxx @@ -49,16 +49,10 @@ HighPriorityRealTimeClock ::DisplayErrorMessage() } -HighPriorityRealTimeClock ::HighPriorityRealTimeClock() -{ - this->RaisePriority(); -} +HighPriorityRealTimeClock ::HighPriorityRealTimeClock() { this->RaisePriority(); } -HighPriorityRealTimeClock ::~HighPriorityRealTimeClock() -{ - this->RestorePriority(); -} +HighPriorityRealTimeClock ::~HighPriorityRealTimeClock() { this->RestorePriority(); } void From f1e09fb6fbede9e73a41474ebe885bbe3d77c7b5 Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Mon, 27 Jan 2025 21:18:57 -0600 Subject: [PATCH 4/9] ENH: Update to support the clang-format-linter CI --- .github/workflows/clang-format-linter.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/clang-format-linter.yml b/.github/workflows/clang-format-linter.yml index 69166d9..c8e1681 100644 --- a/.github/workflows/clang-format-linter.yml +++ b/.github/workflows/clang-format-linter.yml @@ -7,7 +7,9 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v4 with: fetch-depth: 1 - uses: InsightSoftwareConsortium/ITKClangFormatLinterAction@master + with: + itk-branch: master From 4c8e5631683fcc6558eeca7e9887a2eadf7a2ca8 Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Tue, 28 Jan 2025 09:40:35 -0600 Subject: [PATCH 5/9] COMP: Update CI testing infrastructure. --- .github/workflows/build-test.yml | 34 ++++++++++++++++---------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/.github/workflows/build-test.yml b/.github/workflows/build-test.yml index e6db193..2a36f1d 100644 --- a/.github/workflows/build-test.yml +++ b/.github/workflows/build-test.yml @@ -8,31 +8,31 @@ jobs: strategy: max-parallel: 3 matrix: - os: [ubuntu-18.04, windows-2019, macos-10.15] + os: [ubuntu-24.04, windows-2022, macos-10.15] include: - - os: ubuntu-18.04 + - os: ubuntu-24.04 c-compiler: "gcc" cxx-compiler: "g++" - itk-git-tag: "d6acfd26bfcdec606d605beb1301bddfb17c05a6" + itk-git-tag: "v6.0a02" cmake-build-type: "MinSizeRel" - - os: windows-2019 + - os: windows-2022 c-compiler: "cl.exe" cxx-compiler: "cl.exe" - itk-git-tag: "d6acfd26bfcdec606d605beb1301bddfb17c05a6" + itk-git-tag: "v6.0a02" cmake-build-type: "Release" - os: macos-10.15 c-compiler: "clang" cxx-compiler: "clang++" - itk-git-tag: "d6acfd26bfcdec606d605beb1301bddfb17c05a6" + itk-git-tag: "v6.0a02" cmake-build-type: "MinSizeRel" steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v4 - - name: Set up Python 3.7 - uses: actions/setup-python@v1 + - name: Set up Python 3.12 + uses: actions/setup-python@v5 with: - python-version: 3.7 + python-version: 3.12 - name: Install build dependencies run: | @@ -40,7 +40,7 @@ jobs: python -m pip install ninja - name: Get specific version of CMake, Ninja - uses: lukka/get-cmake@v3.18.3 + uses: lukka/get-cmake@latest - name: Download ITK run: | @@ -50,7 +50,7 @@ jobs: git checkout ${{ matrix.itk-git-tag }} - name: Build ITK - if: matrix.os != 'windows-2019' + if: matrix.os != 'windows-2022' run: | cd .. mkdir ITK-build @@ -59,12 +59,12 @@ jobs: ninja - name: Build ITK - if: matrix.os == 'windows-2019' + if: matrix.os == 'windows-2022' run: | cd .. mkdir ITK-build cd ITK-build - call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvars64.bat" + call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat" cmake -DCMAKE_C_COMPILER:FILEPATH="${{ matrix.c-compiler }}" -DBUILD_SHARED_LIBS:BOOL=OFF -DCMAKE_CXX_COMPILER="${{ matrix.cxx-compiler }}" -DCMAKE_BUILD_TYPE:STRING=${{ matrix.cmake-build-type }} -DBUILD_TESTING:BOOL=OFF -GNinja ../ITK ninja shell: cmd @@ -118,13 +118,13 @@ jobs: cat dashboard.cmake - name: Build and test - if: matrix.os != 'windows-2019' + if: matrix.os != 'windows-2022' run: | ctest --output-on-failure -j 2 -V -S dashboard.cmake - name: Build and test - if: matrix.os == 'windows-2019' + if: matrix.os == 'windows-2022' run: | - call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvars64.bat" + call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat" ctest --output-on-failure -j 2 -VV -S dashboard.cmake shell: cmd From aadce2e42a4067c6195ace578a9786025e4f5c75 Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Tue, 28 Jan 2025 08:47:57 -0600 Subject: [PATCH 6/9] COMP: Remove compiler warnings --- src/PerformanceBenchmarkingInformation.cxx.in | 2 +- test/itkHighPriorityRealTimeProbeTest.cxx | 8 ++++++-- test/itkHighPriorityRealTimeProbesCollectorTest.cxx | 6 ++++-- test/itkTimeProbeTest2.cxx | 9 ++++++--- test/itkTimeProbesTest2.cxx | 6 ++++-- 5 files changed, 21 insertions(+), 10 deletions(-) diff --git a/src/PerformanceBenchmarkingInformation.cxx.in b/src/PerformanceBenchmarkingInformation.cxx.in index 80aa30e..2bee785 100644 --- a/src/PerformanceBenchmarkingInformation.cxx.in +++ b/src/PerformanceBenchmarkingInformation.cxx.in @@ -111,7 +111,7 @@ PerformanceBenchmarkingInformation ::PerformanceBenchmarkingInformation() m_InformationInstance = this; // threads need this m_InformationInstance->UnRegister(); // Remove extra reference - @MAPPING_VALUES@ + @MAPPING_VALUES @ } } // end namespace itk diff --git a/test/itkHighPriorityRealTimeProbeTest.cxx b/test/itkHighPriorityRealTimeProbeTest.cxx index 87fb428..f01df7a 100644 --- a/test/itkHighPriorityRealTimeProbeTest.cxx +++ b/test/itkHighPriorityRealTimeProbeTest.cxx @@ -67,13 +67,17 @@ itkHighPriorityRealTimeProbeTest(int, char *[]) // time a task localTimer.Start(); - double sum = 0.0; - for (unsigned int i = 0; i < 1e6; ++i) + double sum = 0.0; + constexpr unsigned int big_stopping_criteria = 1e6; + for (unsigned int i = 0; i < big_stopping_criteria; ++i) { sum += i; } localTimer.Stop(); + // Need to use the variable sum to ensure that it is not optimized away. + std::cout << " Time for simple addition summing loop with " << big_stopping_criteria + << " iterations: " << localTimer.GetMean() << " sum = (" << sum << ")\n"; } if (!CheckTimeProbe(localTimer)) diff --git a/test/itkHighPriorityRealTimeProbesCollectorTest.cxx b/test/itkHighPriorityRealTimeProbesCollectorTest.cxx index 4ebe345..a01390f 100644 --- a/test/itkHighPriorityRealTimeProbesCollectorTest.cxx +++ b/test/itkHighPriorityRealTimeProbesCollectorTest.cxx @@ -63,11 +63,13 @@ TestTransformPhysicalPointToIndex(T * image) for (int i = 0; i < 1000; i++) { point3D[0] = static_cast::ValueType>(i); - image->TransformPhysicalPointToIndex(point3D, index3D); + index3D = image->TransformPhysicalPointToIndex(point3D); } } if (k == 5) - std::cout << point3D << std::endl; + { + std::cout << point3D << " at " << index3D << std::endl; + } } } //------------------------- diff --git a/test/itkTimeProbeTest2.cxx b/test/itkTimeProbeTest2.cxx index 104a8ea..fac368b 100644 --- a/test/itkTimeProbeTest2.cxx +++ b/test/itkTimeProbeTest2.cxx @@ -69,13 +69,16 @@ itkTimeProbeTest2(int, char *[]) // time a task localTimer.Start(); - double sum = 0.0; - for (unsigned int i = 0; i < 1e6; ++i) + double sum = 0.0; + constexpr unsigned int big_stopping_criteria = 1e6; + for (unsigned int i = 0; i < big_stopping_criteria; ++i) { sum += i; } - localTimer.Stop(); + // Need to use the variable sum to ensure that it is not optimized away. + std::cout << " Time for simple addition summing loop with " << big_stopping_criteria + << " iterations: " << localTimer.GetMean() << " sum = (" << sum << ")\n"; } if (!CheckTimeProbe(localTimer)) diff --git a/test/itkTimeProbesTest2.cxx b/test/itkTimeProbesTest2.cxx index 43068a1..847031d 100644 --- a/test/itkTimeProbesTest2.cxx +++ b/test/itkTimeProbesTest2.cxx @@ -62,11 +62,13 @@ TestTransformPhysicalPointToIndex(T * image) for (int i = 0; i < 1000; i++) { point3D[0] = static_cast::ValueType>(i); - image->TransformPhysicalPointToIndex(point3D, index3D); + index3D = image->TransformPhysicalPointToIndex(point3D); } } if (k == 5) - std::cout << point3D << std::endl; + { + std::cout << point3D << " at " << index3D << std::endl; + } } } //------------------------- From 39204bbee2743debc49cbb4370815df680ede402 Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Tue, 28 Jan 2025 10:27:28 -0600 Subject: [PATCH 7/9] COMP: Fixed invalid refactoring of .h.in file. --- src/PerformanceBenchmarkingInformation.cxx.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PerformanceBenchmarkingInformation.cxx.in b/src/PerformanceBenchmarkingInformation.cxx.in index 2bee785..80aa30e 100644 --- a/src/PerformanceBenchmarkingInformation.cxx.in +++ b/src/PerformanceBenchmarkingInformation.cxx.in @@ -111,7 +111,7 @@ PerformanceBenchmarkingInformation ::PerformanceBenchmarkingInformation() m_InformationInstance = this; // threads need this m_InformationInstance->UnRegister(); // Remove extra reference - @MAPPING_VALUES @ + @MAPPING_VALUES@ } } // end namespace itk From 8f2fd1a895f0af1b2f38f5de141ab3e2ad214dfe Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Tue, 28 Jan 2025 10:23:29 -0600 Subject: [PATCH 8/9] COMP: Use modern project() invocations. --- CMakeLists.txt | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5bf84c4..a4baa17 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,9 @@ -cmake_minimum_required(VERSION 3.16.3) +cmake_minimum_required(VERSION 3.22.1) +# Need to set CMAKE_CXX_STANDARD, CMAKE_CXX_STANDARD_REQUIRED, CMAKE_CXX_EXTENSIONS +# before calling project to ensure that it is available globally within your CMake project. if(NOT CMAKE_CXX_STANDARD) - set(CMAKE_CXX_STANDARD 14) # Supported values are ``14``, ``17`` and ``20``. + set(CMAKE_CXX_STANDARD 17) # Supported values are ``14``, ``17`` and ``20``. endif() if(NOT CMAKE_CXX_STANDARD_REQUIRED) set(CMAKE_CXX_STANDARD_REQUIRED ON) @@ -10,9 +12,14 @@ if(NOT CMAKE_CXX_EXTENSIONS) set(CMAKE_CXX_EXTENSIONS OFF) endif() -## If building external to ITK, we need to capture -## required build setting from ITK prior to calling -## project() + +project(PerformanceBenchmarking + VERSION 0.9.0 + DESCRIPTION + "Real-world tests to benchmark ITK performance." + HOMEPAGE_URL "https://github.com/InsightSoftwareConsortium/ITKPerformanceBenchmarking" + LANGUAGES CXX C +) if(NOT ITK_SOURCE_DIR) find_package(ITK REQUIRED) list(APPEND CMAKE_MODULE_PATH ${ITK_CMAKE_DIR}) @@ -27,7 +34,6 @@ if(NOT ITK_SOURCE_DIR) endif() endforeach() - # Set a default build type if none was specified if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) message(STATUS "Setting build type to 'Release' as none was specified.") @@ -35,12 +41,7 @@ if(NOT ITK_SOURCE_DIR) # Set the possible values of build type for cmake-gui set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo") endif() - enable_language(C) - enable_language(CXX) endif() - -project(PerformanceBenchmarking) - set(PerformanceBenchmarking_LIBRARIES PerformanceBenchmarking) include_directories(${CMAKE_BINARY_DIR}) From 0544b8f42edaf112985e1d4c9c137c6a10260bb0 Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Tue, 28 Jan 2025 14:11:54 -0600 Subject: [PATCH 9/9] COMP: Syncronize with cookie cutter recommendations --- ...{build-test.yml => build-test-package.yml} | 14 ++- CMakeLists.txt | 11 +-- README.md | 90 +++++++++++++++++++ README.rst | 7 +- examples/CMakeLists.txt | 10 ++- itk-module.cmake | 8 +- src/CMakeLists.txt | 4 +- 7 files changed, 128 insertions(+), 16 deletions(-) rename .github/workflows/{build-test.yml => build-test-package.yml} (96%) create mode 100644 README.md diff --git a/.github/workflows/build-test.yml b/.github/workflows/build-test-package.yml similarity index 96% rename from .github/workflows/build-test.yml rename to .github/workflows/build-test-package.yml index 2a36f1d..9f846aa 100644 --- a/.github/workflows/build-test.yml +++ b/.github/workflows/build-test-package.yml @@ -1,9 +1,17 @@ name: Build, test, package -on: [push,pull_request] +on: + push: + branches: + - main + tags: + - 'v*' + pull_request: + branches: + - main jobs: - build-test-cxx: + cxx-build-workflow: runs-on: ${{ matrix.os }} strategy: max-parallel: 3 @@ -40,7 +48,7 @@ jobs: python -m pip install ninja - name: Get specific version of CMake, Ninja - uses: lukka/get-cmake@latest + uses: lukka/get-cmake@3.31.5 - name: Download ITK run: | diff --git a/CMakeLists.txt b/CMakeLists.txt index a4baa17..3ee999f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,6 +20,9 @@ project(PerformanceBenchmarking HOMEPAGE_URL "https://github.com/InsightSoftwareConsortium/ITKPerformanceBenchmarking" LANGUAGES CXX C ) + +set(PerformanceBenchmarking_LIBRARIES PerformanceBenchmarking) + if(NOT ITK_SOURCE_DIR) find_package(ITK REQUIRED) list(APPEND CMAKE_MODULE_PATH ${ITK_CMAKE_DIR}) @@ -41,14 +44,12 @@ if(NOT ITK_SOURCE_DIR) # Set the possible values of build type for cmake-gui set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo") endif() -endif() -set(PerformanceBenchmarking_LIBRARIES PerformanceBenchmarking) -include_directories(${CMAKE_BINARY_DIR}) -if(NOT ITK_SOURCE_DIR) include(ITKModuleExternal) else() set(ITK_DIR ${CMAKE_BINARY_DIR}) itk_module_impl() endif() -add_subdirectory(examples) + +itk_module_examples() # This builds the src directory +add_subdirectory(examples) # this builds each of the itk benchmark domains diff --git a/README.md b/README.md new file mode 100644 index 0000000..7dbb467 --- /dev/null +++ b/README.md @@ -0,0 +1,90 @@ +# PerformanceBenchmarking + +image:: https://github.com/InsightSoftwareConsortium/ITKPerformanceBenchmarking/workflows/Build,%20test,%20package/badge.svg + +[![Build Status](https://github.com/InsightSoftwareConsortium/PerformanceBenchmarking/actions/workflows/build-test-package.yml/badge.svg)](https://github.com/InsightSoftwareConsortium/PerformanceBenchmarking/actions/workflows/build-test-package.yml) + +[![PyPI Version](https://img.shields.io/pypi/v/itk-PerformanceBenchmarking.svg)](https://pypi.python.org/pypi/itk-PerformanceBenchmarking) + +[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://github.com/InsightSoftwareConsortium/PerformanceBenchmarking/blob/main/LICENSE) + +## Overview + +Real-world tests to benchmark ITK performance. + +New classes increase operating system process priority to +minimize the impact of other processes running on the system. + +These classes are used by a suite of example ITK benchmarks to quantify toolkit +performance. + +For more information, see:: + +```txt + McCormick M., Kang H.J., Barre S. + Performance Benchmarking the Insight Toolkit + The Insight Journal. January-December. 2016. + https://hdl.handle.net/10380/3557 + https://insight-journal.org/browse/publication/972 +``` + +Since ITK 4.11.0, this module is available in the ITK source tree as a Remote +module. To enable it, set:: + + Module_PerformanceBenchmarking:BOOL=ON + +in ITK's CMake build configuration. + +Requirements +------------ +- `CMake `_ +- `Ninja `_ +- `Python `_ + +Notes for running the benchmarks +-------------------------------- + +An example to call the benchmarking script is:: + + $ python ./evaluate-itk-performance.py run -g {ITK-version} {ITK-source} {ITK-build} {ITKPerformanceBenchmarking-build} + +where ``{ITK-version}`` is the ITK version that the user wishes to evaluate. + +Also, note that the ITK source folder ``(ITK-source}``, where the specific +version is fetched, needs to exist. + +The generated/result ``JSON`` files are placed in:: + + ./{ITKPerformanceBenchmarking-build}/BenchmarkResults/{machine-name} + + +Notes for benchmarking in Windows +--------------------------------- + +**CMake** and **Ninja** need to be in the ``PATH``. Also, the **C++ compiler** +has to be in the ``PATH`` so that Ninja can find it. + +For the Microsoft Visual Studio compiler, the C++ compiler is a file that is +usually under:: + + C:/Program Files/Microsoft Visual Studio {version}/VC/bin/cl.exe + +The user will need to change the path to the *vcvars\*.bat* command file in the +`RunWithVisualStudio.cmd `_ command line script to the specific location of their +*vcvars* file, e.g.:: + + C:/Program Files/Microsoft Visual Studio {version}/VC/vcvarsall.bat + +Finally, the user will need to start the Git bash by double-clicking on the +``RunWithVisualStudio.cmd`` script. + +Note that the module is built with static libraries to allow for ITK +benchmarking in Windows: the ``BUILD_SHARED_LIBS`` flag in the +`evaluate-itk-performance.py `_ script is set to `OFF`. + + +License +------- + +This software is distributed under the Apache 2.0 license. Please see +the *LICENSE* file for details. diff --git a/README.rst b/README.rst index e9c41de..79d9034 100644 --- a/README.rst +++ b/README.rst @@ -1,7 +1,6 @@ ITKPerformanceBenchmarking -========================== -.. image:: https://github.com/InsightSoftwareConsortium/ITKPerformanceBenchmarking/workflows/Build,%20test,%20package/badge.svg +image:: https://github.com/InsightSoftwareConsortium/ITKPerformanceBenchmarking/workflows/Build,%20test,%20package/badge.svg Real-world tests to benchmark ITK performance. @@ -11,13 +10,15 @@ minimize the impact of other processes running on the system. These classes are used by a suite of example ITK benchmarks to quantify toolkit performance. -For more information, see the `Insight Journal article `_:: +For more information, see:: +```txt McCormick M., Kang H.J., Barre S. Performance Benchmarking the Insight Toolkit The Insight Journal. January-December. 2016. https://hdl.handle.net/10380/3557 https://insight-journal.org/browse/publication/972 +``` Since ITK 4.11.0, this module is available in the ITK source tree as a Remote module. To enable it, set:: diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index fb45bad..7cbed82 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,5 +1,11 @@ -cmake_minimum_required(VERSION 3.10.2) -project(ITKBenchmarks NONE) +cmake_minimum_required(VERSION 3.22.1) +project(ITKBenchmarks + VERSION 0.9.0 + DESCRIPTION + "Benchmarks performance." + HOMEPAGE_URL "https://github.com/InsightSoftwareConsortium/ITKPerformanceBenchmarking" + LANGUAGES CXX C +) set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/CMake ${CMAKE_MODULE_PATH}) include(ITKBenchmarksExternalData) diff --git a/itk-module.cmake b/itk-module.cmake index fce496c..c250701 100644 --- a/itk-module.cmake +++ b/itk-module.cmake @@ -1,4 +1,10 @@ -set(DOCUMENTATION "New classes increase operating system process priority to +# the top-level README is used for describing this module, just +# re-used it for documentation here +get_filename_component(MY_CURRENT_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) +file(READ "${MY_CURRENT_DIR}/README.md" DOCUMENTATION) + +set(DOCUMENTATION + "New classes increase operating system process priority to minimize the impact of other processes running on the system. These classes are used by a used by a suite of example ITK benchmarks to diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 42f1005..aee7ed4 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -53,7 +53,7 @@ set(MAPPING_VALUES " ") configure_file(PerformanceBenchmarkingInformation.cxx.in ${CMAKE_BINARY_DIR}/PerformanceBenchmarkingInformation.cxx) -configure_file(PerformanceBenchmarkingInformation.h.in ${CMAKE_BINARY_DIR}/PerformanceBenchmarkingInformation.h) +configure_file(PerformanceBenchmarkingInformation.h.in ${CMAKE_BINARY_DIR}/include/PerformanceBenchmarkingInformation.h) set( PerformanceBenchmarking_SRCS jsonxx.cc ## MIT License https://github.com/hjiang/jsonxx @@ -62,7 +62,7 @@ set( PerformanceBenchmarking_SRCS itkHighPriorityRealTimeProbe.cxx itkHighPriorityRealTimeProbesCollector.cxx PerformanceBenchmarkingUtilities.cxx - ${CMAKE_BINARY_DIR}/PerformanceBenchmarkingInformation.h) + ${CMAKE_BINARY_DIR}/include/PerformanceBenchmarkingInformation.h) if(MSVC) add_definitions(-D_CRT_SECURE_NO_WARNINGS)