diff options
-rw-r--r-- | Anope.cmake | 219 | ||||
-rw-r--r-- | CMakeLists.txt | 229 | ||||
-rwxr-xr-x | Config | 10 | ||||
-rw-r--r-- | empty.c | 0 | ||||
-rw-r--r-- | install.js | 131 |
5 files changed, 340 insertions, 249 deletions
diff --git a/Anope.cmake b/Anope.cmake new file mode 100644 index 000000000..6ea65a7e7 --- /dev/null +++ b/Anope.cmake @@ -0,0 +1,219 @@ +############################################################################### +# append_to_list(<list> <args>...) +# +# A macro to handle appending to lists, uses list(APPEND) if using CMake 2.4.2 +# or better, otherwise uses set() instead. +############################################################################### +macro(append_to_list LIST) + if(CMAKE242_OR_BETTER) + # For CMake 2.4.2 or better, we can just use the APPEND sub-command of list() + list(APPEND ${LIST} ${ARGN}) + else(CMAKE242_OR_BETTER) + # For CMake 2.4.x before 2.4.2, we have to do this manually use set() instead + set(${LIST} ${${LIST}} ${ARGN}) + endif(CMAKE242_OR_BETTER) +endmacro(append_to_list) + +############################################################################### +# find_in_list(<list> <value> <output variable>) +# +# A macro to handle searching within a list, will store the result in the +# given <output variable>, uses list(FIND) if using CMake 2.6.x or better +# (or CMake 2.4.8 or better), otherwise it iterates through the list to find +# the item. +############################################################################### +macro(find_in_list LIST ITEM_TO_FIND FOUND) + if(CMAKE26_OR_BETTER OR ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION} GREATER 2.4.7) + # For CMake 2.6.x or better (as well as CMake 2.4.8 or better), we can use the FIND sub-command of list() + list(FIND ${LIST} ${ITEM_TO_FIND} ITEM_FOUND) + else(CMAKE26_OR_BETTER OR ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION} GREATER 2.4.7) + # For CMake 2.4.x before 2.4.8, we have to do this ourselves (NOTE: This is very slow due to a lack of break() as well) + # Firstly we set the position to -1 indicating nothing found, we also use a temporary position + set(ITEM_FOUND -1) + set(POS 0) + # Iterate through the list + foreach(ITEM ${${LIST}}) + # If the item we are looking at is the item we are trying to find, set that we've found the item + if(${ITEM} STREQUAL ${ITEM_TO_FIND}) + set(ITEM_FOUND ${POS}) + endif(${ITEM} STREQUAL ${ITEM_TO_FIND}) + # Increase the position value by 1 + math(EXPR POS "${POS} + 1") + endforeach(ITEM) + endif(CMAKE26_OR_BETTER OR ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION} GREATER 2.4.7) + # Set the given FOUND variable to the result + set(${FOUND} ${ITEM_FOUND}) +endmacro(find_in_list) + +############################################################################### +# remove_list_duplicates(<list>) +# +# A macro to handle removing duplicates from a list, uses +# list(REMOVE_DUPLICATES) if using CMake 2.6.x or better, otherwise it uses +# a slower method of creating a temporary list and only adding to it when +# a duplicate item hasn't been found. +############################################################################### +macro(remove_list_duplicates LIST) + if(CMAKE26_OR_BETTER) + # For CMake 2.6.x or better, this can be done automatically + list(REMOVE_DUPLICATES ${LIST}) + else(CMAKE26_OR_BETTER) + # For CMake 2.4.x, we have to do this ourselves, firstly we'll clear a temporary list + set(NEW_LIST) + # Iterate through the old list + foreach(ITEM ${${LIST}}) + # Check if the item is in the new list + find_in_list(NEW_LIST ${ITEM} FOUND_ITEM) + if(FOUND_ITEM EQUAL -1) + # If the item was not found, append it to the list + append_to_list(NEW_LIST ${ITEM}) + endif(FOUND_ITEM EQUAL -1) + endforeach(ITEM) + # replace the old list with the new list + set(${LIST} ${NEW_LIST}) + endif(CMAKE26_OR_BETTER) +endmacro(remove_list_duplicates) + +############################################################################### +# read_from_file(<filename> <regex> <output variable>) +# +# A macro to handle reading specific lines from a file, uses file(STRINGS) if +# using CMake 2.6.x or better, otherwise we read in the entire file and +# perform a string(REGEX MATCH) on each line of the file instead. +############################################################################### +macro(read_from_file FILE REGEX STRINGS) + if(CMAKE26_OR_BETTER) + # For CMake 2.6.x or better, we can just use this function to get the lines that match the given regular expression + file(STRINGS ${FILE} RESULT REGEX ${REGEX}) + else(CMAKE26_OR_BETTER) + # For CMake 2.4.x, we need to do this manually, firstly we read the file in + file(READ ${FILE} ALL_STRINGS) + # Next we replace all newlines with semicolons + string(REGEX REPLACE "\n" ";" ALL_STRINGS ${ALL_STRINGS}) + # Clear the result list + set(RESULT) + # Iterate through all the lines of the file + foreach(STRING ${ALL_STRINGS}) + # Check for a match against the given regular expression + string(REGEX MATCH ${REGEX} STRING_MATCH ${STRING}) + # If we had a match, append the match to the list + if(STRING_MATCH) + append_to_list(RESULT ${STRING}) + endif(STRING_MATCH) + endforeach(STRING) + endif(CMAKE26_OR_BETTER) + # Set the given STRINGS variable to the result + set(${STRINGS} ${RESULT}) +endmacro(read_from_file) + +############################################################################### +# extract_include_filename(<line> <output variable> [<optional output variable of quote type>]) +# +# This function will take a #include line and extract the filename. +############################################################################### +macro(extract_include_filename INCLUDE FILENAME) + # Detect if there is any trailing whitespace (basically see if the last character is a space or a tab) + string(LENGTH ${INCLUDE} INCLUDE_LEN) + math(EXPR LAST_CHAR_POS "${INCLUDE_LEN} - 1") + string(SUBSTRING ${INCLUDE} ${LAST_CHAR_POS} 1 LAST_CHAR) + # Only strip if the last character was a space or a tab + if(LAST_CHAR STREQUAL " " OR LAST_CHAR STREQUAL "\t") + # Strip away trailing whitespace from the line + string(REGEX REPLACE "[ \t]*$" "" INCLUDE_STRIPPED ${INCLUDE}) + else(LAST_CHAR STREQUAL " " OR LAST_CHAR STREQUAL "\t") + # Just copy INCLUDE to INCLUDE_STRIPPED so the below code doesn't complain about a lack of INCLUDE_STRIPPED + set(INCLUDE_STRIPPED ${INCLUDE}) + endif(LAST_CHAR STREQUAL " " OR LAST_CHAR STREQUAL "\t") + # Find the filename including the quotes or angle brackets, it should be at the end of the line after whitespace was stripped + string(REGEX MATCH "[\"<].*[\">]$" FILE ${INCLUDE_STRIPPED}) + # If an optional 3rd argument is given, we'll store if the quote style was quoted or angle bracketed + if(${ARGC} GREATER 2) + string(SUBSTRING ${FILE} 0 1 QUOTE) + if(QUOTE STREQUAL "<") + set(${ARGV2} "angle brackets") + else(QUOTE STREQUAL "<") + set(${ARGV2} "quotes") + endif(QUOTE STREQUAL "<") + endif(${ARGC} GREATER 2) + # Get the length of the filename with quotes or angle brackets + string(LENGTH ${FILE} FILENAME_LEN) + # Subtract 2 from this length, for the quotes or angle brackets + math(EXPR FILENAME_LEN "${FILENAME_LEN} - 2") + # Overwrite the filename with a version sans quotes or angle brackets + string(SUBSTRING ${FILE} 1 ${FILENAME_LEN} FILE) + # Set the filename to the the given variable + set(${FILENAME} "${FILE}") +endmacro(extract_include_filename) + +############################################################################### +# calculate_depends(<source filename>) +# +# This function is used in most of the src (sub)directories to calculate the +# header file dependencies for the given source file. +############################################################################### +macro(calculate_depends SRC) + # Find all the lines in the given source file that have any form of #include on them, regardless of whitespace + read_from_file(${SRC} "^[ \t]*#[ \t]*include[ \t]*\".*\"[ \t]*$" INCLUDES) + # Reset the list of headers to empty + set(HEADERS) + # Iterate through the strings containing #include (if any) + foreach(INCLUDE ${INCLUDES}) + # Extract the filename from the #include line + extract_include_filename(${INCLUDE} FILENAME) + # Append the filename to the list of headers + append_to_list(HEADERS ${FILENAME}) + endforeach(INCLUDE) + # Set the list of new headers to empty (this will store all the headers that the above list depends on) + set(NEW_HEADERS) + # Iterate through the list of headers + foreach(HEADER ${HEADERS}) + # If the current header has it's own headers to depend on, append those to the list of new headers + if(${HEADER}_HEADERS) + append_to_list(NEW_HEADERS ${${HEADER}_HEADERS}) + endif(${HEADER}_HEADERS) + endforeach(HEADER) + # If there were new headers, append them to the list of headers + if(NEW_HEADERS) + append_to_list(HEADERS ${NEW_HEADERS}) + endif(NEW_HEADERS) + # If after all the above there is a list of header, we'll process them, converting them to full paths + if(HEADERS) + # Remove duplicate headers from the list and sort the list + remove_list_duplicates(HEADERS) + if(CMAKE244_OR_BETTER) + list(SORT HEADERS) + endif(CMAKE244_OR_BETTER) + # Set the list of full path headers to empty + set(HEADERS_FULL) + # Iterate through the list of headers + foreach(HEADER ${HEADERS}) + # Append the full path of the header to the full path headers list + append_to_list(HEADERS_FULL ${${HEADER}_FULLPATH}) + endforeach(HEADER) + # Set the given source file to depend on the headers given + set_source_files_properties(${SRC} PROPERTIES OBJECT_DEPENDS "${HEADERS_FULL}") + endif(HEADERS) +endmacro(calculate_depends) + +############################################################################### +# add_to_cpack_ignored_files(<item> [TRUE]) +# +# A macro to update the environment variable CPACK_IGNORED_FILES which +# contains a list of files for CPack to ignore. If the optional 2nd argument +# of TRUE is given, periods will be converted to \\. for CPack. +############################################################################### +macro(add_to_cpack_ignored_files ITEM) + # Temporary copy of the orignal item + set(REAL_ITEM "${ITEM}") + # If we have 2+ arguments, assume that the second one was something like TRUE (doesn't matter really) and convert periods so they will be \\. for CPack + if(${ARGC} GREATER 1) + string(REPLACE "." "\\\\." REAL_ITEM ${REAL_ITEM}) + endif(${ARGC} GREATER 1) + # If the environment variable is already defined, just tack the item to the end + if(DEFINED ENV{CPACK_IGNORED_FILES}) + set(ENV{CPACK_IGNORED_FILES} "$ENV{CPACK_IGNORED_FILES};${REAL_ITEM}") + # Otherwise set the environment variable to the item + else(DEFINED ENV{CPACK_IGNORED_FILES}) + set(ENV{CPACK_IGNORED_FILES} "${REAL_ITEM}") + endif(DEFINED ENV{CPACK_IGNORED_FILES}) +endmacro(add_to_cpack_ignored_files) diff --git a/CMakeLists.txt b/CMakeLists.txt index 32f66158e..f6bc6eb93 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,60 +13,32 @@ endif(${CMAKE_CURRENT_SOURCE_DIR} STREQUAL ${CMAKE_CURRENT_BINARY_DIR} AND NOT W project(Anope CXX) enable_language(C) -# A macro to handle appending to lists -macro(append_to_list LIST) - if(CMAKE242_OR_BETTER) - # For CMake 2.4.2 or better, we can just use the APPEND sub-command of list() - list(APPEND ${LIST} ${ARGN}) - else(CMAKE242_OR_BETTER) - # For CMake 2.4.x before 2.4.2, we have to do this manually use set() instead - set(${LIST} ${${LIST}} ${ARGN}) - endif(CMAKE242_OR_BETTER) -endmacro(append_to_list) - -# A macro to handle searching within a list -macro(find_in_list LIST ITEM_TO_FIND FOUND) - if(CMAKE26_OR_BETTER OR ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION} GREATER 2.4.7) - # For CMake 2.6.x or better (as well as CMake 2.4.8 or better), we can use the FIND sub-command of list() - list(FIND ${LIST} ${ITEM_TO_FIND} ITEM_FOUND) - else(CMAKE26_OR_BETTER OR ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION} GREATER 2.4.7) - # For CMake 2.4.x before 2.4.8, we have to do this ourselves (NOTE: This is very slow due to a lack of break() as well), firstly we set that we a temporary boolean - set(ITEM_FOUND -1) - set(POS 0) - # Iterate through the list - foreach(ITEM ${${LIST}}) - # If the item we are looking at is the item we are trying to find, set that we've found the item - if(${ITEM} STREQUAL ${ITEM_TO_FIND}) - set(ITEM_FOUND ${POS}) - endif(${ITEM} STREQUAL ${ITEM_TO_FIND}) - math(EXPR POS "${POS} + 1") - endforeach(ITEM) - endif(CMAKE26_OR_BETTER OR ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION} GREATER 2.4.7) - # Set the given FOUND variable to the result - set(${FOUND} ${ITEM_FOUND}) -endmacro(find_in_list) - -# A macro to handle removing duplicates from a list -macro(remove_list_duplicates LIST) - if(CMAKE26_OR_BETTER) - # For CMake 2.6.x or better, this can be done automatically - list(REMOVE_DUPLICATES ${LIST}) - else(CMAKE26_OR_BETTER) - # For CMake 2.4.x, we have to do this ourselves, firstly we'll clear a temporary list - set(NEW_LIST) - # Iterate through the old list - foreach(ITEM ${${LIST}}) - # Check if the item is in the new list - find_in_list(NEW_LIST ${ITEM} FOUND_ITEM) - if(FOUND_ITEM EQUAL -1) - # If the item was not found, append it to the list - append_to_list(NEW_LIST ${ITEM}) - endif(FOUND_ITEM EQUAL -1) - endforeach(ITEM) - # replace the old list with the new list - set(${LIST} ${NEW_LIST}) - endif(CMAKE26_OR_BETTER) -endmacro(remove_list_duplicates) +# Detect is we are using CMake 2.6 or better, these versions include functions that require less work than CMake 2.4 does +if(${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} GREATER 2.5) + set(CMAKE26_OR_BETTER TRUE) + set(CMAKE244_OR_BETTER TRUE) + set(CMAKE242_OR_BETTER TRUE) +else(${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} GREATER 2.5) + set(CMAKE26_OR_BETTER FALSE) + # Also detect if we are using CMake 2.4.4 or better, the CheckCXXCompilerFlag module is non-existant in earlier versions + if(${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION} GREATER 2.4.3) + set(CMAKE244_OR_BETTER TRUE) + set(CMAKE242_OR_BETTER TRUE) + else(${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION} GREATER 2.4.3) + set(CMAKE244_OR_BETTER FALSE) + # ALSO detect if we are using CMake 2.4.2 or better, the APPEND sub-command of list() is non-existant in earlier versions + if(CMAKE_PATCH_VERSION GREATER 1) + set(CMAKE242_OR_BETTER TRUE) + else(CMAKE_PATCH_VERSION GREATER 1) + set(CMAKE242_OR_BETTER FALSE) + endif(CMAKE_PATCH_VERSION GREATER 1) + endif(${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION} GREATER 2.4.3) +endif(${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} GREATER 2.5) + +# Override the module include path to include our directory, for our Anope.cmake, as well as we are using our own version of the NSIS template +set(CMAKE_MODULE_PATH ${Anope_SOURCE_DIR}) + +include(Anope) # Start with empty defaults for library and include directories, to be used by GNU compilers only set(DEFAULT_LIBRARY_DIRS) @@ -97,10 +69,8 @@ if(CMAKE_COMPILER_IS_GNUCXX) # Remove duplicate entries from the list remove_list_duplicates(DEFAULT_LIBRARY_DIRS) # Next, we look for the compiler's default include directories - # Create an empty temporary file - execute_process(COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/empty.c) # Run the command to find the default include directories - execute_process(COMMAND ${CMAKE_C_COMPILER} -v -x c++ -E ${CMAKE_CURRENT_BINARY_DIR}/empty.c ERROR_VARIABLE LINES OUTPUT_QUIET ERROR_STRIP_TRAILING_WHITESPACE) + execute_process(COMMAND ${CMAKE_C_COMPILER} -v -x c++ -E ${CMAKE_CURRENT_SOURCE_DIR}/empty.c ERROR_VARIABLE LINES OUTPUT_QUIET ERROR_STRIP_TRAILING_WHITESPACE) # Convert the new lines to semicolons string(REGEX REPLACE "\n" ";" LINES ${LINES}) # Temporary variable saying if we are in the search list or not @@ -127,8 +97,6 @@ if(CMAKE_COMPILER_IS_GNUCXX) endforeach(LINE) # Remove duplicate entries from the list remove_list_duplicates(DEFAULT_INCLUDE_DIRS) - # Delete the temporary file - execute_process(COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_CURRENT_BINARY_DIR}/empty.c) endif(CMAKE_COMPILER_IS_GNUCXX) # If we are using Visual Studio, locate the path of the Windows Server 2008 SDK or Windows Server 2003 Platform SDK, depending on which is installed @@ -162,28 +130,6 @@ if(MSVC) endif(WSDK2008_PATH STREQUAL "/registry") endif(MSVC) -# Detect is we are using CMake 2.6 or better, these versions include functions that require less work than CMake 2.4 does -if(${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} GREATER 2.5) - set(CMAKE26_OR_BETTER TRUE) - set(CMAKE244_OR_BETTER TRUE) - set(CMAKE242_OR_BETTER TRUE) -else(${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} GREATER 2.5) - set(CMAKE26_OR_BETTER FALSE) - # Also detect if we are using CMake 2.4.4 or better, the CheckCXXCompilerFlag module is non-existant in earlier versions - if(${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION} GREATER 2.4.3) - set(CMAKE244_OR_BETTER TRUE) - set(CMAKE242_OR_BETTER TRUE) - else(${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION} GREATER 2.4.3) - set(CMAKE244_OR_BETTER FALSE) - # ALSO detect if we are using CMake 2.4.2 or better, the APPEND sub-command of list() is non-existant in earlier versions - if(CMAKE_PATCH_VERSION GREATER 1) - set(CMAKE242_OR_BETTER TRUE) - else(CMAKE_PATCH_VERSION GREATER 1) - set(CMAKE242_OR_BETTER FALSE) - endif(CMAKE_PATCH_VERSION GREATER 1) - endif(${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION} GREATER 2.4.3) -endif(${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} GREATER 2.5) - # If the user specifies -DCMAKE_BUILD_TYPE on the command line, take their definition # and dump it in the cache along with proper documentation, otherwise set CMAKE_BUILD_TYPE # to Debug prior to calling PROJECT() @@ -342,32 +288,6 @@ if(CMAKE26_OR_BETTER) endif(LDFLAGS) endif(CMAKE26_OR_BETTER) -# A macro to handle reading specific lines from a file -macro(read_from_file FILE REGEX STRINGS) - if(CMAKE26_OR_BETTER) - # For CMake 2.6.x or better, we can just use this function to get the lines that match the given regular expression - file(STRINGS ${FILE} RESULT REGEX ${REGEX}) - else(CMAKE26_OR_BETTER) - # For CMake 2.4.x, we need to do this manually, firstly we read the file in - file(READ ${FILE} ALL_STRINGS) - # Next we replace all newlines with semicolons - string(REGEX REPLACE "\n" ";" ALL_STRINGS ${ALL_STRINGS}) - # Clear the result list - set(RESULT) - # Iterate through all the lines of the file - foreach(STRING ${ALL_STRINGS}) - # Check for a match against the given regular expression - string(REGEX MATCH ${REGEX} STRING_MATCH ${STRING}) - # If we had a match, append the match to the list - if(STRING_MATCH) - append_to_list(RESULT ${STRING}) - endif(STRING_MATCH) - endforeach(STRING) - endif(CMAKE26_OR_BETTER) - # Set the given STRINGS variable to the result - set(${STRINGS} ${RESULT}) -endmacro(read_from_file) - # Search for the following programs find_program(GREP grep) find_program(SH sh) @@ -440,32 +360,6 @@ if(CMAKE244_OR_BETTER) list(SORT ALL_HEADERS) endif(CMAKE244_OR_BETTER) -# This function will take a #include line and extract the filename minus the quotes -macro(extract_include_filename INCLUDE FILENAME) - # Detect if there is any trailing whitespace (basically see if the last character is a space or a tab) - string(LENGTH ${INCLUDE} INCLUDE_LEN) - math(EXPR LAST_CHAR_POS "${INCLUDE_LEN} - 1") - string(SUBSTRING ${INCLUDE} ${LAST_CHAR_POS} 1 LAST_CHAR) - # Only strip if the last character was a space or a tab - if(LAST_CHAR STREQUAL " " OR LAST_CHAR STREQUAL "\t") - # Strip away trailing whitespace from the line - string(REGEX REPLACE "[ \t]*$" "" INCLUDE_STRIPPED ${INCLUDE}) - else(LAST_CHAR STREQUAL " " OR LAST_CHAR STREQUAL "\t") - # Just copy INCLUDE to INCLUDE_STRIPPED so the below code doesn't complain about a lack of INCLUDE_STRIPPED - set(INCLUDE_STRIPPED ${INCLUDE}) - endif(LAST_CHAR STREQUAL " " OR LAST_CHAR STREQUAL "\t") - # Find the filename including the quotes, it should be at the end of the line after whitespace was stripped - string(REGEX MATCH "\".*\"$" FILE ${INCLUDE_STRIPPED}) - # Get the length of the filename with quotes - string(LENGTH ${FILE} FILENAME_LEN) - # Subtract 2 from this length, for the quotes - math(EXPR FILENAME_LEN "${FILENAME_LEN} - 2") - # Overwrite the filename with a version sans quotes - string(SUBSTRING ${FILE} 1 ${FILENAME_LEN} FILE) - # Set the filename to the the given variable - set(${FILENAME} "${FILE}") -endmacro(extract_include_filename) - # Preparse step 1: get filenames sans paths # Iterate through the headers foreach(HEADER ${ALL_HEADERS}) @@ -527,68 +421,6 @@ set(language.h_FULLPATH ${Anope_BINARY_DIR}/lang/language.h) set(sysconf.h_FULLPATH ${Anope_BINARY_DIR}/include/sysconf.h) set(version.h_FULLPATH ${Anope_BINARY_DIR}/include/version.h) -# This function is used in most of the src (sub)directories to calculate the header file dependencies for the given source file -macro(calculate_depends SRC) - # Find all the lines in the given source file that have any form of #include on them, regardless of whitespace - read_from_file(${SRC} "^[ \t]*#[ \t]*include[ \t]*\".*\"[ \t]*$" INCLUDES) - # Reset the list of headers to empty - set(HEADERS) - # Iterate through the strings containing #include (if any) - foreach(INCLUDE ${INCLUDES}) - # Extract the filename from the #include line - extract_include_filename(${INCLUDE} FILENAME) - # Append the filename to the list of headers - append_to_list(HEADERS ${FILENAME}) - endforeach(INCLUDE) - # Set the list of new headers to empty (this will store all the headers that the above list depends on) - set(NEW_HEADERS) - # Iterate through the list of headers - foreach(HEADER ${HEADERS}) - # If the current header has it's own headers to depend on, append those to the list of new headers - if(${HEADER}_HEADERS) - append_to_list(NEW_HEADERS ${${HEADER}_HEADERS}) - endif(${HEADER}_HEADERS) - endforeach(HEADER) - # If there were new headers, append them to the list of headers - if(NEW_HEADERS) - append_to_list(HEADERS ${NEW_HEADERS}) - endif(NEW_HEADERS) - # If after all the above there is a list of header, we'll process them, converting them to full paths - if(HEADERS) - # Remove duplicate headers from the list and sort the list - remove_list_duplicates(HEADERS) - if(CMAKE244_OR_BETTER) - list(SORT HEADERS) - endif(CMAKE244_OR_BETTER) - # Set the list of full path headers to empty - set(HEADERS_FULL) - # Iterate through the list of headers - foreach(HEADER ${HEADERS}) - # Append the full path of the header to the full path headers list - append_to_list(HEADERS_FULL ${${HEADER}_FULLPATH}) - endforeach(HEADER) - # Set the given source file to depend on the headers given - set_source_files_properties(${SRC} PROPERTIES OBJECT_DEPENDS "${HEADERS_FULL}") - endif(HEADERS) -endmacro(calculate_depends) - -# A macro to update the environment variable CPACK_IGNORED_FILES which contains a list of files for CPack to ignore -macro(add_to_cpack_ignored_files ITEM) - # Temporary copy of the orignal item - set(REAL_ITEM "${ITEM}") - # If we have 2+ arguments, assume that the second one was something like TRUE (doesn't matter really) and convert periods so they will be \\. for CPack - if(${ARGC} GREATER 1) - string(REPLACE "." "\\\\." REAL_ITEM ${REAL_ITEM}) - endif(${ARGC} GREATER 1) - # If the environment variable is already defined, just tack the item to the end - if(DEFINED ENV{CPACK_IGNORED_FILES}) - set(ENV{CPACK_IGNORED_FILES} "$ENV{CPACK_IGNORED_FILES};${REAL_ITEM}") - # Otherwise set the environment variable to the item - else(DEFINED ENV{CPACK_IGNORED_FILES}) - set(ENV{CPACK_IGNORED_FILES} "${REAL_ITEM}") - endif(DEFINED ENV{CPACK_IGNORED_FILES}) -endmacro(add_to_cpack_ignored_files) - # Add the initial files to ignore which will be ignored regardless of if you are building in-source or out-of-source add_to_cpack_ignored_files(".git\;config.cache\;.svn\;CMakeFiles\;sysconf.h$\;Makefile.inc$\;config.log\;config.status\;build\;autom4te.cache" TRUE) # Add the files we don't want the periods converted for @@ -639,8 +471,6 @@ endif(WIN32) # Only process the CPack section if we have CPack if(EXISTS "${CMAKE_ROOT}/Modules/CPack.cmake") - # Override the module include path to include our directory, as we are using our own version of the NSIS template - set(CMAKE_MODULE_PATH ${Anope_SOURCE_DIR}) # Various options for CPack set(CPACK_PACKAGE_NAME "Anope IRC Services") set(CPACK_PACKAGE_VENDOR "Anope Team") @@ -663,17 +493,18 @@ if(EXISTS "${CMAKE_ROOT}/Modules/CPack.cmake") "bin\\\\anope.bat\\\" \\\"-debug -nofork" "Anope IRC Services (Debug and Window Logging)" "bin\\\\anope.bat\\\" \\\"-nofork" "Anope IRC Services (Window Logging)" "bin\\\\anope.bat\\\" \\\"-nothird" "Anope IRC Services (No Third Party Modules)" - "http://www.anope.org" "Anope Web Site" + "http://www.anope.org/" "Anope Web Site" ) # The following doesn't work, but a bug report has been filed about it #set(CPACK_CREATE_DESKTOP_LINK_${SERVICES_BINARY} TRUE) set(CPACK_NSIS_MUI_ICON "${Anope_SOURCE_DIR}/src\\\\anope-icon.ico") set(CPACK_NSIS_MUI_UNIICON "${Anope_SOURCE_DIR}/src\\\\anope-icon.ico") set(CPACK_NSIS_INSTALLED_ICON_NAME "${SERVICES_BINARY}") - set(CPACK_NSIS_URL_INFO_ABOUT "http://www.anope.org") + set(CPACK_NSIS_URL_INFO_ABOUT "http://www.anope.org/") set(CPACK_NSIS_COMPRESSOR "/SOLID lzma") endif(WIN32) set(CPACK_SOURCE_PACKAGE_FILE_NAME "anope-${VERSION_FULL_NOBUILD}-source") + set(CPACK_SOURCE_GENERATOR "TGZ") set(CPACK_SOURCE_IGNORE_FILES "$ENV{CPACK_IGNORED_FILES}") set(CPACK_MONOLITHIC_INSTALL TRUE) include(CPack) @@ -157,6 +157,11 @@ USE_RUN_CC_PL="no" CAN_QUICK="no" SOURCE_DIR=`dirname $0` +which cmake > /dev/null +if [ $? -ne 0 ] ; then + BUILD_SYSTEM="configure" +fi + ########################################################################### # Check out the options ########################################################################### @@ -248,6 +253,11 @@ done BUILD_SYSTEM=$INPUT echo "" +if [ "$SOURCE_DIR" != "." -a "$BUILD_SYSTEM" = "configure" ] ; then + echo "You can not use configure unless you are in the same folder as Config!" + exit 0 +fi + ok=0 echo "In what directory do you want the binaries to be installed?" while [ $ok -eq 0 ] ; do diff --git a/empty.c b/empty.c new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/empty.c diff --git a/install.js b/install.js index 455d75e4b..608dcd6a1 100644 --- a/install.js +++ b/install.js @@ -26,25 +26,27 @@ var installerQuestions = [ 'short' : 'Install directory:', 'default_answer' : '', 'store_answer' : function(answer) { - if (!answer) { + if (!answer) + { WScript.Echo("You must give a directory!\n"); return false; } - if (!fso.FolderExists(answer)) { - if (fso.FileExists(answer)) { + if (!fso.FolderExists(answer)) + { + if (fso.FileExists(answer)) + { WScript.Echo(answer + " exists, but is not a directory!\n"); return false; } WScript.Echo(answer + " does not exist. Create it ([yes]/no)?\n"); var inputValue = InstallerInput().toLowerCase(); - if (!inputValue) { + if (!inputValue) inputValue = 'yes'; - } - if (inputValue != 'no') { + if (inputValue != 'no') fso.CreateFolder(answer); - } } - else if (fso.FileExists(answer + '\\include\\services.h')) { + else if (fso.FileExists(answer + '\\include\\services.h')) + { WScript.Echo("You cannot use the Anope source directory as a target directory.\n"); return false; } @@ -75,8 +77,10 @@ var installerQuestions = [ return true; }, 'cmake_argument' : function() { - if (installerResponses['Use NMake'] == 'yes') return '-G"NMake Makefiles"'; - else return ''; + if (installerResponses['Use NMake'] == 'yes') + return '-G"NMake Makefiles"'; + else + return ''; } }, { @@ -94,9 +98,12 @@ var installerQuestions = [ return true; }, 'cmake_argument' : function() { - if (installerResponses['Debug'] == 'msvc') return ''; - else if (installerResponses['Debug'] == 'yes') return '-DCMAKE_BUILD_TYPE:STRING=DEBUG'; - else return '-DCMAKE_BUILD_TYPE:STRING=RELEASE'; + if (installerResponses['Debug'] == 'msvc') + return ''; + else if (installerResponses['Debug'] == 'yes') + return '-DCMAKE_BUILD_TYPE:STRING=DEBUG'; + else + return '-DCMAKE_BUILD_TYPE:STRING=RELEASE'; } }, { @@ -115,8 +122,10 @@ var installerQuestions = [ return true; }, 'cmake_argument' : function() { - if (installerResponses['Visual Studio 2008'] == 'yes') return '-G"Visual Studio 9 2008"'; - else return ''; + if (installerResponses['Visual Studio 2008'] == 'yes') + return '-G"Visual Studio 9 2008"'; + else + return ''; } }, ]; @@ -137,71 +146,78 @@ var ScriptPath = WScript.ScriptFullName.substr(0, WScript.ScriptFullName.length var fso = WScript.CreateObject('Scripting.FileSystemObject'); var x, y, z; -if (fso.FileExists(ScriptPath + '.BANNER')) { +if (fso.FileExists(ScriptPath + '.BANNER')) +{ var bannerStream = fso.OpenTextFile(ScriptPath + '.BANNER'); var bannerText = bannerStream.ReadAll(); bannerStream.close(); - for (x in bannerReplacements) { + for (x in bannerReplacements) + { var thisReplacement = bannerReplacements[x]; bannerText = bannerText.replace(thisReplacement['findtext'], thisReplacement['replacement']); } WScript.Echo(bannerText + "\n"); } -else { +else WScript.Echo("ERROR: Cannot find banner file!\n"); -} WScript.Echo('Press Enter to Begin...'); InstallerInput(); WScript.Echo(''); -for (x in installerQuestions) { +for (x in installerQuestions) +{ var thisQuestion = installerQuestions[x]; var validResponse = false; var validOpts = new Array(); - if (thisQuestion.short == 'Build debug?' && installerResponses['Use NMake'] == 'no') { + if (thisQuestion.short == 'Build debug?' && installerResponses['Use NMake'] == 'no') + { installerResponses['Debug'] = 'msvc'; continue; } - if (thisQuestion.short == 'Using Visual Studio 2008?' && installerResponses['Debug'] != 'msvc') { + if (thisQuestion.short == 'Using Visual Studio 2008?' && installerResponses['Debug'] != 'msvc') + { installerResponses['Visual Studio 2008'] = 'no'; continue; } - while (!validResponse) { - for (y in thisQuestion.question) { + while (!validResponse) + { + for (y in thisQuestion.question) + { var qLine = thisQuestion.question[y]; WScript.Echo(qLine); } WScript.Echo(''); var choiceLine = ''; - if (thisQuestion.options) { - for (y in thisQuestion.options) { + if (thisQuestion.options) + { + for (y in thisQuestion.options) + { choiceLine += thisQuestion.options[y] + ', '; validOpts[thisQuestion.options[y]] = true; } choiceLine = choiceLine.substring(0, choiceLine.length - 2); WScript.Echo('Available Options: ' + choiceLine); } - if (thisQuestion.default_answer) WScript.Echo('Default Answer: ' + thisQuestion.default_answer + "\n"); + if (thisQuestion.default_answer) + WScript.Echo('Default Answer: ' + thisQuestion.default_answer + "\n"); WScript.Echo(thisQuestion.short); var inputValue = InstallerInput().toLowerCase(); - if (!inputValue) { + if (!inputValue) inputValue = thisQuestion.default_answer; - } - if (choiceLine && !validOpts[inputValue]) { + if (choiceLine && !validOpts[inputValue]) WScript.Echo("ERROR: Invalid option '" + inputValue + "'\n"); - } - else if (thisQuestion.store_answer(inputValue)) { + else if (thisQuestion.store_answer(inputValue)) validResponse = true; - } } WScript.Echo(''); } WScript.Echo("\nAnope will be compiled with the following options:\n"); -for (x in installerResponses) { +for (x in installerResponses) +{ var thisResponse = installerResponses[x]; WScript.Echo("\t" + x + ":\t\t[" + thisResponse.toUpperCase() + "]"); } @@ -210,7 +226,8 @@ WScript.Echo("\nTo continue, please press Enter..."); InstallerInput(); var cmake = 'cmake'; -for (x in installerQuestions) { +for (x in installerQuestions) +{ var thisQuestion = installerQuestions[x]; cmake += ' ' + thisQuestion.cmake_argument(); } @@ -220,50 +237,64 @@ WScript.Echo(cmake + "\n"); var shell = WScript.CreateObject('WScript.Shell'); var cmake_shell = shell.exec('%comspec% /c ' + cmake); -while (!cmake_shell.StdOut.AtEndOfStream) { - var strLine = cmake_shell.StdOut.ReadLine(); - WScript.Echo(strLine); +while (!cmake_shell.Status) +{ + if (!cmake_shell.StdOut.AtEndOfStream) + WScript.Echo(cmake_shell.StdOut.ReadLine()); + else if (!cmake_shell.StdErr.AtEndOfStream) + WScript.Echo(cmake_shell.StdErr.ReadLine()); } -if (installerResponses['Use NMake'] == 'yes') WScript.Echo("\nTo compile Anope, run 'nmake'. To install, run 'nmake install'.\n"); -else WScript.Echo("\nTo compile Anope, open Anope.sln and build the solution. To install,\ndo a build on the INSTALL project.\n"); -WScript.Echo("If you update Anope, you should run this script again to ensure\nall available options are set.\n"); +if (cmake_shell.ExitCode == 0) +{ + if (installerResponses['Use NMake'] == 'yes') WScript.Echo("\nTo compile Anope, run 'nmake'. To install, run 'nmake install'.\n"); + else WScript.Echo("\nTo compile Anope, open Anope.sln and build the solution. To install,\ndo a build on the INSTALL project.\n"); + WScript.Echo("If you update Anope, you should run this script again to ensure\nall available options are set.\n"); +} +else + WScript.Echo("\nThere was an error attempting to run CMake! Check the above error message,\nand contact the Anope team if you are unsure how to proceed.\n"); // ----------------------------------------------------------------- // Functions function FindAnopeVersion() { - if (!fso.FileExists(ScriptPath + 'version.log')) { + if (!fso.FileExists(ScriptPath + 'version.log')) + { anopeVersion = 'Unknown'; return; } var versionLog = fso.OpenTextFile(ScriptPath + 'version.log'); - while (!versionLog.atEndOfStream) { + while (!versionLog.atEndOfStream) + { var versionLine = versionLog.readline(); var thisMatch = versionLine.replace('\n', ''); - while (thisMatch.match(/\"/g)) { + while (thisMatch.match(/\"/g)) thisMatch = thisMatch.replace('"', ''); - } versionLine = thisMatch; - if (versionLine.match(/VERSION_MAJOR=/g)) { + if (versionLine.match(/VERSION_MAJOR=/g)) + { vMaj = versionLine.replace('VERSION_MAJOR=', ''); continue; } - if (versionLine.match(/VERSION_MINOR=/g)) { + if (versionLine.match(/VERSION_MINOR=/g)) + { vMin = versionLine.replace('VERSION_MINOR=', ''); continue; } - if (versionLine.match(/VERSION_PATCH=/g)) { + if (versionLine.match(/VERSION_PATCH=/g)) + { vPat = versionLine.replace('VERSION_PATCH=', ''); continue; } - if (versionLine.match(/VERSION_EXTRA=/g)) { + if (versionLine.match(/VERSION_EXTRA=/g)) + { vExtra = versionLine.replace('VERSION_EXTRA=', ''); continue; } - if (versionLine.match(/VERSION_BUILD=/g)) { + if (versionLine.match(/VERSION_BUILD=/g)) + { vBuild = versionLine.replace('VERSION_BUILD=', ''); continue; } |