diff --git a/buildsupport/cmake-format-modules.txt b/buildsupport/cmake-format-modules.txt index 1caca9cf0..0daf2a71f 100644 --- a/buildsupport/cmake-format-modules.txt +++ b/buildsupport/cmake-format-modules.txt @@ -25,6 +25,13 @@ additional_commands: HEADER_FILES : '*' LIBRARIES_TO_LINK : '*' + find_external_library: + kwargs: + DEPENDENCY_NAME : '1' + HEADER_NAME : '1' + LIBRARY_NAME : '1' + SEARCH_PATHS : '*' + format: tab_size: 2 line_width: 80 diff --git a/buildsupport/macros_and_definitions.cmake b/buildsupport/macros_and_definitions.cmake index a6e309635..017bff1a6 100644 --- a/buildsupport/macros_and_definitions.cmake +++ b/buildsupport/macros_and_definitions.cmake @@ -487,15 +487,18 @@ macro(process_options) set(ENABLE_SQLITE False) if(${NS3_SQLITE}) - find_package( - SQLite3 - QUIET + #find_package(SQLite3 QUIET) # unsupported in CMake 3.10 + # We emulate the behavior of find_package below + find_external_library( + DEPENDENCY_NAME SQLite3 + HEADER_NAME sqlite3.h + LIBRARY_NAME sqlite3 ) if(${SQLite3_FOUND}) set(ENABLE_SQLITE True) else() - message(STATUS SQLite was not found) + message(STATUS "SQLite was not found") endif() endif() @@ -1464,25 +1467,33 @@ function(parse_ns3rc enabled_modules examples_enabled tests_enabled) endif() endfunction(parse_ns3rc) -function(find_external_library_header_and_library name header_name library_name - search_paths +function(find_external_library ) - mark_as_advanced(${name}_library) + set(oneValueArgs DEPENDENCY_NAME HEADER_NAME LIBRARY_NAME) + set(multiValueArgs SEARCH_PATHS) + cmake_parse_arguments("FIND_LIB" "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + set(name ${FIND_LIB_DEPENDENCY_NAME}) + set(library_name ${FIND_LIB_LIBRARY_NAME}) + set(header_name ${FIND_LIB_HEADER_NAME}) + set(search_paths ${FIND_LIB_SEARCH_PATHS}) + + mark_as_advanced(${name}_library_internal) find_library( - ${name}_library ${library_name} + ${name}_library_internal ${library_name} HINTS ${search_paths} ENV LD_LIBRARY_PATH PATH_SUFFIXES /build /lib /build/lib / ) - set(${name}_library_dir) - if(${name}_library) - get_filename_component(${name}_library_dir ${${name}_library} DIRECTORY + set(${name}_library_dir_internal) + if(${name}_library_internal) + get_filename_component(${name}_library_dir_internal ${${name}_library_internal} DIRECTORY )# e.g. lib/openflow.(so|dll|dylib|a) -> lib endif() - mark_as_advanced(${name}_header) + mark_as_advanced(${name}_header_internal) find_file( - ${name}_header ${header_name} - HINTS ${search_paths} ${${name}_library_dir}/../ - ${${name}_library_dir}/../../ + ${name}_header_internal ${header_name} + HINTS ${search_paths} ${${name}_library_dir_internal}/../ + ${${name}_library_dir_internal}/../../ PATH_SUFFIXES /build /include @@ -1493,20 +1504,22 @@ function(find_external_library_header_and_library name header_name library_name / ) # If we find both library and header, we export their values - if(${name}_library AND ${name}_header) - get_filename_component(header_include_dir ${${name}_header} DIRECTORY + if(${name}_header_internal AND (NOT ("${name}_library_internal-NOTFOUND" MATCHES "${${name}_library_internal}"))) + get_filename_component(header_include_dir ${${name}_header_internal} DIRECTORY )# e.g. include/click/ (simclick.h) -> #include should work get_filename_component(header_include_dir2 ${header_include_dir} DIRECTORY )# e.g. include/(click) -> #include should work - set(${name}_include_directories + set(${name}_INCLUDE_DIRS "${header_include_dir};${header_include_dir2}" PARENT_SCOPE ) - set(${name}_library ${${name}_library} PARENT_SCOPE) - set(${name}_header ${${name}_header} PARENT_SCOPE) + set(${name}_LIBRARIES ${${name}_library_internal} PARENT_SCOPE) + set(${name}_HEADER ${${name}_header_internal} PARENT_SCOPE) + set(${name}_FOUND TRUE PARENT_SCOPE) else() - set(${name}_include_directories PARENT_SCOPE) - set(${name}_library PARENT_SCOPE) - set(${name}_header PARENT_SCOPE) + set(${name}_INCLUDE_DIRS PARENT_SCOPE) + set(${name}_LIBRARIES PARENT_SCOPE) + set(${name}_HEADER PARENT_SCOPE) + set(${name}_FOUND FALSE PARENT_SCOPE) endif() endfunction() diff --git a/src/brite/CMakeLists.txt b/src/brite/CMakeLists.txt index c0aa0619d..5b6a2219b 100644 --- a/src/brite/CMakeLists.txt +++ b/src/brite/CMakeLists.txt @@ -9,22 +9,22 @@ set(NS3_BRITE "ON if Brite is found in NS3_WITH_BRITE" ) -find_external_library_header_and_library( - "brite" - "Brite.h" - "brite" - "${NS3_WITH_BRITE}" +find_external_library( + DEPENDENCY_NAME brite + HEADER_NAME Brite.h + LIBRARY_NAME brite + SEARCH_PATHS ${NS3_WITH_BRITE} ) + if(NOT - (brite_library - AND brite_header) + ${brite_FOUND} ) message(STATUS "Brite was not found") return() endif() # Only process module if include folder and library have been found -include_directories(${brite_include_directories}) +include_directories(${brite_INCLUDE_DIRS}) set(NS3_BRITE "ON" CACHE INTERNAL @@ -40,6 +40,6 @@ build_lib( ${libcore} ${libinternet} ${libpoint-to-point} - ${brite_library} + ${brite_LIBRARIES} TEST_SOURCES test/brite-test-topology.cc ) diff --git a/src/click/CMakeLists.txt b/src/click/CMakeLists.txt index daccde705..92b4f6894 100644 --- a/src/click/CMakeLists.txt +++ b/src/click/CMakeLists.txt @@ -9,21 +9,21 @@ set(NS3_CLICK "ON if Click is found in NS3_WITH_CLICK" ) -find_external_library_header_and_library( - "click" - "simclick.h" - "click" - "${NS3_WITH_CLICK}" +find_external_library( + DEPENDENCY_NAME click + HEADER_NAME simclick.h + LIBRARY_NAME click + SEARCH_PATHS ${NS3_WITH_CLICK} ) + if(NOT - (click_library - AND click_header) + ${click_FOUND} ) message(STATUS "Click was not found") return() endif() -include_directories(${click_include_directories}) +include_directories(${click_INCLUDE_DIRS}) set(NS3_CLICK "ON" CACHE INTERNAL @@ -45,6 +45,6 @@ build_lib( ${libcore} ${libnetwork} ${libinternet} - ${click_library} + ${click_LIBRARIES} TEST_SOURCES test/ipv4-click-routing-test.cc ) diff --git a/src/openflow/CMakeLists.txt b/src/openflow/CMakeLists.txt index 82754fc3f..487d3b15e 100644 --- a/src/openflow/CMakeLists.txt +++ b/src/openflow/CMakeLists.txt @@ -9,15 +9,15 @@ set(NS3_OPENFLOW "ON if Openflow is found in NS3_WITH_OPENFLOW" ) -find_external_library_header_and_library( - "openflow" - "openflow.h" - "openflow" - "${NS3_WITH_OPENFLOW}" +find_external_library( + DEPENDENCY_NAME openflow + HEADER_NAME openflow.h + LIBRARY_NAME openflow + SEARCH_PATHS ${NS3_WITH_OPENFLOW} ) + if(NOT - (openflow_library - AND openflow_header) + ${openflow_FOUND} ) message(STATUS "Openflow was not found") return() @@ -34,7 +34,7 @@ if(NOT return() endif() -include_directories(${openflow_include_directories}) +include_directories(${openflow_INCLUDE_DIRS}) add_definitions( -DNS3_OPENFLOW -DENABLE_OPENFLOW @@ -56,6 +56,6 @@ build_lib( model/openflow-interface.h model/openflow-switch-net-device.h LIBRARIES_TO_LINK ${libinternet} - ${openflow_library} + ${openflow_LIBRARIES} TEST_SOURCES test/openflow-switch-test-suite.cc )