build: better emulate find_package behavior and replace FindSQLite3

Includes:
- refactoring of find_external_library with argument parsing
This commit is contained in:
Gabriel Ferreira
2022-01-28 19:31:35 -03:00
parent bbe67f5fc2
commit da72879f4c
5 changed files with 70 additions and 50 deletions

View File

@@ -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

View File

@@ -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()

View File

@@ -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
)

View File

@@ -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
)

View File

@@ -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
)