CMake tutorial done.
This commit is contained in:
		
							parent
							
								
									0abac26956
								
							
						
					
					
						commit
						ef7ce27077
					
				| 
						 | 
				
			
			@ -13,9 +13,9 @@
 | 
			
		|||
*.a
 | 
			
		||||
 | 
			
		||||
# Build dir
 | 
			
		||||
build*
 | 
			
		||||
debug_build
 | 
			
		||||
release_build
 | 
			
		||||
/build*
 | 
			
		||||
/debug_build
 | 
			
		||||
/release_build
 | 
			
		||||
/bin
 | 
			
		||||
/lib
 | 
			
		||||
/install
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,47 @@
 | 
			
		|||
cmake_minimum_required (VERSION 2.6)
 | 
			
		||||
project(tutorial)
 | 
			
		||||
set (tutorial_VERSION_MAJOR 1)
 | 
			
		||||
set (tutorial_VERSION_MINOR 0)
 | 
			
		||||
 | 
			
		||||
option (USE_MYMATH "Use tutorial provided math implementation" ON)
 | 
			
		||||
 | 
			
		||||
include (CheckFunctionExists)
 | 
			
		||||
set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} "-lm")
 | 
			
		||||
check_function_exists (log HAVE_LOG)
 | 
			
		||||
check_function_exists (exp HAVE_EXP)
 | 
			
		||||
 | 
			
		||||
