diff --git a/projects/rocr-runtime/libhsakmt/CMakeLists.txt b/projects/rocr-runtime/libhsakmt/CMakeLists.txt
index 55bd945fd2..115b2926f3 100644
--- a/projects/rocr-runtime/libhsakmt/CMakeLists.txt
+++ b/projects/rocr-runtime/libhsakmt/CMakeLists.txt
@@ -37,6 +37,7 @@ else()
   set(HSAKMT_STATIC_DRM_TARGET "${HSAKMT_TARGET}-staticdrm")
 
   project ( ${HSAKMT_TARGET} VERSION 1.9.0)
+  set(BUILD_SHARED_LIBS ON FORCE)
 
   # Optionally, build HSAKMT with ccache.
   set(ROCM_CCACHE_BUILD OFF CACHE BOOL "Set to ON for a ccache enabled build")
@@ -79,7 +80,7 @@ else()
 
   ## Compiler flags
   if (UNIX)
-    set (HSAKMT_C_FLAGS -fPIC -W -Wall -Wextra -Wno-unused-parameter -Wformat-security -Wswitch-default -Wundef -Wshadow -Wpointer-arith -Wbad-function-cast -Wcast-qual -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wredundant-decls -Wunreachable-code -std=gnu99 -fvisibility=hidden)
+    set (HSAKMT_C_FLAGS -fPIC -W -Wall -Wextra -Wno-unused-parameter -Wformat-security -Wswitch-default -Wundef -Wshadow -Wpointer-arith -Wbad-function-cast -Wcast-qual -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wredundant-decls -Wunreachable-code -std=gnu99 -fvisibility=default)
 
     if ( CMAKE_COMPILER_IS_GNUCC )
       set ( HSAKMT_C_FLAGS "${HSAKMT_C_FLAGS}" -Wlogical-op)
@@ -170,8 +171,6 @@ else()
                      "src/libhsakmt.c"
                      "src/memory.c"
                      "src/openclose.c"
-                     "src/perfctr.c"
-                     "src/pmc_table.c"
                      "src/queues.c"
                      "src/time.c"
                      "src/topology.c"
@@ -182,10 +181,15 @@ else()
                      "src/pc_sampling.c"
                      "src/ais.c"
                      "src/kfdcontext.c")
+    if (CMAKE_SYSTEM_NAME MATCHES "Linux")
+      list(APPEND HSAKMT_SRC "src/perfctr.c" "src/pmc_table.c")
+    elseif (CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
+      list(APPEND HSAKMT_SRC "src/freebsd/perfctr.c")
+    endif()
   endif()
 
   ## Declare the library target name
-  add_library (${HSAKMT_TARGET} STATIC "")
+  add_library (${HSAKMT_TARGET} SHARED "")
 
   ## Add sources
   target_sources ( ${HSAKMT_TARGET} PRIVATE ${HSAKMT_SRC} )
@@ -205,6 +209,12 @@ else()
       ${CMAKE_CURRENT_SOURCE_DIR}/../runtime/hsa-runtime)
   endif()
 
+  if (CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
+    target_include_directories( ${HSAKMT_TARGET} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include/hsakmt/freebsd )
+  elseif (CMAKE_SYSTEM_NAME MATCHES "Linux")
+    target_include_directories( ${HSAKMT_TARGET} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include/hsakmt/linux )
+  endif()
+
   ## Add headers.  The public headers need to point at their location in both build and install
   ## directory layouts.  This declaration allows publishing library use data to downstream clients.
   target_include_directories( ${HSAKMT_TARGET}
@@ -392,9 +402,15 @@ else()
   if ( NOT BUILD_SHARED_LIBS)
     ## Create separate target file for static builds
     ## In static builds, libdrm and libdrm_amdgpu need to be linked statically
-    add_library (${HSAKMT_STATIC_DRM_TARGET}  STATIC "")
+    add_library (${HSAKMT_STATIC_DRM_TARGET}  SHARED "")
     target_sources (${HSAKMT_STATIC_DRM_TARGET} PRIVATE ${HSAKMT_SRC})
 
+  if (CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
+    target_include_directories( ${HSAKMT_STATIC_DRM_TARGET} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include/hsakmt/freebsd )
+  elseif (CMAKE_SYSTEM_NAME MATCHES "Linux")
+    target_include_directories( ${HSAKMT_STATIC_DRM_TARGET} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include/hsakmt/linux )
+  endif()
+
     target_include_directories( ${HSAKMT_STATIC_DRM_TARGET}
       PUBLIC
       $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
