diff --git a/c/cmake_tutorial/step5/CMakeLists.txt b/c/cmake_tutorial/step5/CMakeLists.txt new file mode 100644 index 0000000..b44819a --- /dev/null +++ b/c/cmake_tutorial/step5/CMakeLists.txt @@ -0,0 +1,79 @@ +cmake_minimum_required (VERSION 2.6) +project (Tutorial) +# The version number. +set (Tutorial_VERSION_MAJOR 1) +set (Tutorial_VERSION_MINOR 0) + +# does this sytem provide the log and exp functions? +include (CheckFunctionExists) +check_function_exists (strcmpi HAVE_STRCMPI) +check_function_exists (strcasecmp HAVE_STRCASECMP) + +# should we use our own math functions? +option (USE_MYMATH + "Use tutorial provided math implementation" ON) + +# configure a header file to pass some of the CMake setting +# to the source code +configure_file ( + "${PROJECT_SOURCE_DIR}/TutorialConfig.h.in" + "${PROJECT_BINARY_DIR}/TutorialConfig.h" + ) + +# add the binary tree to the search path for include files +# so that we will find TutorialConfig.h +include_directories ("${PROJECT_BINARY_DIR}") + +if (USE_MYMATH) + include_directories ("${PROJECT_SOURCE_DIR}/MathFunctions") + add_subdirectory (MathFunctions) + set (EXTRA_LIBS ${EXTRA_LIBS} MathFunctions) +endif (USE_MYMATH) + +# add the executable +add_executable (Tutorial tutorial.cxx) +target_link_libraries (Tutorial ${EXTRA_LIBS}) + +# add the install targets and files +install (TARGETS Tutorial DESTINATION bin) +install (FILES "${PROJECT_BINARY_DIR}/TutorialConfig.h" + DESTINATION include) + +# does the application run +add_test (TutorialRuns Tutorial 25) + +# does it sqrt of 25 +add_test (TutorialComp25 Tutorial 25) + +set_tests_properties (TutorialComp25 + PROPERTIES PASS_REGULAR_EXPRESSION "25 is 5") + +# does it handle negative numbers +add_test (TutorialNegative Tutorial -25) +set_tests_properties (TutorialNegative + PROPERTIES PASS_REGULAR_EXPRESSION "-25 is -nan") + +# does it handle small numbers +add_test (TutorialSmall Tutorial 0.0001) +set_tests_properties (TutorialSmall + PROPERTIES PASS_REGULAR_EXPRESSION "0.0001 is 0.01") + +# does the usage message work? +add_test (TutorialUsage Tutorial) +set_tests_properties (TutorialUsage + PROPERTIES + PASS_REGULAR_EXPRESSION "Usage:.*number") + +#define a macro to simplify adding tests, then use it +macro (do_test arg result) + add_test (TutorialComp${arg} Tutorial ${arg}) + set_tests_properties (TutorialComp${arg} + PROPERTIES PASS_REGULAR_EXPRESSION ${result}) +endmacro (do_test) + +# do a bunch of result based tests +do_test (25 "25 is 5") +do_test (0 "0 is 0") + +# enable testing +ENABLE_TESTING () diff --git a/c/cmake_tutorial/step5/MathFunctions/CMakeLists.txt b/c/cmake_tutorial/step5/MathFunctions/CMakeLists.txt new file mode 100644 index 0000000..9ddfa07 --- /dev/null +++ b/c/cmake_tutorial/step5/MathFunctions/CMakeLists.txt @@ -0,0 +1,20 @@ +# first we add the executable that generate the table +add_executable (MakeTable MakeTable.cxx) + +# add the command to generate the source code +add_custom_command ( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/Table.h + COMMAND MakeTable ${CMAKE_CURRENT_BINARY_DIR}/Table.h + DEPENDS MakeTable + ) + +# add the binary tree directory to the search path for +# include files +include_directories (${CMAKE_CURRENT_BINARY_DIR}) + +# add the main library +add_library (MathFunctions mysqrt.cxx ${CMAKE_CURRENT_BINARY_DIR}/Table.h) + +# add the install targets and files +install (TARGETS MathFunctions DESTINATION bin) +install (FILES MathFunctions.h DESTINATION include) diff --git a/c/cmake_tutorial/step5/MathFunctions/MakeTable.cxx b/c/cmake_tutorial/step5/MathFunctions/MakeTable.cxx new file mode 100644 index 0000000..e135fd5 --- /dev/null +++ b/c/cmake_tutorial/step5/MathFunctions/MakeTable.cxx @@ -0,0 +1,36 @@ +// A simple program that builds a sqrt table +#include +#include +#include + +int main (int argc, char *argv[]) +{ + int i; + double result; + + // make sure we have enough arguments + if (argc < 2) + { + return 1; + } + + // open the output file + FILE *fout = fopen(argv[1],"w"); + if (!fout) + { + return 1; + } + + // create a source file with a table of square roots + fprintf(fout,"double sqrtTable[] = {\n"); + for (i = 0; i < 10; ++i) + { + result = sqrt(static_cast(i)); + fprintf(fout,"%g,\n",result); + } + + // close the table with a zero + fprintf(fout,"0};\n"); + fclose(fout); + return 0; +} diff --git a/c/cmake_tutorial/step5/MathFunctions/MathFunctions.h b/c/cmake_tutorial/step5/MathFunctions/MathFunctions.h new file mode 100644 index 0000000..54c682a --- /dev/null +++ b/c/cmake_tutorial/step5/MathFunctions/MathFunctions.h @@ -0,0 +1 @@ +#include "mysqrt.h" diff --git a/c/cmake_tutorial/step5/MathFunctions/mysqrt.cxx b/c/cmake_tutorial/step5/MathFunctions/mysqrt.cxx new file mode 100644 index 0000000..9283fa0 --- /dev/null +++ b/c/cmake_tutorial/step5/MathFunctions/mysqrt.cxx @@ -0,0 +1,7 @@ +#include + +double +mysqrt (double x) +{ + return sqrt (x); +} diff --git a/c/cmake_tutorial/step5/MathFunctions/mysqrt.h b/c/cmake_tutorial/step5/MathFunctions/mysqrt.h new file mode 100644 index 0000000..948a44c --- /dev/null +++ b/c/cmake_tutorial/step5/MathFunctions/mysqrt.h @@ -0,0 +1,2 @@ +double +mysqrt (double); diff --git a/c/cmake_tutorial/step5/TutorialConfig.h.in b/c/cmake_tutorial/step5/TutorialConfig.h.in new file mode 100644 index 0000000..be4bc15 --- /dev/null +++ b/c/cmake_tutorial/step5/TutorialConfig.h.in @@ -0,0 +1,7 @@ +// the configured options and settings for Tutorial +#define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@ +#define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@ +#cmakedefine USE_MYMATH +// does the platform provide exp and log functions? +#cmakedefine HAVE_STRCMPI +#cmakedefine HAVE_STRCASECMP diff --git a/c/cmake_tutorial/step5/tutorial.cxx b/c/cmake_tutorial/step5/tutorial.cxx new file mode 100644 index 0000000..031322f --- /dev/null +++ b/c/cmake_tutorial/step5/tutorial.cxx @@ -0,0 +1,48 @@ +// A simple program that computes the square root of a number +#include +#include +#include +#include +#include "TutorialConfig.h" +#ifdef USE_MYMATH +#include "MathFunctions.h" +#endif +#if defined HAVE_STRCMPI +#define strcasecmp strcmpi +#elif defined HAVE_STRCASECMP +#define strcmpi strcasecmp +#endif + +int main (int argc, char *argv[]) +{ + if (argc < 2) + { + fprintf(stdout,"%s Version %d.%d\n", + argv[0], + Tutorial_VERSION_MAJOR, + Tutorial_VERSION_MINOR); + fprintf(stdout,"Usage: %s number\n",argv[0]); + return 1; + } + double inputValue = atof(argv[1]); +#ifdef USE_MYMATH + puts ("Using mysqrt ()\n"); + double outputValue = mysqrt(inputValue); +#else + puts ("Using system sqrt ()\n"); + double outputValue = sqrt(inputValue); +#endif + fprintf(stdout,"The square root of %g is %g\n", + inputValue, outputValue); + + if (strcmpi ("string1", "string2")) + { + puts ("string1 != string2\n"); + } + else + { + puts ("string1 == string2\n"); + } + + return 0; +}