configure_file (
 | 
			
		||||
    "${PROJECT_SOURCE_DIR}/tutorial_config.h.in"
 | 
			
		||||
    "${PROJECT_BINARY_DIR}/tutorial_config.h"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
include_directories("${PROJECT_BINARY_DIR}")
 | 
			
		||||
 | 
			
		||||
add_executable(tutorial tutorial.cpp)
 | 
			
		||||
install (TARGETS tutorial DESTINATION bin)
 | 
			
		||||
install (FILES "${PROJECT_BINARY_DIR}/tutorial_config.h" DESTINATION include)
 | 
			
		||||
 | 
			
		||||
if (USE_MYMATH)
 | 
			
		||||
    include_directories ("${PROJECT_SOURCE_DIR}/mathfunctions")
 | 
			
		||||
    add_subdirectory(mathfunctions)
 | 
			
		||||
    set (EXTRA_LIBS ${EXTRA_LIBS} mathfunctions)
 | 
			
		||||
endif (USE_MYMATH)
 | 
			
		||||
 | 
			
		||||
target_link_libraries(tutorial ${EXTRA_LIBS})
 | 
			
		||||
 | 
			
		||||
include(CTest)
 | 
			
		||||
add_test (TutorialRuns tutorial 25)
 | 
			
		||||
 | 
			
		||||
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_test(25 "25 is 5")
 | 
			
		||||
do_test(-25 "-25 is -nan")
 | 
			
		||||
do_test(0.0001 "0\\\\.0001 is 0\\\\.01")
 | 
			
		||||
 | 
			
		||||
add_test (TutorialUsage tutorial)
 | 
			
		||||
set_tests_properties (TutorialUsage PROPERTIES PASS_REGULAR_EXPRESSION "Usage:.*number")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,11 @@
 | 
			
		|||
add_executable(maketable maketable.cpp)
 | 
			
		||||
 | 
			
		||||
add_custom_command (
 | 
			
		||||
    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/table.h
 | 
			
		||||
    COMMAND maketable ${CMAKE_CURRENT_BINARY_DIR}/table.h
 | 
			
		||||
    DEPENDS maketable
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
include_directories( ${CMAKE_CURRENT_BINARY_DIR} )
 | 
			
		||||
add_library(mathfunctions mysqrt.cpp ${CMAKE_CURRENT_BINARY_DIR}/table.h )
 | 
			
		||||
install (FILES mathfunctions.h DESTINATION include)
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,23 @@
 | 
			
		|||
#include <iostream>
 | 
			
		||||
#include <fstream>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <math.h>
 | 
			
		||||
 | 
			
		||||
int main(int argc, char **argv) {
 | 
			
		||||
  int i;
 | 
			
		||||
  double result;
 | 
			
		||||
  
 | 
			
		||||
  if (argc < 2) {
 | 
			
		||||
    return 1;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  std::ofstream fout;
 | 
			
		||||
  fout.open(argv[1]);
 | 
			
		||||
  fout << "double sqrtTable[] = {" << std::endl;
 | 
			
		||||
  for(int i = 0; i < 10; ++i) {
 | 
			
		||||
    fout << sqrt(static_cast<double>(i)) << "," << std::endl;
 | 
			
		||||
  }
 | 
			
		||||
  fout << "0};" << std::endl;
 | 
			
		||||
  fout.close();
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,4 @@
 | 
			
		|||
#include <math.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
 | 
			
		||||
double mysqrt(double);
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,35 @@
 | 
			
		|||
#include "mathfunctions.h"
 | 
			
		||||
#include "tutorial_config.h"
 | 
			
		||||
#include "table.h"
 | 
			
		||||
#include <iostream>
 | 
			
		||||
 | 
			
		||||
double improve(double guess, double x) {
 | 
			
		||||
  double newguess = x / guess;
 | 
			
		||||
  return (newguess + guess) / 2;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool goodenough(double guess, double x) {
 | 
			
		||||
  return abs((guess * guess) - x) < 0.00000001;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
double mysqrt(double x) {
 | 
			
		||||
  if (x < 10) {
 | 
			
		||||
    std::cerr << "Using Table" << std::endl;
 | 
			
		||||
    return sqrtTable[static_cast<int>(x)];
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
#if defined (HAVE_LOG) && defined(HAVE_EXP)
 | 
			
		||||
  std::cerr << "USING LOG" << std::endl;
 | 
			
		||||
  return exp(log(x) * 0.5);
 | 
			
		||||
#else
 | 
			
		||||
  double guess = 1.0;
 | 
			
		||||
  double t = x;
 | 
			
		||||
  while(1) {
 | 
			
		||||
    if (goodenough(guess, t)) {
 | 
			
		||||
      return guess;
 | 
			
		||||
    }
 | 
			
		||||
    guess = improve(guess, t);
 | 
			
		||||
  }
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
      
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,28 @@
 | 
			
		|||
#include <iostream>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <math.h>
 | 
			
		||||
#include "tutorial_config.h"
 | 
			
		||||
#ifdef USE_MYMATH
 | 
			
		||||
#include "mathfunctions.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int main(int argc, char **argv) {
 | 
			
		||||
  if (argc < 2) { 
 | 
			
		||||
    std::cerr << argv[0] << " version " << tutorial_VERSION_MAJOR 
 | 
			
		||||
              << "." << tutorial_VERSION_MINOR << std::endl;
 | 
			
		||||
    std::cerr << "Usage: " << argv[0] << " number\n";
 | 
			
		||||
    return 1;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  double inputvalue = atof(argv[1]);
 | 
			
		||||
#ifdef USE_MYMATH
 | 
			
		||||
  std::cerr << "Using MYMATH" << std::endl;
 | 
			
		||||
  double outputvalue = mysqrt(inputvalue);
 | 
			
		||||
#else
 | 
			
		||||
  std::cerr << "Using sqrt" << std::endl;
 | 
			
		||||
  double outputvalue = sqrt(inputvalue);
 | 
			
		||||
#endif  
 | 
			
		||||
  std::cout << "THe square root of " << inputvalue << " is " << outputvalue << std::endl;
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,5 @@
 | 
			
		|||
#cmakedefine USE_MYMATH
 | 
			
		||||
#define tutorial_VERSION_MAJOR @tutorial_VERSION_MAJOR@
 | 
			
		||||
#define tutorial_VERSION_MINOR @tutorial_VERSION_MINOR@
 | 
			
		||||
#cmakedefine HAVE_LOG
 | 
			
		||||
#cmakedefine HAVE_EXP
 | 
			
		||||
		Loading…
	
		Reference in New Issue