Skip to content

Commit

Permalink
- added intel tbb and pugiXML to the CMake-Configuration of the cpp-r…
Browse files Browse the repository at this point in the history
…untime

- fixed the old tbb-code for HPCOM
- changed hpcom-default-scheduler to the level-scheduler
- extended the testsuite for hpcom with some tests for tbb and levelfix-scheduling
- evaluateConditions is calling evaluateAll now in generated C++ Code

git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@23766 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
Marcus Walther committed Dec 12, 2014
1 parent 01058b1 commit 87cef19
Show file tree
Hide file tree
Showing 10 changed files with 464 additions and 124 deletions.
1 change: 0 additions & 1 deletion Compiler/BackEnd/HpcOmScheduler.mo
Expand Up @@ -2393,7 +2393,6 @@ algorithm
//print("-> NodeMark: " + intString(nodeMark) + "\n");
//print("ISccSimEqMapping-Length: " + intString(arrayLength(iSccSimEqMapping)) + "\n");
simEqIdc := List.map(List.map1(components,getSimEqSysIdxForComp,iSccSimEqMapping), List.last);
simEqIdc := listReverse(simEqIdc);
task := HpcOmSimCode.CALCTASK(-1,nodeIdx,-1.0,-1.0,-1,simEqIdc);
nodeLevelMap := (task,nodeMark,iNodeDependenciesT)::nodeLevelMap;
oNodeInfo := ((nodeIdx+1,nodeLevelMap));
Expand Down
11 changes: 2 additions & 9 deletions Compiler/Template/CodegenCpp.tpl
Expand Up @@ -2253,7 +2253,7 @@ case "gcc" then
DLLEXT=<%makefileParams.dllext%>
CFLAGS_BASED_ON_INIT_FILE=<%extraCflags%>
CFLAGS=$(CFLAGS_BASED_ON_INIT_FILE) -Winvalid-pch $(SYSTEM_CFLAGS) -I"<%makefileParams.omhome%>/include/omc/cpp/Core" -I"<%makefileParams.omhome%>/include/omc/cpp/" -I. <%makefileParams.includes%> -I"$(BOOST_INCLUDE)" -I"$(SUITESPARSE_INCLUDE)" <%makefileParams.includes ; separator=" "%> <%match sopt case SOME(s as SIMULATION_SETTINGS(__)) then s.cflags %> <%additionalCFlags_GCC%>
LDSYTEMFLAGS=-L"<%makefileParams.omhome%>/lib/omc/cpp" $(BASE_LIB) -lOMCppOMCFactory -lOMCppSystem -lOMCppModelicaUtilities -lOMCppMath <%timeMeasureLink%> -L"$(BOOST_LIBS)" $(BOOST_SYSTEM_LIB) $(BOOST_FILESYSTEM_LIB) $(BOOST_PROGRAM_OPTIONS_LIB) $(BOOST_LOG_LIB) $(BOOST_THREAD_LIB) $(LINUX_LIB_DL)
LDSYTEMFLAGS=-L"<%makefileParams.omhome%>/lib/omc/cpp" $(BASE_LIB) -lOMCppOMCFactory -lOMCppSystem -lOMCppModelicaUtilities -lOMCppMath <%additionalLinkerFlags_GCC%> <%timeMeasureLink%> -L"$(BOOST_LIBS)" $(BOOST_SYSTEM_LIB) $(BOOST_FILESYSTEM_LIB) $(BOOST_PROGRAM_OPTIONS_LIB) $(BOOST_LOG_LIB) $(BOOST_THREAD_LIB) $(LINUX_LIB_DL)
LDMAINFLAGS=-L"<%makefileParams.omhome%>/lib/omc/cpp" -L"<%makefileParams.omhome%>/bin" -lOMCppOMCFactory -L"$(BOOST_LIBS)" $(BOOST_SYSTEM_LIB) $(BOOST_FILESYSTEM_LIB) $(BOOST_PROGRAM_OPTIONS_LIB) $(LINUX_LIB_DL) <%additionalLinkerFlags_GCC%> <%timeMeasureLink%> $(BOOST_THREAD_LIB) $(BOOST_LOG_LIB)
CPPFLAGS = $(CFLAGS)
SYSTEMFILE=OMCpp<%fileNamePrefix%><% if acceptMetaModelicaGrammar() then ".conv"%>.cpp
Expand Down Expand Up @@ -12536,14 +12536,7 @@ template createEvaluateConditions( list<SimEqSystem> allEquationsPlusWhen,list<S
<<
bool <%className%>::evaluateConditions(const UPDATETYPE command)
{
//the same as evaluateAll at the moment
bool state_var_reinitialized = false;
<%varDecls%>
/* Evaluate Equations*/
<%equation_all_func_calls%>
/* Reinits */
<%reinit%>
return state_var_reinitialized;
return evaluateAll(command);
}
>>
end createEvaluateConditions;
Expand Down
171 changes: 90 additions & 81 deletions Compiler/Template/CodegenCppHpcom.tpl
Expand Up @@ -81,26 +81,28 @@ template generateAdditionalIncludes(SimCode simCode ,Text& extraFuncs,Text& extr
match simCode
case SIMCODE(__) then
<<
#ifdef ANALYZATION_MODE
#include <boost/shared_ptr.hpp>
#include <boost/weak_ptr.hpp>
#include <boost/numeric/ublas/vector.hpp>
#include <boost/numeric/ublas/matrix.hpp>
#include <string>
#include <vector>
#include <map>
using std::string;
using std::vector;
using std::map;
#include <SimCoreFactory/Policies/FactoryConfig.h>
#include <SimController/ISimController.h>
#include <System/IMixedSystem.h>

#include <boost/numeric/ublas/matrix_sparse.hpp>
typedef uBlas::compressed_matrix<double, uBlas::column_major, 0, uBlas::unbounded_array<int>, uBlas::unbounded_array<double> > SparseMatrix;
#endif
<%generateHpcomSpecificIncludes(simCode ,extraFuncs ,extraFuncsDecl, extraFuncsNamespace)%>
>>
#ifdef ANALYZATION_MODE
#include <boost/shared_ptr.hpp>
#include <boost/weak_ptr.hpp>
#include <boost/numeric/ublas/vector.hpp>
#include <boost/numeric/ublas/matrix.hpp>
#include <string>
#include <vector>
#include <map>

using std::string;
using std::vector;
using std::map;

#include <SimCoreFactory/Policies/FactoryConfig.h>
#include <SimController/ISimController.h>
#include <System/IMixedSystem.h>

#include <boost/numeric/ublas/matrix_sparse.hpp>
typedef uBlas::compressed_matrix<double, uBlas::column_major, 0, uBlas::unbounded_array<int>, uBlas::unbounded_array<double> > SparseMatrix;
#endif
<%generateHpcomSpecificIncludes(simCode ,extraFuncs ,extraFuncsDecl, extraFuncsNamespace)%>
>>
end generateAdditionalIncludes;


Expand Down Expand Up @@ -133,7 +135,11 @@ template generateAdditionalProtectedMemberDeclaration(SimCode simCode ,Text& ext
>>
case ("mpi") then
<<
//MF Todo: Delete for mpi.
return -1; //not supported
>>
case ("tbb") then
<<
return -1; //not supported
>>
else
<<
Expand Down Expand Up @@ -171,10 +177,11 @@ template getAddHpcomStructHeaders(Option<Schedule> hpcOmScheduleOpt)
>>
case ("tbb") then
<<
struct VoidBody {
//Required for Intel TBB
struct VoidFunctionBody {
boost::function<void(void)> void_function;
VoidBody(boost::function<void(void)> void_function) : void_function(void_function) { }
void operator()( tbb::flow::continue_msg ) const
VoidFunctionBody(boost::function<void(void)> void_function) : void_function(void_function) { }
FORCE_INLINE void operator()( tbb::flow::continue_msg ) const
{
void_function();
}
Expand Down Expand Up @@ -292,7 +299,9 @@ template getAddHpcomVarHeaders(Option<Schedule> hpcOmScheduleOpt)
<< >>
case ("tbb") then
<<
tbb::flow::graph tbb_graph;
tbb::flow::graph _tbbGraph;
tbb::flow::broadcast_node<tbb::flow::continue_msg> _tbbStartNode;
std::vector<tbb::flow::continue_node<tbb::flow::continue_msg>* > _tbbNodeList;
>>
else ""
end match
Expand Down Expand Up @@ -521,6 +530,15 @@ template getHpcomMemberVariableDefinition(Option<Schedule> hpcOmScheduleOpt)
,<%initializeBarrierByName("levelBarrier","",getConfigInt(NUM_PROC),type)%>
>>
else ""
case SOME(hpcOmSchedule as TASKDEPSCHEDULE(__)) then
match type
case ("tbb") then
<<
,_tbbGraph()
,_tbbStartNode(_tbbGraph)
,_tbbNodeList(<%listLength(hpcOmSchedule.tasks)%>,NULL)
>>
else ""
end match
else ""
end match
Expand Down Expand Up @@ -586,6 +604,14 @@ template getHpcomConstructorExtension(Option<Schedule> hpcOmScheduleOpt, String
<%threadFuncs%>
>>
end match
case SOME(hpcOmSchedule as TASKDEPSCHEDULE(__)) then
match type
case ("tbb") then
let tbbVars = generateTbbConstructorExtension(hpcOmSchedule.tasks, modelNamePrefixStr)
<<
<%tbbVars%>
>>
else ""
else ""
end match
end getHpcomConstructorExtension;
Expand Down Expand Up @@ -629,6 +655,14 @@ template getHpcomDestructorExtension(Option<Schedule> hpcOmScheduleOpt)
<%destroylocks%>
<%destroyThreads%>
>>
case SOME(hpcOmSchedule as TASKDEPSCHEDULE(__)) then
match type
case ("tbb") then
<<
for(std::vector<tbb::flow::continue_node<tbb::flow::continue_msg>* >::iterator it = _tbbNodeList.begin(); it != _tbbNodeList.end(); it++)
delete *it;
>>
else ""
else ""
end match
end getHpcomDestructorExtension;
Expand All @@ -642,38 +676,18 @@ template update(list<SimEqSystem> allEquationsPlusWhen, list<SimWhenClause> when
case SIMCODE(modelInfo = MODELINFO(__)) then
let parCode = update2(allEquationsPlusWhen, odeEquations, modelInfo.name, whenClauses, simCode ,extraFuncs ,extraFuncsDecl, extraFuncsNamespace, hpcOmSchedule, context, lastIdentOfPath(modelInfo.name), useFlatArrayNotation)
<<
<%equationFunctions(allEquations,whenClauses,simCode ,extraFuncs ,extraFuncsDecl, extraFuncsNamespace,contextSimulationDiscrete,useFlatArrayNotation,false)%>
<%equationFunctions(allEquations,whenClauses,simCode ,&extraFuncs ,&extraFuncsDecl, extraFuncsNamespace,contextSimulationDiscrete,useFlatArrayNotation,false)%>

<%createEvaluateAll(allEquations,whenClauses,simCode ,extraFuncs ,extraFuncsDecl, extraFuncsNamespace,contextOther,useFlatArrayNotation, boolNot(stringEq(getConfigString(PROFILING_LEVEL),"none")))%>
<%createEvaluateAll(allEquations,whenClauses,simCode ,&extraFuncs ,&extraFuncsDecl, extraFuncsNamespace,contextOther,useFlatArrayNotation, boolNot(stringEq(getConfigString(PROFILING_LEVEL),"none")))%>

<%createEvaluateZeroFuncs(equationsForZeroCrossings,simCode ,extraFuncs ,extraFuncsDecl, extraFuncsNamespace,contextOther) %>
<%createEvaluateZeroFuncs(equationsForZeroCrossings,simCode ,&extraFuncs ,&extraFuncsDecl, extraFuncsNamespace,contextOther) %>

<%createEvaluateConditions(simCode ,extraFuncs ,extraFuncsDecl, extraFuncsNamespace, allEquationsPlusWhen, whenClauses, modelInfo.name, context, useFlatArrayNotation)%>
<%createEvaluateConditions(allEquations,whenClauses,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace,contextOther,useFlatArrayNotation)%>
<%parCode%>
>>
end match
end update;


template createEvaluateConditions(SimCode simCode ,Text& extraFuncs,Text& extraFuncsDecl,Text extraFuncsNamespace, list<SimEqSystem> allEquationsPlusWhen, list<SimWhenClause> whenClauses, Absyn.Path name, Context context, Boolean useFlatArrayNotation)
::=
match simCode
case SIMCODE(__) then
let &varDecls = buffer "" /*BUFD*/
let eqs = equationsForConditions |> eq => equation_function_call(eq,contextSimulationNonDiscrete,&varDecls, simCode ,extraFuncs ,extraFuncsDecl, extraFuncsNamespace,"evaluate"); separator="\n"
let reinit = (whenClauses |> when hasindex i0 => genreinits(when, &varDecls,i0,simCode ,extraFuncs ,extraFuncsDecl, extraFuncsNamespace,context,useFlatArrayNotation) ;separator="\n";empty)
<<
bool <%lastIdentOfPath(name)%>::evaluateConditions(const UPDATETYPE command)
{
bool state_var_reinitialized = false;
//length: <%listLength(equationsForConditions)%>
<%eqs%>
<%reinit%>
return state_var_reinitialized;
}
>>
end createEvaluateConditions;

template update2(list<SimEqSystem> allEquationsPlusWhen, list<list<SimEqSystem>> odeEquations, Absyn.Path name,
list<SimWhenClause> whenClauses, SimCode simCode ,Text& extraFuncs,Text& extraFuncsDecl,Text extraFuncsNamespace, Option<Schedule> hpcOmScheduleOpt, Context context,
String modelNamePrefixStr, Boolean useFlatArrayNotation)
Expand Down Expand Up @@ -821,7 +835,7 @@ template update2(list<SimEqSystem> allEquationsPlusWhen, list<list<SimEqSystem>>
}
>>
case ("tbb") then
let taskNodes = function_HPCOM_TaskDep_tbb(hpcOmSchedule.tasks, allEquationsPlusWhen, type, name, &varDecls, simCode ,extraFuncs ,extraFuncsDecl, extraFuncsNamespace, useFlatArrayNotation); separator="\n"

let taskFuncs = function_HPCOM_TaskDep_voidfunc(hpcOmSchedule.tasks, allEquationsPlusWhen,type, name, &varDecls, simCode ,extraFuncs ,extraFuncsDecl, extraFuncsNamespace, useFlatArrayNotation); separator="\n"
<<
//using type: <%type%>
Expand All @@ -830,10 +844,10 @@ template update2(list<SimEqSystem> allEquationsPlusWhen, list<list<SimEqSystem>>

<%functionHead%>
{
using namespace tbb::flow;
// Declaration of nodes and edges
<%taskNodes%>
//Start
_tbbStartNode.try_put(tbb::flow::continue_msg());
_tbbGraph.wait_for_all();
//End
}
>>
else ""
Expand Down Expand Up @@ -1011,22 +1025,29 @@ template function_HPCOM_TaskDep0(tuple<Task,list<Integer>> taskIn, list<SimEqSys
end match
end function_HPCOM_TaskDep0;

template function_HPCOM_TaskDep_tbb(list<tuple<Task,list<Integer>>> tasks, list<SimEqSystem> allEquationsPlusWhen, String iType,
Absyn.Path name, Text &varDecls, SimCode simCode ,Text& extraFuncs,Text& extraFuncsDecl,Text extraFuncsNamespace, Boolean useFlatArrayNotation)
template generateTbbConstructorExtension(list<tuple<Task,list<Integer>>> tasks, String modelNamePrefixStr)
::=
let noteEqs = tasks |> t => function_HPCOM_TaskDep_tbb0(t,allEquationsPlusWhen, iType, name, &varDecls, simCode ,extraFuncs ,extraFuncsDecl, extraFuncsNamespace); separator="\n"
let nodesAndEdges = tasks |> t hasindex i fromindex 0 => generateTbbConstructorExtensionNodesAndEdges(t,i,modelNamePrefixStr); separator="\n"
<<
//Init base node
broadcast_node< continue_msg > tbb_start(tbb_graph);

<%noteEqs%>

//Start
tbb_start.try_put(continue_msg());
tbb_graph.wait_for_all();
//End
tbb::flow::continue_node<tbb::flow::continue_msg> *tbb_task;
<%nodesAndEdges%>
>>
end function_HPCOM_TaskDep_tbb;
end generateTbbConstructorExtension;

template generateTbbConstructorExtensionNodesAndEdges(tuple<Task,list<Integer>> taskIn, Integer taskIndex, String modelNamePrefixStr)
::=
match taskIn
case ((task as CALCTASK(__),parents)) then
let parentEdges = parents |> p => 'tbb::flow::make_edge(*(_tbbNodeList.at(<%intSub(p,1)%>)),*(_tbbNodeList.at(<%taskIndex%>)));'; separator = "\n"
let startNodeEdge = if intEq(0, listLength(parents)) then 'tbb::flow::make_edge(_tbbStartNode,*(_tbbNodeList.at(<%taskIndex%>)));' else ""
<<
tbb_task = new tbb::flow::continue_node<tbb::flow::continue_msg>(_tbbGraph,VoidFunctionBody(boost::bind<void>(&<%modelNamePrefixStr%>::task_func_<%task.index%>,this)));
_tbbNodeList.at(<%taskIndex%>) = tbb_task;
<%parentEdges%>
<%startNodeEdge%>
>>
end match
end generateTbbConstructorExtensionNodesAndEdges;

template function_HPCOM_TaskDep_voidfunc(list<tuple<Task,list<Integer>>> tasks, list<SimEqSystem> allEquationsPlusWhen,
String iType, Absyn.Path name, Text &varDecls, SimCode simCode ,Text& extraFuncs,Text& extraFuncsDecl,Text extraFuncsNamespace, Boolean useFlatArrayNotation)
Expand All @@ -1037,19 +1058,6 @@ template function_HPCOM_TaskDep_voidfunc(list<tuple<Task,list<Integer>>> tasks,
>>
end function_HPCOM_TaskDep_voidfunc;

template function_HPCOM_TaskDep_tbb0(tuple<Task,list<Integer>> taskIn, list<SimEqSystem> allEquationsPlusWhen, String iType,
Absyn.Path name, Text &varDecls, SimCode simCode ,Text& extraFuncs,Text& extraFuncsDecl,Text extraFuncsNamespace)
::=
match taskIn
case ((task as CALCTASK(__),parents)) then
let parentEdges = parents |> p => 'make_edge(tbb_task_<%p%>,tbb_task_<%task.index%>);'; separator = "\n"
<<
continue_node < continue_msg > tbb_task_<%task.index%>(tbb_graph,VoidBody(boost::bind<void>(&<%lastIdentOfPath(name)%>::task_func_<%task.index%>,this)));
<%parentEdges%>
>>
end match
end function_HPCOM_TaskDep_tbb0;

template function_HPCOM_TaskDep_voidfunc0(tuple<Task,list<Integer>> taskIn, list<SimEqSystem> allEquationsPlusWhen, String iType, Absyn.Path name, Text &varDecls, SimCode simCode ,Text& extraFuncs,Text& extraFuncsDecl,Text extraFuncsNamespace, Boolean useFlatArrayNotation)
::=
match taskIn
Expand Down Expand Up @@ -1681,15 +1689,16 @@ template simulationMakefile(String target, SimCode simCode ,Text& extraFuncs,Tex
let &additionalCFlags_GCC = buffer ""
let &additionalCFlags_GCC += if stringEq(type,"openmp") then " -fopenmp" else ""
let &additionalCFlags_GCC += if stringEq(type,"tbb") then ' -I"$(INTEL_TBB_INCLUDE)"' else ""
let &additionalCFlags_GCC += if Flags.isSet(Flags.HPCOM_ANALYZATION_MODE) then ' -D ANALYZATION_MODE -I"$(SUNDIALS_INCLUDE)" -I"$(SUNDIALS_INCLUDE)/kinsol" -I"$(SUNDIALS_INCLUDE)/nvector"' else ""
let &additionalCFlags_MSVC = buffer ""
let &additionalCFlags_MSVC += if stringEq(type,"openmp") then "/openmp" else ""
let &additionalCFlags_MSVC += if Flags.isSet(Flags.HPCOM_ANALYZATION_MODE) then '/DANALYZATION_MODE /I"$(SUNDIALS_INCLUDE)" /I"$(SUNDIALS_INCLUDE)/kinsol" /I"$(SUNDIALS_INCLUDE)/nvector"' else ""
let &additionalLinkerFlags_GCC = buffer ""
let &additionalLinkerFlags_GCC += if stringEq(type,"tbb") then " $(INTEL_TBB_LIBS) " else ""
let &additionalLinkerFlags_GCC += if Flags.isSet(Flags.HPCOM_ANALYZATION_MODE) then '$(LIBOMCPPOMCFACTORY) $(LIBOMCPPSIMCONTROLLER) $(LIBOMCPPSIMULATIONSETTINGS) $(LIBOMCPPSYSTEM) $(LIBOMCPPDATAEXCHANGE) $(LIBOMCPPNEWTON) $(LIBOMCPPUMFPACK) $(LIBOMCPPKINSOL) $(LIBOMCPPCVODE) $(LIBOMCPPSOLVER) $(LIBOMCPPMATH) $(LIBOMCPPMODELICAUTILITIES) $(SUNDIALS_LIBS) $(LAPACK_LIBS) $(BASE_LIB)' else '-lOMCppOMCFactory $(BASE_LIB)'
let &additionalLinkerFlags_GCC += if stringEq(type,"tbb") then "-ltbb" else ""
let &additionalLinkerFlags_MSVC = buffer ""
Expand Down
6 changes: 3 additions & 3 deletions Compiler/Util/Flags.mo
Expand Up @@ -882,8 +882,8 @@ constant ConfigFlag CORBA_OBJECT_REFERENCE_FILE_PATH = CONFIG_FLAG(48, "corbaObj
Util.gettext("Sets the path for corba object reference file if +d=interactiveCorba is used."));

constant ConfigFlag HPCOM_SCHEDULER = CONFIG_FLAG(49, "hpcomScheduler",
NONE(), EXTERNAL(), STRING_FLAG("list"), NONE(),
Util.gettext("Sets123 the scheduler for task graph scheduling (list | listr | level | levelfix | ext | mcp | taskdep | tds | bls | rand | none). Default: levelfix."));
NONE(), EXTERNAL(), STRING_FLAG("level"), NONE(),
Util.gettext("Sets123 the scheduler for task graph scheduling (list | listr | level | levelfix | ext | mcp | taskdep | tds | bls | rand | none). Default: level."));

constant ConfigFlag TEARING_HEURISTIC = CONFIG_FLAG(50, "tearingHeuristic",
NONE(), EXTERNAL(), STRING_FLAG("MC3"),
Expand All @@ -903,7 +903,7 @@ constant ConfigFlag TEARING_HEURISTIC = CONFIG_FLAG(50, "tearingHeuristic",

constant ConfigFlag HPCOM_CODE = CONFIG_FLAG(51, "hpcomCode",
NONE(), EXTERNAL(), STRING_FLAG("pthreads"), NONE(),
Util.gettext("Sets the code-type produced by hpcom (openmp | pthreads | pthreads_spin | mpi). Default: openmp."));
Util.gettext("Sets the code-type produced by hpcom (openmp | pthreads | pthreads_spin | tbb | mpi). Default: openmp."));

constant ConfigFlag REWRITE_RULES_FILE = CONFIG_FLAG(52, "rewriteRulesFile", NONE(), EXTERNAL(),
STRING_FLAG(""), NONE(),
Expand Down
24 changes: 24 additions & 0 deletions SimulationRuntime/cpp/CMake/FindPugiXML.cmake
@@ -0,0 +1,24 @@
# Find the pugixml XML parsing library.
#
# Sets the usual variables expected for find_package scripts:
#
# PUGIXML_INCLUDE_DIR - header location
# PUGIXML_LIBRARIES - library to link against
# PUGIXML_FOUND - true if pugixml was found.
find_path (PUGIXML_INCLUDE_DIR NAMES pugixml.hpp PATHS ${PUGIXML_HOME}/include)
find_library (PUGIXML_LIBRARY NAMES pugixml PATHS ${PUGIXML_HOME}/lib)

# Support the REQUIRED and QUIET arguments, and set PUGIXML_FOUND if found.
include (FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS (PugiXML DEFAULT_MSG PUGIXML_LIBRARY
PUGIXML_INCLUDE_DIR)

if (PUGIXML_FOUND)
set (PUGIXML_LIBRARIES ${PUGIXML_LIBRARY})
message (STATUS "PugiXML include = ${PUGIXML_INCLUDE_DIR}")
message (STATUS "PugiXML library = ${PUGIXML_LIBRARY}")
else (PUGIXML_FOUND)
message (STATUS "No PugiXML found")
endif(PUGIXML_FOUND)

mark_as_advanced (PUGIXML_LIBRARY PUGIXML_INCLUDE_DIR)

0 comments on commit 87cef19

Please sign in to comment.