build: better emulate find_package behavior and replace FindSQLite3
Includes: - refactoring of find_external_library with argument parsing
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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 <simclick.h> should work
|
||||
get_filename_component(header_include_dir2 ${header_include_dir} DIRECTORY
|
||||
)# e.g. include/(click) -> #include <click/simclick.h> 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()
|
||||
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user