diff --git a/src/base/os.lua b/src/base/os.lua index 759db3bff1..684ba05d5e 100644 --- a/src/base/os.lua +++ b/src/base/os.lua @@ -159,7 +159,16 @@ elseif type(headerdirs) == "table" then userpaths = headerdirs end - paths = table.join(userpaths, paths) + + for _, userpath in ipairs(userpaths) do + if path.isabsolute(userpath) then + paths = table.join({userpath}, paths) + else + for _, p in ipairs(paths) do + paths = table.join({path.join(p, userpath)}, paths) + end + end + end local result = os.pathsearch (headerpath, table.unpack(paths)) return result diff --git a/tests/base/test_os.lua b/tests/base/test_os.lua index 3900c67b54..b697ad9739 100644 --- a/tests/base/test_os.lua +++ b/tests/base/test_os.lua @@ -102,6 +102,15 @@ os.findheader("test.h", path.getabsolute("folder/subfolder/include"))) end + function suite.findheader_provided_relative() + local os_getenv = os.getenv + os.getenv = create_mock_os_getenv({ [get_LD_PATH_variable_name()] = get_surrounded_env_path("folder/subfolder/lib") }) + + test.isequal(path.getabsolute("folder/subfolder/include/testlib"), os.findheader("testlib2.h", "testlib")) + + os.getenv = os_getenv + end + function suite.findheader_frompath_lib() local os_getenv = os.getenv os.getenv = create_mock_os_getenv({ [get_LD_PATH_variable_name()] = get_surrounded_env_path("folder/subfolder/lib") }) diff --git a/tests/folder/subfolder/include/testlib/testlib2.h b/tests/folder/subfolder/include/testlib/testlib2.h new file mode 100644 index 0000000000..a37207cc09 --- /dev/null +++ b/tests/folder/subfolder/include/testlib/testlib2.h @@ -0,0 +1 @@ +// Only used for presence in tests diff --git a/website/docs/os/os.findheader.md b/website/docs/os/os.findheader.md index dada8efa28..4e85c57131 100644 --- a/website/docs/os/os.findheader.md +++ b/website/docs/os/os.findheader.md @@ -6,14 +6,21 @@ p = os.findheader("headerfile" [, additionalpaths]) ### Parameters ### -`headerfile` is a file name or a the end of a file path to locate. +`headerfile` is a file name of a file path to locate. -`additionalpaths` is a string or a table of one or more additional search path. +`additionalpaths` is a string or a table of one or more additional search path. The paths may be absolute or relative. If the path is a relative path, it is relative to each of the default search paths. ### Return Value ### The path containing the header file, if found. Otherwise, nil. +### Example ### + +``` lua +os.findheader("event.h") -- /usr/include +os.findheader("ft2build.h", "freetype2") -- /usr/include/freetype2 +``` + ### Remarks ### `os.findheader` mostly use the same paths as [[os.findlib]] but replace `/lib` by `/include`.