summaryrefslogtreecommitdiff
path: root/CMakeLists.txt
diff options
context:
space:
mode:
authorcyberbotx <cyberbotx@5417fbe8-f217-4b02-8779-1006273d7864>2008-12-17 20:18:11 +0000
committercyberbotx <cyberbotx@5417fbe8-f217-4b02-8779-1006273d7864>2008-12-17 20:18:11 +0000
commitfd45a3ad4219bffcf2f68fcc1dce3ff33b531b89 (patch)
treef6d1e3ff092a1f8881c633005eabd4aace92c121 /CMakeLists.txt
parentad7b5bdd30405b92042c4a1872175be80d8d111f (diff)
Implemented dependency calculation within CMake, now header file dependencies are no longer hardcoded.
Also a few minor changes to the CMakeLists.txt files. git-svn-id: http://anope.svn.sourceforge.net/svnroot/anope/trunk@1840 5417fbe8-f217-4b02-8779-1006273d7864
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r--CMakeLists.txt180
1 files changed, 154 insertions, 26 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 5169b6082..3e5205998 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -18,11 +18,11 @@ enable_language(C)
if(MINGW)
set(CMAKE_RC_COMPILER_INIT windres)
- message(STATUS "CMAKE_RC_OUTPUT_EXTENSION: ${CMAKE_RC_OUTPUT_EXTENSION}")
+ #message(STATUS "CMAKE_RC_OUTPUT_EXTENSION: ${CMAKE_RC_OUTPUT_EXTENSION}")
enable_language(RC)
- message(STATUS "CMAKE_RC_OUTPUT_EXTENSION: ${CMAKE_RC_OUTPUT_EXTENSION}")
- set(CMAKE_RC_OUTPUT_EXTENSION .o)
- message(STATUS "CMAKE_RC_OUTPUT_EXTENSION: ${CMAKE_RC_OUTPUT_EXTENSION}")
+ #message(STATUS "CMAKE_RC_OUTPUT_EXTENSION: ${CMAKE_RC_OUTPUT_EXTENSION}")
+ #set(CMAKE_RC_OUTPUT_EXTENSION .o)
+ #message(STATUS "CMAKE_RC_OUTPUT_EXTENSION: ${CMAKE_RC_OUTPUT_EXTENSION}")
set(CMAKE_RC_COMPILE_OBJECT "<CMAKE_RC_COMPILER> <FLAGS> <DEFINES> -o <OBJECT> <SOURCE>")
endif(MINGW)
@@ -39,7 +39,7 @@ endif(NOT WIN32)
if(WIN32 AND MSVC)
string(REPLACE "/EHsc " "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
string(REPLACE "/GX " "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
- set(CXXFLAGS "${CXXFLAGS} /W4 /EHa /RTC1 /D_WIN32 /DMSVCPP /I ${Anope_SOURCE_DIR}/include /I ${Anope_BINARY_DIR}/include /I ${Anope_BINARY_DIR}/lang")
+ set(CXXFLAGS "${CXXFLAGS} /W4 /EHs /RTC1 /D_WIN32 /DMSVCPP /I${Anope_SOURCE_DIR}/include /I${Anope_BINARY_DIR}/include /I${Anope_BINARY_DIR}/lang")
set(MODULE_CXXFLAGS "${CXXFLAGS} /DMODULE_COMPILE")
else(WIN32 AND MSVC)
set(CXXFLAGS "${CXXFLAGS} -Wall -Wshadow -I${Anope_SOURCE_DIR}/include -I${Anope_BINARY_DIR}/include -I${Anope_BINARY_DIR}/lang")
@@ -53,7 +53,7 @@ else(WIN32 AND MSVC)
endif(UNIX)
set(MODULE_CXXFLAGS "${CXXFLAGS}")
endif(WIN32 AND MSVC)
-message(STATUS "CMAKE_CXX_CREATE_SHARED_MODULE: ${CMAKE_CXX_CREATE_SHARED_MODULE}")
+#message(STATUS "CMAKE_CXX_CREATE_SHARED_MODULE: ${CMAKE_CXX_CREATE_SHARED_MODULE}")
#if(CMAKE_BUILD_TYPE)
# set(CXXFLAGS "${CXXFLAGS} ${CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE}}")
#endif(CMAKE_BUILD_TYPE)
@@ -75,28 +75,30 @@ else(WIN32)
#set(CMAKE_CXX_CREATE_SHARED_MODULE "<CMAKE_CXX_COMPILER> ${CXXFLAGS} <CMAKE_SHARED_LIBRARY_CXX_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <CMAKE_SHARED_LIBRARY_SONAME_CXX_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> ${LDFLAGS}")
endif(WIN32)
-if(NOT WIN32)
+if(NOT WIN32 OR NOT MSVC)
check_cxx_compiler_flag(-pipe HAVE_PIPE_FLAG)
if(HAVE_PIPE_FLAG)
set(CXXFLAGS "${CXXFLAGS} -pipe")
endif(HAVE_PIPE_FLAG)
- check_library_exists(nsl inet_ntoa "" HAVE_NSL_LIB)
- if(HAVE_NSL_LIB)
- set(LDFLAGS "${LDFLAGS} -lnsl")
- endif(HAVE_NSL_LIB)
- check_library_exists(socket socket "" HAVE_SOCKET_LIB)
- if(HAVE_SOCKET_LIB)
- set(LDFLAGS "${LDFLAGS} -lsocket")
- endif(HAVE_SOCKET_LIB)
- check_library_exists(resolv res_query "" HAVE_RESOLV_LIB)
- if(HAVE_RESOLV_LIB)
- set(LDFLAGS "${LDFLAGS} -lresolv")
- endif(HAVE_RESOLV_LIB)
- check_library_exists(bsd revoke "" HAVE_BSD_LIB)
- if(HAVE_BSD_LIB)
- set(LDFLAGS "${LDFLAGS} -lbsd")
- endif(HAVE_BSD_LIB)
+ if(NOT WIN32)
+ check_library_exists(nsl inet_ntoa "" HAVE_NSL_LIB)
+ if(HAVE_NSL_LIB)
+ set(LDFLAGS "${LDFLAGS} -lnsl")
+ endif(HAVE_NSL_LIB)
+ check_library_exists(socket socket "" HAVE_SOCKET_LIB)
+ if(HAVE_SOCKET_LIB)
+ set(LDFLAGS "${LDFLAGS} -lsocket")
+ endif(HAVE_SOCKET_LIB)
+ check_library_exists(resolv res_query "" HAVE_RESOLV_LIB)
+ if(HAVE_RESOLV_LIB)
+ set(LDFLAGS "${LDFLAGS} -lresolv")
+ endif(HAVE_RESOLV_LIB)
+ check_library_exists(bsd revoke "" HAVE_BSD_LIB)
+ if(HAVE_BSD_LIB)
+ set(LDFLAGS "${LDFLAGS} -lbsd")
+ endif(HAVE_BSD_LIB)
+ endif(NOT WIN32)
try_run(RUN_VA_LIST_AS_ARRAY COMPILE_VA_LIST_AS_ARRAY
${Anope_SOURCE_DIR} ${Anope_SOURCE_DIR}/va_list_check.c
@@ -104,7 +106,7 @@ if(NOT WIN32)
if(COMPILE_VA_LIST_AS_ARRAY AND NOT RUN_VA_LIST_AS_ARRAY)
set(HAVE_VA_LIST_AS_ARRAY 1)
endif(COMPILE_VA_LIST_AS_ARRAY AND NOT RUN_VA_LIST_AS_ARRAY)
-endif(NOT WIN32)
+endif(NOT WIN32 OR NOT MSVC)
if(NOT DEFUMASK)
if(RUNGROUP)
@@ -141,7 +143,7 @@ if(LDFLAGS)
string(STRIP ${LDFLAGS} LDFLAGS)
endif(LDFLAGS)
-if(NOT WIN32)
+#if(NOT WIN32)
find_program(GREP grep)
find_program(SH sh)
find_program(CHGRP chgrp)
@@ -157,7 +159,7 @@ if(NOT WIN32)
set(CMAKE_CXX_CREATE_SHARED_MODULE "${Anope_SOURCE_DIR}/run-cc.pl ${CMAKE_CXX_CREATE_SHARED_MODULE}")
endif(USE_RUN_CC_PL)
endif(PERL)
-endif(NOT WIN32)
+#endif(NOT WIN32)
#set(CMAKE_BUILD_TYPE DEBUG)
#message(STATUS "CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE}: ${CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE}}")
@@ -221,6 +223,132 @@ if(WIN32)
configure_file(${Anope_SOURCE_DIR}/src/win32.rc.cmake ${Anope_BINARY_DIR}/src/win32.rc)
endif(WIN32)
+file(GLOB_RECURSE ALL_HEADERS "*.h")
+foreach(HEADER ${ALL_HEADERS})
+ if(NOT HEADER MATCHES ".*obsolete.*")
+ list(APPEND TMP_HEADERS ${HEADER})
+ get_filename_component(HEADER_FILENAME ${HEADER} NAME)
+ set(${HEADER_FILENAME}_FULLPATH ${HEADER})
+ endif(NOT HEADER MATCHES ".*obsolete.*")
+endforeach(HEADER)
+set(ALL_HEADERS ${TMP_HEADERS})
+list(SORT ALL_HEADERS)
+message(STATUS "ALL_HEADERS: ${ALL_HEADERS}")
+
+# Calculate dependencies for each header
+# I would've done this inside the CMakeLists.txt for the include directory, but since it's added AFTER everything else, it won't help...
+
+# Preparse step 1: get filenames sans paths
+foreach(HEADER ${ALL_HEADERS})
+ file(STRINGS ${HEADER} INCLUDES REGEX "^[ \t]*#[ \t]*include[ \t]*\".*\"[ \t]*$")
+ message(STATUS "${HEADER}'s includes: ${INCLUDES}")
+ get_filename_component(HEADER_FILENAME ${HEADER} NAME)
+ foreach(INCLUDE ${INCLUDES})
+ string(STRIP ${INCLUDE} INCLUDE)
+ string(REGEX MATCH "\".*\"$" FILENAME ${INCLUDE})
+ string(LENGTH ${FILENAME} FILENAME_LEN)
+ math(EXPR FILENAME_LEN "${FILENAME_LEN} - 2")
+ string(SUBSTRING ${FILENAME} 1 ${FILENAME_LEN} FILENAME)
+ message(STATUS "INCLUDE FILENAME: ${FILENAME}")
+ list(APPEND ${HEADER_FILENAME}_HEADERS ${FILENAME})
+ endforeach(INCLUDE)
+ if(${HEADER_FILENAME}_HEADERS)
+ message(STATUS "${HEADER_FILENAME}_HEADERS: ${${HEADER_FILENAME}_HEADERS}")
+ endif(${HEADER_FILENAME}_HEADERS)
+endforeach(HEADER)
+
+# Preparse step 2: for every header from above that had includes, recursively find the headers each header relies on
+foreach(HEADER ${ALL_HEADERS})
+ get_filename_component(HEADER_FILENAME ${HEADER} NAME)
+ if(${HEADER_FILENAME}_HEADERS)
+ set(OLD_HEADERS)
+ set(HEADERS ${${HEADER_FILENAME}_HEADERS})
+ set(NEW_HEADERS)
+ #message(STATUS "Before start of WHILE() for ${HEADER_FILENAME} - ${HEADERS}")
+ while(HEADERS)
+ foreach(CURR_HEADER ${HEADERS})
+ #message(STATUS "CURR_HEADER: ${CURR_HEADER}")
+ if(${CURR_HEADER}_HEADERS)
+ #message(STATUS "${CURR_HEADER}_HEADERS: ${${CURR_HEADER}_HEADERS}")
+ #message(STATUS "NEW_HEADERS BEFORE: ${NEW_HEADERS}")
+ foreach(CURR_HEADERS_HEADER ${${CURR_HEADER}_HEADERS})
+ list(APPEND NEW_HEADERS ${CURR_HEADERS_HEADER})
+ endforeach(CURR_HEADERS_HEADER)
+ #message(STATUS "NEW_HEADERS AFTER: ${NEW_HEADERS}")
+ endif(${CURR_HEADER}_HEADERS)
+ endforeach(CURR_HEADER)
+ #message(STATUS "NEW_HEADERS: ${NEW_HEADERS}")
+ list(APPEND OLD_HEADERS ${HEADERS})
+ set(HEADERS ${NEW_HEADERS})
+ set(NEW_HEADERS)
+ endwhile(HEADERS)
+ list(REMOVE_DUPLICATES OLD_HEADERS)
+ list(SORT OLD_HEADERS)
+ message(STATUS "${HEADER_FILENAME}'s OLD_HEADERS: ${OLD_HEADERS}")
+ set(${HEADER_FILENAME}_HEADERS ${OLD_HEADERS})
+ endif(${HEADER_FILENAME}_HEADERS)
+endforeach(HEADER)
+
+# The following headers are generated from CMake rules and won't be found with the above
+list(APPEND ALL_HEADERS ${Anope_BINARY_DIR}/lang/language.h ${Anope_BINARY_DIR}/include/sysconf.h ${Anope_BINARY_DIR}/include/version.h)
+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)
+
+# Final step: Replace the filename in each header's dependency list with full paths (MOVE TO OTHER CMakeLists.txt LATER!)
+#foreach(HEADER ${ALL_HEADERS})
+# get_filename_component(HEADER_FILENAME ${HEADER} NAME)
+# if(${HEADER_FILENAME}_HEADERS)
+# set(NEW_HEADERS)
+# foreach(CURR_HEADER ${${HEADER_FILENAME}_HEADERS})
+# list(APPEND NEW_HEADERS ${${CURR_HEADER}_FULLPATH})
+# endforeach(CURR_HEADER)
+# message(STATUS "${HEADER_FILENAME}'s NEW_HEADERS: ${NEW_HEADERS}")
+# set(${HEADER_FILENAME}_HEADERS ${NEW_HEADERS})
+# endif(${HEADER_FILENAME}_HEADERS)
+#endforeach(HEADER)
+
+function(calculate_depends SRC)
+ file(STRINGS ${SRC} INCLUDES REGEX "^[ \t]*#[ \t]*include[ \t]*\".*\"[ \t]*$")
+ #message(STATUS "${SRC}'s includes: ${INCLUDES}")
+ #get_filename_component(HEADER_FILENAME ${HEADER} NAME)
+ set(HEADERS)
+ foreach(INCLUDE ${INCLUDES})
+ string(STRIP ${INCLUDE} INCLUDE)
+ string(REGEX MATCH "\".*\"$" FILENAME ${INCLUDE})
+ string(LENGTH ${FILENAME} FILENAME_LEN)
+ math(EXPR FILENAME_LEN "${FILENAME_LEN} - 2")
+ string(SUBSTRING ${FILENAME} 1 ${FILENAME_LEN} FILENAME)
+ #message(STATUS "INCLUDE FILENAME: ${FILENAME}")
+ #list(APPEND ${HEADER_FILENAME}_HEADERS ${FILENAME})
+ list(APPEND HEADERS ${FILENAME})
+ endforeach(INCLUDE)
+ #message(STATUS "${SRC}'s HEADERS: ${HEADERS}")
+ set(NEW_HEADERS)
+ foreach(HEADER ${HEADERS})
+ #message(STATUS "HEADER: ${HEADER} - ${HEADERS}_HEADERS: ${${HEADERS}_HEADERS}")
+ if(${HEADER}_HEADERS)
+ list(APPEND NEW_HEADERS ${${HEADER}_HEADERS})
+ endif(${HEADER}_HEADERS)
+ endforeach(HEADER)
+ if(NEW_HEADERS)
+ list(APPEND HEADERS ${NEW_HEADERS})
+ endif(NEW_HEADERS)
+ if(HEADERS)
+ list(REMOVE_DUPLICATES HEADERS)
+ list(SORT HEADERS)
+ #message(STATUS "${SRC}'s HEADERS after NEW_HEADERS: ${HEADERS}")
+ set(HEADERS_FULL)
+ foreach(HEADER ${HEADERS})
+ get_filename_component(HEADER_FILENAME ${HEADER} NAME)
+ list(APPEND HEADERS_FULL ${${HEADER_FILENAME}_FULLPATH})
+ endforeach(HEADER)
+ #message(STATUS "${SRC}'s HEADERS_FULL: ${HEADERS_FULL}")
+ set_source_files_properties(${SRC} PROPERTIES OBJECT_DEPENDS "${HEADERS_FULL}")
+ list(APPEND ${PROGRAM_NAME}_HEADERS ${HEADERS_FULL})
+ endif(HEADERS)
+endfunction(calculate_depends)
+
add_subdirectory(data)
add_subdirectory(lang)
add_subdirectory(src)