@@ -17,23 +17,9 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON)
1717set (CMAKE_CXX_EXTENSIONS OFF )
1818set (CMAKE_EXPORT_COMPILE_COMMANDS ON )
1919
20- # Add an external; appends to `PYTHONMONKEY_EXTERNAL_FILES` in the parent scope.
21- function (pythonmonkey_add_external PYTHONMONKEY_EXTERNAL)
22- add_subdirectory ("cmake/externals/${PYTHONMONKEY_EXTERNAL} " )
23- set (PYTHONMONKEY_EXTERNAL_FILE "cmake/externals/${PYTHONMONKEY_EXTERNAL} /CMakeLists.txt" )
24- source_group (
25- TREE "${CMAKE_CURRENT_SOURCE_DIR} /cmake/externals/${PYTHONMONKEY_EXTERNAL} "
26- PREFIX "Externals\\ ${PYTHONMONKEY_EXTERNAL} "
27- FILES "${PYTHONMONKEY_EXTERNAL_FILE} "
28- )
29- list (APPEND PYTHONMONKEY_EXTERNAL_FILES "${PYTHONMONKEY_EXTERNAL_FILE} " )
30-
31- set (PYTHONMONKEY_EXTERNAL_FILES ${PYTHONMONKEY_EXTERNAL_FILES} PARENT_SCOPE)
32- endfunction ()
33-
34- file (GLOB SOURCE_FILES "src/*.cc" "src/internalBinding/*.cc" ) # Find all C++ files in the src directory
35- file (GLOB HEADER_FILES "include/*.hh" ) # Find all header files in the include directory
36- file (GLOB PYTHON_FILES "python/*.cc" "python/*.hh" ) # Find all the python bindings in the python directory
20+ file (GLOB_RECURSE HEADER_FILES "include/*.hh" ) # Find all header files in the include directory and below
21+ file (GLOB_RECURSE SOURCE_FILES "src/*.cc" ) # Find all C++ files in the src directory and below
22+
3723
3824include_directories (${CMAKE_CURRENT_LIST_DIR} )
3925
@@ -43,48 +29,97 @@ if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME)
4329 ### Code block from: https://cliutils.gitlab.io/modern-cmake/chapters/projects/submodule.html
4430 include (FetchContent)
4531
46- SET (COMPILE_FLAGS "-ggdb -Ofast -fno-rtti" ) # optimize but also emit debug symbols
47- SET (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMPILE_FLAGS} $ENV{EXTRA_CMAKE_CXX_FLAGS} " )
48-
49- set (CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR} /cmake/modules)
50- if (APPLE )
51- find_package (Python 3.8 COMPONENTS Interpreter Development REQUIRED)
52- find_package (SpiderMonkey REQUIRED)
53- set (PYTHON_MAJOR $ENV{Python_VERSION_MAJOR} )
54- set (PYTHON_MINOR $ENV{Python_VERSION_MINOR} )
55- set (PYTHONLIBS_VERSION_STRING ${Python_VERSION} )
56- set (PYTHON_INCLUDE_DIR ${Python_INCLUDE_DIRS} )
57- set (PYTHON_LIBRARIES ${Python_LIBRARIES} )
58- message ("Apple - Using Python:${Python_VERSION_MAJOR} - Libraries:${PYTHON_LIBRARIES} - IncludeDirs: ${PYTHON_INCLUDE_DIR} " )
59- elseif (UNIX )
60- find_package (Python 3.8 COMPONENTS Interpreter Development REQUIRED)
61- set (Python_FIND_VIRTUALENV FIRST) # (require cmake >= v3.15 and this is the default) use the Python version configured by pyenv if available
62- set (PYTHON_LIBRARIES ${Python_LIBRARIES} )
63- set (PYTHON_INCLUDE_DIR ${Python_INCLUDE_DIRS} )
64- message ("Linux - Using Python:${Python_VERSION_MAJOR} .${Python_VERSION_MINOR} - Libraries:${PYTHON_LIBRARIES} - IncludeDirs: ${PYTHON_INCLUDE_DIR} " )
65- find_package (SpiderMonkey REQUIRED)
66- elseif (WIN32 )
67- find_package (PythonInterp 3.8 REQUIRED)
68- find_package (PythonLibs 3.8 REQUIRED)
69- find_package (SpiderMonkey REQUIRED)
70- set (PYTHONLIBS_VERSION_STRING $ENV{PY_VERSION} )
32+ if (WIN32 )
33+ SET (COMPILE_FLAGS "/GR- /W0" )
34+
35+ SET (OPTIMIZED "/O2" )
36+ SET (UNOPTIMIZED "/Od" )
37+ SET (KEEP_SYMBOLS "/DEBUG:FULL" )
38+ SET (STRIP_SYMBOLS "/DEBUG:NONE" )
39+ SET (PROFILE "/PROFILE" )
40+ SET (ADDRESS_SANITIZE "/fsanitize=address /Oy-" )
41+ else ()
42+ SET (COMPILE_FLAGS "-fno-rtti -Wno-invalid-offsetof" )
43+
44+ SET (OPTIMIZED "-Ofast -DNDEBUG" )
45+ SET (UNOPTIMIZED "-O0" )
46+ SET (KEEP_SYMBOLS "-ggdb" )
47+ SET (STRIP_SYMBOLS "-s" )
48+ SET (PROFILE "-pg" )
49+ SET (ADDRESS_SANITIZE "-fsanitize=address -fno-omit-frame-pointer" )
50+ endif ()
51+ SET (PROFILE_FLAGS "${UNOPTIMIZED} ${KEEP_SYMBOLS} ${PROFILE} " )
52+ SET (SANITIZE_FLAGS "${UNOPTIMIZED} ${KEEP_SYMBOLS} ${ADDRESS_SANITIZE} " )
53+ SET (DEBUG_FLAGS "${UNOPTIMIZED} ${KEEP_SYMBOLS} " )
54+ SET (DRELEASE_FLAGS "${OPTIMIZED} ${KEEP_SYMBOLS} " )
55+ SET (RELEASE_FLAGS "${OPTIMIZED} ${STRIP_SYMBOLS} " )
56+
57+ if (GENERATOR_IS_MULTI_CONFIG)
58+ set (CMAKE_CONFIGURATION_TYPES "Profile;Sanitize;Debug;DRelease;Release;None" CACHE STRING "" FORCE)
59+ string (APPEND COMPILE_FLAGS "$<$<CONFIG:Profile>:${PROFILE_FLAGS} > $<$<CONFIG:Sanitize>:${SANITIZE_FLAGS} > $<$<CONFIG:Debug>:${DEBUG_FLAGS} > $<$<CONFIG:DRelease>:${DRELEASE_FLAGS} > $<$<CONFIG:Release>:${RELEASE_FLAGS} >" )
60+ else ()
61+ set_property (CACHE PM_BUILD_TYPE PROPERTY HELPSTRING "Choose the type of build" )
62+ set_property (CACHE PM_BUILD_TYPE PROPERTY STRINGS "Profile;Sanitize;Debug;DRelease;Release;None" )
63+ if (PM_BUILD_TYPE STREQUAL "Profile" )
64+ list (APPEND COMPILE_FLAGS "${PROFILE_FLAGS} " )
65+ elseif (PM_BUILD_TYPE STREQUAL "Sanitize" )
66+ list (APPEND COMPILE_FLAGS "${SANITIZE_FLAGS} " )
67+ elseif (PM_BUILD_TYPE STREQUAL "Debug" )
68+ list (APPEND COMPILE_FLAGS "${DEBUG_FLAGS} " )
69+ elseif (PM_BUILD_TYPE STREQUAL "DRelease" )
70+ list (APPEND COMPILE_FLAGS "${DRELEASE_FLAGS} " )
71+ elseif (PM_BUILD_TYPE STREQUAL "None" )
72+ message ("PM_BUILD_TYPE is None. Not compiling." )
73+ else () #Release build
74+ message ("PM_BUILD_TYPE not detected or invalid value, defaulting to Release build." )
75+ set (PM_BUILD_TYPE Release CACHE STRING "" FORCE)
76+ list (APPEND COMPILE_FLAGS "${RELEASE_FLAGS} " )
77+ endif ()
78+ message ("PythonMonkey build type is: ${PM_BUILD_TYPE} " )
79+ list (JOIN COMPILE_FLAGS " " COMPILE_FLAGS )
7180 endif ()
72- include_directories (${PYTHON_INCLUDE_DIRS} )
73- include_directories (${SPIDERMONKEY_INCLUDE_DIR} )
81+
82+ if (NOT PM_BUILD_TYPE STREQUAL "None" )
83+ SET (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMPILE_FLAGS} " )
84+
85+ set (CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR} /cmake/modules)
86+ if (APPLE )
87+ find_package (Python 3.8 COMPONENTS Interpreter Development REQUIRED)
88+ find_package (SpiderMonkey REQUIRED)
89+ set (PYTHON_MAJOR $ENV{Python_VERSION_MAJOR} )
90+ set (PYTHON_MINOR $ENV{Python_VERSION_MINOR} )
91+ set (PYTHONLIBS_VERSION_STRING ${Python_VERSION} )
92+ set (PYTHON_INCLUDE_DIR ${Python_INCLUDE_DIRS} )
93+ set (PYTHON_LIBRARIES ${Python_LIBRARIES} )
94+ elseif (UNIX )
95+ find_package (Python 3.8 COMPONENTS Interpreter Development REQUIRED)
96+ set (Python_FIND_VIRTUALENV FIRST) # (require cmake >= v3.15 and this is the default) use the Python version configured by pyenv if available
97+ set (PYTHON_LIBRARIES ${Python_LIBRARIES} )
98+ set (PYTHON_INCLUDE_DIR ${Python_INCLUDE_DIRS} )
99+ find_package (SpiderMonkey REQUIRED)
100+ elseif (WIN32 )
101+ find_package (Python 3.8 COMPONENTS Interpreter Development REQUIRED)
102+ set (Python_FIND_VIRTUALENV FIRST) # (require cmake >= v3.15 and this is the default) use the Python version configured by pyenv if available
103+ set (PYTHON_LIBRARIES ${Python_LIBRARIES} )
104+ set (PYTHON_INCLUDE_DIR ${Python_INCLUDE_DIRS} )
105+ find_package (SpiderMonkey REQUIRED)
106+ endif ()
107+ message ("${CMAKE_SYSTEM_NAME} - Using Python:${Python_VERSION} - Libraries:${Python_LIBRARIES} - IncludeDirs: ${Python_INCLUDE_DIRS} " )
108+ include_directories (${Python_INCLUDE_DIRS} )
109+ include_directories (${SPIDERMONKEY_INCLUDE_DIR} )
110+ # Add compiled folder directories
111+ add_subdirectory (src)
112+ endif (NOT PM_BUILD_TYPE STREQUAL "None" )
74113
75114 # Add doxygen if this is the main app
76- find_package (Doxygen)
77- if (Doxygen_FOUND)
115+ option (BUILD_DOCS "Build documentation" OFF )
116+ if (BUILD_DOCS)
117+ find_package (Doxygen)
118+ if (Doxygen_FOUND)
78119 add_subdirectory (cmake/docs)
79- else ()
120+ else ()
80121 message (STATUS "Doxygen not found. Not building docs." )
122+ endif ()
81123 endif ()
82124
83125endif ()
84-
85- # Add compiled folder directories
86- add_subdirectory (src)
87-
88- pythonmonkey_add_external("uncrustify" )
89- pythonmonkey_add_external("autopep8" )
90- add_subdirectory (cmake/format)
0 commit comments